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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0302
ペス命令・関数の引数に配列を渡す時の効率の良い書き方6解決


ペス

リンク

2017/3/2(Thu) 12:07:55|NO.78345

こんにちは。
命令・関数の引数に配列を渡す時の効率の良い書き方について教えてください。


命令や関数の引数にint配列を指定する場合、普通のやり方は、
予め配列変数として宣言した変数の要素に数を代入したものを指定すれば良いというのは当然わかるんですけど、
別の言語でいうところの

new Integer[1,2,3]

的なものを求めているんですが、HSPにはありませんよね? 無ければ、マクロとか関数で自分で作りたいんですが、全然イメージできません。 分かる方、ぜひ教えてください!



この記事に返信する


HIJIKIsw

リンク

2017/3/2(Thu) 21:19:28|NO.78348

すみません、何度か全文を読んだのですが、結果的に何をされたいのか、
何で困ってらっしゃるのかをあまり理解できませんでした。

別の言語で言うところの
new Integer[1,2,3]

を HSP でも使いたいとのことですが、これだけでは何をされたいのか分かりませんでした。
dim Array, 1, 2, 3
とはまた違いますでしょうか?

下記は 4 次元配列専用ですが、配列を渡す命令/関数について書いてみました。
質問の意図自体があまり理解できていないので、見当違いな内容かもしれませんが、
何かの参考になれば幸いです。


#module _TEST_ // 4 次元配列の全要素を描画する命令 #deffunc MyCommand array data pos 0, 0 repeat length(data): i=cnt repeat length2(data): j=cnt repeat length3(data): k=cnt repeat length4(data): l=cnt mes "("+i+","+j+","+k+","+l+") = "+data(i,j,k,l) loop loop loop loop return // 4 次元配列の全要素の合計値を求める関数 #defcfunc MyFunction array data Ret = 0 repeat length(data): i=cnt repeat length2(data): j=cnt repeat length3(data): k=cnt repeat length4(data): l=cnt Ret += data(i,j,k,l) loop loop loop loop return Ret #global // 渡す配列を作成 dim data, 1, 2, 3, 4 // 適当なデータを配列にセット repeat length(data): i=cnt repeat length2(data): j=cnt repeat length3(data): k=cnt repeat length4(data): l=cnt data(i,j,k,l) = rnd(100) loop loop loop loop // 確認 MyCommand data mes "合計: "+MyFunction(data)

私の理解力、読解力が低いだけかもしれませんので、他の方の回答も待ってみてください。



ペス

リンク

2017/3/3(Fri) 10:41:15|NO.78351

説明不足で申し訳ありません。

現在自分が扱いやすい、2D簡易スプライトを作っています。
もう標準で同梱のhspDXとか3D用のスプライト管理機能が付いたものは知っています。

ですが、もっとシンプルな構成の単純なスプライトを作っていまして、

アニメーション用のパターンを指定する引数と、
生成エフェクトを指定する引数と、破棄エフェクトを指定する引数を、
全部コンストラクタで数値の配列を指定したかったんですが、
一つのスプライトの生成を1行のみで納めたかったんです。

なので、アニメパターンを変数に収めてから、newmodでその変数を指定するのでは
複数行になってしまうので、量産するコードの行数を減らす為のテクニックを求めての質問なので、
代替案の回答を避けたかったんです。

どうしても無理なら、行数が増えてもいいんですが、できれば、


newmod player, モジュール名, X座標, Y座標, アニメパターンの配列, 生成時エフェクトの配列, 破棄時エフェクトの配列

という書式でインスタンスを量産するコードを書く方向性でモジュール構成を考えています。


もし難しい様でしたら、代替案でも構いませんので、アドバイスを頂ければ嬉しいです。
よろしくお願いします。



HIJIKIsw

リンク

2017/3/3(Fri) 17:53:45|NO.78354

なるほど、概ね何をされたいのかは理解できました。
ありがとうございます。

別の言語でやるように、
コンストラクタに new Integer[1,2,3] を引数として渡したい。
という意味での質問文だったのですね。
例えるなら、下記のイメージですよね。

CreateSprite(new int[] {1,2,3,2,3})

> 一つのスプライトの生成を1行のみで納めたかったんです。

すみませんが、僕のレベルでは「文字列で渡して、受け取った側で splite する」しか思いつきません。
少し強引で堅牢性のない組み方になってしまいますが、自分専用のモジュールなのであればいかがでしょうか?


#module _SPRITE_ #deffunc MakeSprite str p1 // split で扱えるように変数化 sdim str_data str_data = p1 // データを配列に分割 dim data splitint str_data, ",", data // テスト描画 pos 0, 0 repeat length(data): i=cnt mes ""+data(i)+" : vartype = "+vartype(data(i)) loop return // [local] split 命令の int 版 (簡易版なので第 4 以降のパラメータは指定不可) #deffunc local splitint str _text, str _separator, array put, local mid sdim put: index = 0: text = _text: separator = _separator repeat: i=cnt mid = instr(text, , separator) if( mid < 0 ){ ret = cnt break } put(cnt) = int(strmid(text, 0, mid)) text = strmid(text, mid+strlen(separator), strlen(text)) loop put(ret) = int(text) return ret+1 #global MakeSprite "1,2,3,2,3,1"



HIJIKIsw

リンク

2017/3/3(Fri) 17:55:48|NO.78355

・追記
HSP の int 関数の仕様的に
渡す文字列がカンマスペースで区切られていても問題なく動作するはずです。


MakeSprite "1, 2, 3, 2, 3, 1"



ペス

リンク

2017/3/4(Sat) 00:03:15|NO.78356

HIJIKIswさんご回答ありがとうございます。
返事が遅くなってすみません。

>「文字列で渡して、受け取った側で splite する」
いいかもしれないですね。
直接newする事しか考えてなかったんですが、量産する為のスプライトマネージャー的なものを作って
そのモジュールに「カンマ区切りの文字列引数を渡してやる」
そしてスプライトマネージャーでは、渡された文字列を文字解析して、複数の配列を生成する、と。
そういう方向性でやってみたいと思います。


丁寧に対応していただきありがとうございました。
提示していただいたサンプルスクリプトはありがたく参考にさせて頂きますね。



HIJIKIsw

リンク

2017/3/5(Sun) 02:48:17|NO.78362

お役に立てて光栄です。

いまさらですが、2 点ほど修正させてください。

1 点目はどうでも良いことなのですが、私が書いた
「文字列で渡して、受け取った側で splite する」
 は
「文字列で渡して、受け取った側で split する」
の間違いでした。すみません。


2 点目は、上記スクリプトの

// split で扱えるように変数化 sdim str_data str_data = p1
についてですが、HSP 標準の split に渡すのでなければこの 3 行は不要だったので、
この 3 行を削除したのち、
deffunc を下記のように少し直してやればよりスマートにできました。

Before

#deffunc MakeSprite str p1

After

#deffunc MakeSprite str str_data

お詫びして訂正いたします。



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