HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1027
マッキーZソートの効率の良い方法&*player等が無いと言われる11解決


マッキー

リンク

2006/10/27(Fri) 23:46:01|NO.3110

こんばんは。
以前質問しましたマッキーと言います。

前回の質問でKIMUと言う方に描画順番の方法を教えて貰ったのですが
どうもこの部分がかなりの行数になってしまい
もっと短くならないかと思って色々検索をしていたら
この描画順番の事が「Zソート」と言う名前である事がわかりました。

3Dはこれからの課題として
取り合えず2DでのZソートの下のソースより
もっと効率の良いやり方を教えて貰えませんか。
自分の作っているゲームはキャラのポジションに3つの変数を使っていて
X値、Z値で上下左右に移動して、Y値がジャンプです。
前回の質問のログからの引用ですが、こんなソースを打っていました。
宜しくお願いします。

それともう一つ質問があるのですが
自分のソースはgosubで各処理に飛んで行く部分がたくさんあるのですが
随分行数が長くなってしまい、実行を押したら
*player や *enemy が無い、とHSPに言われてしまいました。
ちゃんと書いてあるのにどうしてなのでしょうか。


repeat max kari.cnt = z.cnt kari2.cnt = number.cnt loop //ソート開始 バブルソート repeat max,1 repeat max - 1,1 if (kari.(cnt-1) > kari.cnt){ a = kari(cnt) kari(cnt) = kari(cnt-1) kari(cnt) = a a = kari2(cnt) kari2(cnt) = kari2(cnt-1) kari2(cnt) = a } loop loop //50まで repeat max switch kari2.cnt //主人公 case number.0 pos x.0,(z.0 + y.0) gcopy g.0,sx.0,sy.0,size.0,size.0 swbreak //↑ //これを.0の部分を50まで増やして同じ風に書いています。 ・・・ swend loop return



この記事に返信する


ゆちボン

リンク

2006/10/29(Sun) 14:32:10|NO.3149

>*player や *enemy が無い、とHSPに言われてしまいました。
大文字小文字が間違ってませんか?
それとも、タブインデントをしているのではないでしょうか?



マッキー

リンク

2006/10/29(Sun) 15:12:07|NO.3151

回答どうもありがとうございます。

*は全部小文字で、タブは*playerの部分は入っていません。
中身の方では一行一行の最初に全部タブが入っています。
タブを消して見ましたが結果は同じでした。

#Source file not found.[userdef.as]
の後に弾かれた*が並んでいます。



kz3

リンク

2006/10/29(Sun) 15:24:04|NO.3153

>前回の質問でKIMUと言う方に描画順番の方法を教えて貰ったのですが
>どうもこの部分がかなりの行数になってしまいもっと短くならないかと思って色々検索をしていたら
>この描画順番の事が「Zソート」と言う名前である事がわかりました。

分かっているのかどうか分かりませんが、一応確認のために、「Zソート」はソートアルゴリズムではなく、「ある値を基準にソートさせる」もので、その基準が「Z」(3Dだったら奥行き?)だから「Zソート」と呼んでいるだけですね。
(間違っていたら指摘してください。)

>取り合えず2DでのZソートの下のソースよりもっと効率の良いやり方を教えて貰えませんか。

こちらで考えた「効率の良いもの」がマッキーさんには「効率の悪いもの」の場合もあると思いますので、どこが効率悪いと思うのか、マッキーさんの考えを教えてください。

とりあえず読んでみたところ、ソートする部分に単純な間違いがあります。
よく読めば気づくと思うので、デバッグしてみてください。

repeat max switch kari2.cnt case number.0 pos x.0,(z.0 + y.0) gcopy g.0,sx.0,sy.0,size.0,size.0 swbreak //↑ //これを.0の部分を50まで増やして同じ風に書いています。
"これ"ではなく、"配列の添え字"と呼んだほうが正確に伝わりますよ。
それと添え字を50まで増やすのは間違っています。添え字0〜49で50個の要素ですね。

効率を良くするということが書くコード量を減らすということなら、repeat - switch ...で分岐している部分をrepeatの二重ループにすればいいと思います。

あと順番が逆になりましたが、唯一効率がいいと言えるのは、

repeat max kari.cnt = z.cnt kari2.cnt = number.cnt loop
この部分は

; z, number が整数配列でkari, kari2がmax分確保されている前提で memcpy kari, z, max*4 memcpy kari2, number, max*4
こっちのほうがはるかに時間効率がいいです。
実行にかかる時間は自分で計測してみてください。



マッキー

リンク

2006/10/31(Tue) 16:28:58|NO.3185

一度目の投稿はお礼を書き忘れてしまったのでこれで二度目の投稿になります。

kz3さん、とても丁寧な回答をどうもありがとうございました。
kz3さんのアドバイスのrepeatの二重ループは、下の様な感じになりましたが
これだとエラーになってしまいます。
頭が混乱して腕を組んだまま固まっています。
ソートした変数とナンバー、Y値をどう結び付けたら良いのか難しいです。

dim kari,max dim kari2,max memcpy kari, y, max*4 memcpy kari2, number, max*4 //ソート開始 バブルソート repeat max repeat max - 1,1 if (kari.(cnt-1) > kari.cnt){ a = kari(cnt) kari(cnt) = kari(cnt-1) kari(cnt) = a a = kari2(cnt) kari2(cnt) = kari2(cnt-1) kari2(cnt) = a } loop loop repeat max i = cnt repeat max if(kari.i = y.cnt){ pos x.cnt,y.cnt gmode 2 gcopy g.cnt,gx.cnt,gy.cnt,size.cnt,size.cnt} loop loop
指摘があったらドンドンお願いしたいです。

それとrepeatでやらずにmemcpyで代入するやり方は
処理スピードが全然違いました。

ラベルが弾かれる問題ですが
gosubで色んなフォルダの中のソースに飛ぶやり方自体が間違っているのでしょうか。
一つにまとめてみます。



ぷほ

リンク

2006/10/31(Tue) 23:15:07|NO.3198

>ラベルが弾かれる問題ですが

自分が以前同じ様な現象を起こした時は、全角の空白「 」をソースファイルの中に
紛れ込ませてしまった、という原因でしたが・・・・。

たとえば、

*player

の「r」の直後に全角空白とか入っていませんか?



マッキー

リンク

2006/10/31(Tue) 23:31:55|NO.3200

>ぷほさん

回答どうもありがとうございます。今、作った全ソースを見てみました。
全角スペースは見える様にしてある訳なのですが一つも見当たりませんでした。
エラーを全部コピペしてここに出して見ます。
こんなエラーが出ます。

#HSP script preprocessor ver3.1b5 / onion software 1997-2006(c)
#Source file not found.[userdef.as]
#HSP code generator ver3.1b5 / onion software 1997-2006(c)
#ラベルが存在しません [owari]
#ラベルが存在しません [player_stick]
#ラベルが存在しません [player_joudan_damege]
#ラベルが存在しません [player_gedan_damege]
#ラベルが存在しません [player_futtobi_damege]
#ラベルが存在しません [player_down]
#ラベルが存在しません [enemy_born]
hsptmp(330) : error 19 : 致命的なエラーです (330行目)

このエラーが原因でソートを試す事も出来ない状態です。

他の人達の質問を下に流してしまわない様にしばらく回答を控えます。
すいませんでした。



kz3

リンク

2006/11/1(Wed) 08:45:54|NO.3206

>gosubで色んなフォルダの中のソースに飛ぶやり方自体が間違っているのでしょうか。

バラバラのスクリプトはコンパイル対象のスクリプトにインクルードされていますか?



マッキー

リンク

2006/11/5(Sun) 23:08:49|NO.3251

こんばんは。
kz3さんありがとうございます。

>バラバラのスクリプトはコンパイル対象のスクリプトにインクルードされていますか?

はい、確かにインクルードされてます。

あれから何度も調べて見たのですが上手く行かないので
別にもう一つ最初から作り直す事にしてコツコツまた作っています。
結局何が問題だったのだか…。

ソート試し様に作ったスクリプトでは
上記のソート方法だと上手く行きませんでした。
今色々考えています。



マッキー

リンク

2006/11/5(Sun) 23:17:58|NO.3252

今ソートが出来たので追記します。
ソートやっと間違いが見つかりました。
これだと上手く行きました。

dim kari,max dim kari2,max memcpy kari, y, max*4 memcpy kari2, number, max*4 //ソート開始 バブルソート repeat max-1 repeat max-1,1 if (kari.(cnt-1) > kari.cnt){ a = kari(cnt) kari(cnt) = kari(cnt-1) kari(cnt-1) = a a = kari2(cnt) kari2(cnt) = kari2(cnt-1) kari2(cnt-1) = a } loop loop
後はラベルが弾かれる問題が何とかなれば…。

全角スペースもインクルード忘れも無かったのですが
何が原因だったのでしょうか…。



naznyark

リンク

2006/11/6(Mon) 00:34:35|NO.3253

> 後はラベルが弾かれる問題が何とかなれば…。

#global が無いか書き間違えてるか、モジュール名が長すぎるか、のような気はする・・・。



マッキー

リンク

2006/11/6(Mon) 01:05:22|NO.3254

>naznyarkさん
回答ありがとうございました。

仰る通りインクルードしたソースの一つのファイル名が長かったみたいです。
良く見たらこんな一行があり

#include"data/enemy/_enemy_routine_sekkin.hsp"
思考ルーチンを考えようとして途中で放り出していた部分なのですが
そこだけコメントアウトしたら実行出来ました!

問題が全部解決しました。

>ぷほさん
>ゆちボンさん
>kz3さん
>naznyarkさん

皆さんどうもありがとうございました。

PS.
スレッドの文章の間違い
KIMUと言う方⇒KIMUさんと言う方
でした。何故か呼び捨てになっていました。すいませんでした。

それじゃ今日は寝て、また明日から頑張ります。



ONION software Copyright 1997-2023(c) All rights reserved.