トピック
nobu divine-creator

スプライトの交替方法について

これまでスプライトの交替は、主にSPCHRを使ってきましたが、今回の交替に適した方法があるのか?尋ねてみることにしました。 SPCHRによる交替はスプライトの位置や大きさを保ったままできるので大変便利ですけど、他にも良い方法があるのか?が気になりました! 今回行いたい交替は、ランダムに選ばれたスプライトと特定のスプライトの位置を入れ替えるというものなので、2つのスプライトの位置を交換するという動きになります! その際に、スプライトの位置が入れ替わるだけでなく、タッチした後に続く部分も入れ替わる必要があります! なので、スプライトの位置と続く操作を連動して交換するのに適したプログラムが必要なのですけど、どんな感じにしたら良いと思われますか?
2そうだね
プレイ済み
返信[1]
親投稿
すぎ field2050
位置を動かすアニメーションなど連動する内容によってはダメな気もしますが、SPOFSのOUTを使って2つの座標を求めて、入れ替えるというのはどうでしょうか?
2そうだね
プレイ済み
返信[2]
親投稿
みむ*mim hidemimtp
SWAP X1,X2 SWAP Y1,Y2 だとだめなのかな?
2そうだね
プレイ済み
返信[3]
親投稿
nobu divine-creator
実は、自分で考えてみた方法があったのですけど、それを先に書いてしまうと、「それで良いんじゃない?」という回答で終わってしまうかもしれない…と考え、先入観無しの御意見を聞きたいと思いました♪ それで、まず移動のアニメーションは使わないということをお伝えします。 そして、私が作ろうとしているのは70個の四角いスプライトを10×7に並べて、プレイヤーがタッチした結果を判定するというゲームで、上下の画面には同じスプライトが同じ並びで表示されているというものです。スプライトの交換は2周目以降に必要となります! (次のコメントへ続きます!)
0そうだね
プレイ済み
返信[4]
親投稿
nobu divine-creator
私が考えていた方法はSWAPを使い、2つの変数を入れ替えるという方法でしたが、みむさんが書かれたのは座標を入れ替える方法でしょうか? 変数2=RND(70)+1 SWAP 変数1,変数2 …という形式にした場合、ランダムに選ばれた変数2と変数1の数値が入れ替わりますよね? ただ、この場合は表示されるスプライトが変わるだけで、判定が変わるわけではありません! そこで、判定は別に行わなければならないのですが、 IF 変数==数値 THEN 当たり♪ IF 変数==数値 THEN 惜しい! IF 変数==数値 THEN ハズレ…orz。 …のようにすれば良いのでしょうか?簡略化して書いていますが、実際は惜しいやハズレには複数の数値が該当します。 (あと少しだけ続きます!)
0そうだね
プレイ済み
返信[5]
親投稿
nobu divine-creator
本当は、全てのスプライトをランダムに入れ替えるようにしたいのですが、当たりの位置を変えるだけでも充分な効果が得られるので、今作は2つの位置を入れ替えるだけでも良いと考えています♪ 上に書いたような方法でも問題が無ければ、その形式で正常に動くことを目標にしたいと思います! もし何か問題がありそうなら、アドバイスをよろしくお願いします。 ちなみに、全てのスプライトをランダムに入れ替えるのは難しいですか?
1そうだね
プレイ済み
返信[6]
親投稿
みむ*mim hidemimtp
何度読んでもやろうとされている事が見えません・・・ SPCHR→見た目だけ交換、内容はそのまま SWAPで座標入れ替え→見た目も内容も入れ替え なのですが、どうなるのがやりたい動作なんでしょう? SWAPで書かれている例がよく分かりませんが、私が書いたのは、  SPOFS SP1 OUT X1,Y1  SPOFS SP2 OUT X2,Y2  SWAP X1,X2  SWAP Y1,Y2 という意味です。SP1はタッチしたスプライト、SP2は交換対象(ランダムならRND(70)かつSP1とは別の番号)
1そうだね
プレイ済み
返信[7]
親投稿
nobu divine-creator
スプライトの交換はタッチ操作ではないです!タッチが関係しているのは、当たりかハズレかの判定で、交換はタッチ操作の開始前に、自動的に行われます。 上のSWAPの例は、 SWAP 当たりの数値が入った変数,ランダムに選ばれた数値が入った変数 という感じで入れ替えるということです。 SWAPで変数を入れ替えた後に、SPOFSなどを使えば、入れ替わった位置に表示されるわけですよね? そして、入れ替わった当たりがある位置をタッチされたら、正しく判定されれば、目的通りとなります♪ まだ入力が済んでいないので、実際にどうなるのかは確認できませんが、このような方法では上手くいきませんか?
0そうだね
プレイ済み
返信[8]
親投稿
すぎ field2050
ひとつランダムに入れ替えができれば、全てというのはそれを繰り返して多めに入れ替えればできます。
0そうだね
プレイ済み
返信[9]
親投稿
nobu divine-creator
確かに、入れ替えの複数形が全入れ替えなので、そうですね…。 でも、たぶん当たりの位置をランダムに変えられれば、充分当てられなくなるので、一つだけ入れ替えられれば大丈夫なはずです♪ ハッΣ(゚Д゚)!まさか、すぎさんは瞬間記憶能力者?!だったら、バラバラに入れ替えなきゃ……って、そんな能力者は多くないはずだから大丈夫でしょう♪
1そうだね
プレイ済み
返信[10]
親投稿
みむ*mim hidemimtp
想像ですが、マインスイーパーのような面の「バクダン探し」をする感じでしょうか?で、見つけたら場所が変わってまた見つけて・・・を1分間に何回見つけられるか、みたいな? もしそうだったら、SPを入れ替えなくても正解の値(10x7の座標)を別に持たせるとか、SPVARの値を正解だけ1にするとかのやり方もあると思います。
1そうだね
プレイ済み
返信[11]
親投稿
nobu divine-creator
想像されているようなものとは違うのですが、1つだけの正解を見つけるという意味では合っていると思います♪でも、スプライトの移動は必要なので、入れ替える命令は使わなければなりません。 SPVARというのは内部変数ってやつですね!最近、公式ムックで読んだのですが、どう活用したら良いか分からなくて、使うのをあきらめていました…。 0~7まであるというのは分かるのですけど、実際にどんな使い方をすれば良いのか?難しくて困りました…(´・ω・`)。
1そうだね
プレイ済み
返信[12]
親投稿
みむ*mimさんの言っているのはスプライトの見た目が変わらないのであれば実際にスプライトは入れ替えずに当たり対象となるスプライト番号を変えるだけでも実現出来るのではないか? という意味だと思います。 SPVARはスプライトに付随する自由に使える変数だと思っておけばいいと思いますが、使い道が分からない(難しい)のであれば、とりあえずは考えなくてもいいと思います。(もちろん使いこなせれば便利なのは間違えないですが)
0そうだね
プレイ済み
返信[13]
親投稿
nobu divine-creator
ハイ、スプライトの見た目が重要なので、位置の変更は必須です! SPVARは使えたら良いのですけど、使い方が分かりません…orz。 でんぺんさんのおかげでスプライトの基本は理解できましたけど、内部変数のような応用はまだ理解できていません…(>_<)。
0そうだね
プレイ済み
返信[14]
親投稿
見た目が変わったら正解がすぐに分かっちゃうかとも思ったけど、見た目の違うたくさんの中から指定された正解(見た目)を見つける感じなのかな? それなら入れ替え必須ですね。始め神経衰弱みたいなのをイメージしていたので見た目の変化はないのかと勘違いしていました。 だったら始めのみむ*mimさんの例のように、変数SP1とSP2の管理番号をスプライトを入れ替えるなら、 SPOFS SP1 OUT X1,Y1:SPOFS SP2 OUT X2,Y2 SWAP X1,X2:SWAP Y1,Y2 SPOFS SP1,X1,Y1:SPOFS SP2,X2,Y2 で入れ替えられますよね。 ちなみにSPVARは必ずしも使えばいいというものでもないので説明しづらい部分もあるんですよね。そのうちなんか例でも作ってみるかなぁ…。
0そうだね
プレイ済み
返信[15]
親投稿
nobu divine-creator
そういえば、SWAPで入れ替えるのって、X座標とY座標じゃないとダメなのですか? SWAPでスプライトの番号を入れる変数を入れ替えて、SPOFSで入れ替えたスプライトの番号を移動させれば、位置が交換されるようにはならないのですか? 例えば、A=1:B=2として、 SPOFS A(1),1,1:SPOFS B(2),2,2を、 SWAP A,Bで入れ替えると、 SPOFS A(2),1,1:SPOFS B(1),2,2となるんじゃないのですか?
0そうだね
プレイ済み
返信[16]
親投稿
ちょっと勘違いしているみたいですね〜。 変数の中身を入れ替えてもあくまで入れ替わるのは変数の中身だけなのでスプライトとは無関係ですよ。スプライトを操作するにはSP〜(なんちゃら)系の命令を使って操作する必要があります。入れ替えをよく使うなら以下のような命令を用意して、 SPSWAP 1,2 のようにすれば管理番号1と2のスプライトの位置を入れ替える事が出来ます。 DEF SPSWAP SP1, SP2 VAR X1,Y1,X2,Y2 SPOFS SP1 OUT X1,Y1:SPOFS SP2 OUT X2,Y2 SWAP X1,X2:SWAP Y1,Y2 SPOFS SP1,X1,Y1:SPOFS SP2,X2,Y2 END
1そうだね
プレイ済み
返信[17]
親投稿
みむ*mim hidemimtp
そのSWAPをするなら、座標とSP番号を管理するやり方になると思います。 DIM SP[10,7] SP[0,0]=1 SP[0,1]=2 みたいに持たせておいて、 SWAP SP[0,0],SP[0,1] のようにするのもやり方の一つです。 (1次配列で「DIM SP[70]」でもいいと思いますが) そういえば私のプロフにある「ANIPUZ」(ジグソーパズルみたいなの)はこのやり方をしてたと思います。
0そうだね
プレイ済み
返信[18]
親投稿
nobu divine-creator
変数の中身がスプライトの番号であっても、無意味なんですか?Σ(゚Д゚)! じゃあ、SWAPって何なのでしょう…?スプライトの交換には向かない命令ですか? 上のユーザー定義命令では、ランダムに選ばれたスプライトとの位置交換も可能なのでしょうか? ランダムに選ばれたスプライトの位置は、当然ながらそれぞれ違いますので、選ばれたスプライトの位置に合わせて交換しなければならないのですけど…?
0そうだね
プレイ済み
返信[19]
親投稿
すぎ field2050
簡単なものから作ってみてはどうでしょうか? 情報としては必要なものがそろっている気がします。 スプライト2つ並べて、でんぺんさんの作成した関数に引き渡すだけで入れ替えできます。スプライト70枚並べてやるならば、みむ*mimさんの説明のような配列を使って管理しないと難しくなります。
0そうだね
プレイ済み
返信[20]
親投稿
みむ*mim hidemimtp
私の「そのSWAPをするなら~」はnobuさんのレスに向けてのレスですのでお間違えなく~。
0そうだね
プレイ済み
返信[21]
親投稿
SWAPはもともとスプライトとは無関係の命令ですよ。そして変数の中身がスプライト番号であっても、それ自体はスプライト自体とは無関係で、自分がスプライト番号として管理している変数というだけですね。 SWAPは本来AとBの変数を入れ替えようと思ったら、 T=B:B=A:A=T のようにTという一時的な変数を利用して入れ替えなければいけないのをまとめてやってくれる便利な命令的な感じですね。 上で作ったユーザー定義命令は、ランダムで選ばれたスプライトでも使えます。SPSWAPの第1引数と第2引数の管理番号のスプライトを入れ替えるので、その番号がランダムなら出来ますよ。 作った命令は選ばれたスプライトの位置を交換するためにOUT命令で今の位置を取り出して、それを交換してからセットすることで2つのスプライトを入れ替えているわけなので。
1そうだね
プレイ済み
返信[22]
親投稿
nobu divine-creator
あっ!正しくできているのか分かりませんけど、みむさんが書かれたような2次元配列を使っています♪ [0,0]を1にして、[9,6]が70となるように設定していました!今回の場合はそうするのが良いと思っていたので…。 それと、でんぺんさんが書かれたユーザー定義命令を組み合わせれば良いのですかね? 例えば、SWAPで[0,0]と[0,1]を入れ替えても、スプライトの位置が入れ替わるわけじゃないんですよね? 変数の入れ替えと、スプライトの入れ替えの関係がまだよく分かっていませんが、SPCHRの入れ替えとSWAPの入れ替えは異なるということでしょうか?
0そうだね
プレイ済み
返信[23]
親投稿
すぎさんも言われているように必要な情報は揃ってそうな印象ですね〜。 SPCHRはスプライトに割り当てている絵を切り替える命令なので、スプライトの入れ替えとは異なります。SPSWAPは絵を切り替えているんじゃなくてスプライト自体の位置を変更しています。 おそらく管理番号と定義番号に絡むスプライトの仕組みを少し勘違いしているか、もしくはうろ覚えなのかなと言う印象を受けますね〜。 言われているようにSWAPで[0,0]と[0,1]を入れ替えても、その変数の中身が入れ替わるだけでスプライトとは無関係です。なのでスプライトにも反映させたかったら、その入れ替えた内容によって変更する必要があって、それが位置の入れ替えで済むのであれば僕の作ったSPSWAPでも実現出来ると思います。
1そうだね
プレイ済み
返信[24]
親投稿
nobu divine-creator
SWAPが変数を交換するだけの命令なのは理解していましたが、それでスプライトの番号を交換すれば良いのかな~?…と考えていました。 いろいろな操作を実現するためには、複数の命令を正しく組み合わせて使えないとならないんですね…。 今回SWAPや2次元配列に初めて挑戦していますが、新しいことをしようとすると、なかなか難しくて苦労しますね…orz。 高度な命令を使いこなしている人達は、本当に凄い!と思います♪私がプログラミングに向いていない…というのは、こういう時に実感します…(´・ω・`)。
0そうだね
プレイ済み
返信[25]
親投稿
みむ*mim hidemimtp
2次元配列を使っていて、その要素番号([]内の数値)を元に10x7の形にSPOFSされているのであれば、 SWAP SP[0,0],SP[0,1] で、もちろん位置も中身も入れ替わりますよ。
0そうだね
プレイ済み
返信[26]
親投稿
ちょっとみむさんの発言を勘違いしないように補足すると、2次元配列の内容によってスプライトを配置する前であれば配列をSWAP SP[0,0],SP[0,1]で位置も中身も入れ替わります。(正確には中身に合わせてスプライトを配置しているので) ただ一度配置した後だと配列の中身を入れ替えたら勝手にスプライトの位置が変わるわけではないので、やっぱり自分でスプライトの位置も入れ替える必要があります。念のため〜。
2そうだね
プレイ済み
返信[27]
親投稿
nobu divine-creator
あれ?そーなんですか?! 何故2次元配列だと、SWAPだけで入れ替えることができるのでしょう? う~ん…。2次元が位置を表しているからでしょうか? エラーが発生しない状態に正しく入力ができたら、ハッキリ結果が見えて思ったようにできているのか分かりますけど、それは明日にならないと無理ですね…。
0そうだね
プレイ済み
返信[28]
親投稿
みむ*mim hidemimtp
2次元配列だから、ではないです。 私の書いた「要素番号([]内の数値)を元に10x7の形にSPOFSされているのであれば」の話です。 FOR J=0 TO 6  FOR I=0 TO 9   SPOFS SP[I,J], I*16, J*16  NEXT NEXT のようにして画面表示いるのであれば、入れ替わるという意味です。 スプライト毎に座標の変数を持たせているなら、ただSP番号だけSWAPしてもダメですよ。 ・・・文章で説明するとこんがらがりますね。 もう一度ご自身で整理して考えてみられた方が、自己解決できるかも。
2そうだね
プレイ済み
返信[29]
親投稿
nobu divine-creator
あれから、まず自分が入力していた形式を見直してみたら、みむさんが書かれた2次元配列をバラバラにした状態で入力していたことが分かり、それをまとめて簡略化できました♪ その後、ここまでに教わったことを参考に、大幅な改良を加えていった結果、かなり完成に近づけました♪ しかし、大きな問題も残っています!上下の画面にスプライトを全く同じ並びで表示しなければならないのですが、その方法が分かりません…orz。 上画面への表示はできるのですが、同じスプライトを下画面にも表示するには、どうしたら良いのでしょうか? それと関連した命令に、GPAGE,GCOPYなどがありますけど、それらの上手な使い方が分からなくて困っています…(´・ω・`)。もちろん、今回の目的に使わない命令はとりあえず後回しでも構いませんが、「上下の画面に、全く同じスプライトを同じ並びで表示する方法」を詳しく教えてください!
0そうだね
プレイ済み
返信[30]
親投稿
みむ*mim hidemimtp
それは手動になりますね・・・ あと、XSCREENが2or3か、4を使っているかにもよります。 その10x7だけのスプライトをコピーするとして、 上画面でSP1~70番を使っているなら、 XSCREEN2,3なら上下でスプライト設定は別々なので、 下画面のSP1~70番に「SP~」で設定した内容を下画面用にコピーすればOK。 DISPLAY命令で処理する画面を切り替えて処理します。 XSCREEN4ならスプライト番号は共用なので、 下画面用にはSP101~170を使う、などパターンを決めて、 同様にSP~の内容をコピーしていけばOKだと思います。 ただし下画面のY座標は、上画面のY座標+240にして。 初期設定は↑でできますが、ゲーム中にキャラの種類や位置が変わる場合は、毎回両方のスプライトを変化(SP~の命令を2回実行)させないとダメですよ。
0そうだね
プレイ済み
返信[31]
親投稿
nobu divine-creator
XSCREENは2なので、同じ形式の命令を使うということになりますね♪ そこで、問題になるのが下画面のサイズなのですけど、下画面は左端と上端が少し使えないのは、どのように処理しますか? 特に、2次元配列の部分をそれに対応させようとしたら、エラーになってしまいました…orz。(SPOFSの座標に数値を足してズラそうとしたら、失敗しました…!) ちなみに、画像の左右のサイズは下画面ちょうどギリギリにしているので、少しだけ右端が欠けるのは仕方ないのでしょうか?(上下には余裕があるので、位置をズラしても問題ありません♪) 全てのスプライトのサイズを細かく変えるのは大変なので、右端が少し欠けても構いません!
0そうだね
プレイ済み
返信[32]
親投稿
みむ*mim hidemimtp
あ、そうだ、XSCREEN 2ならX座標が違ってきますね。 上画面が基準なら、下画面ではX-40しないと合いませんね。 ただ、SPOFSでの座標がマイナスになっても表示されないだけでエラーにはなりません。エラーはそれ以外の何かが原因ですね。 下画面は横320ドットですから、上下同じにするなら、上画面での表示をそれ以内(座標でいうと40~359)に収めておく必要がありますねー。
0そうだね
プレイ済み
返信[33]
親投稿
nobu divine-creator
上画面と下画面の横幅の差については、大喜利用作品で研究していたので、この作品では最初からそれを考えた作りにしていました♪ ただ、上下の画面を全く同じ表示にするのは、今作が初めてだったので、その部分に苦労しました! なるほど、上下の表示が同じに見えるのは外見だけで、実際に表示されているのは、全く別の定義番号や変数のスプライトだったのですね♪ それを同じスプライトで表示しようとしていたため、エラーになっていたわけですか!ようやく、その表示方法が理解できました♪ 上のコメントで書いた「端が使えない」のは、タッチ操作の有効範囲の話でした!表示とは別の話ですね…。混同していました…済みません<m(_ _)m>。
1そうだね
プレイ済み
返信[34]
親投稿
すぎ field2050
xscreen2で上下に同じスプライト番号つかえるのか確認してみると使えるんですね。勉強になりました。ついでに入れ替えまで作ってみたのでコメ残し。
0そうだね
プレイ済み
返信[35]
親投稿
nobu divine-creator
すぎさん、ありがとうございます♪でも、もう別の方法で作ってしまった後だったので、その方法は別の機会に使用するかもしれません。 それで、もう分かってしまっていたかもしれませんけど、これが新作ゲーム「LFP(プチ子を探せ)!」です♪ たった1つの本物見抜く迷探偵プチコナンでもなかなか当てられない本物探しゲームです! 個人的には、わざと明らかに違う顔を選んでみてほしいです♪(何回ミスしても良いので…。) 公開キーは【55WEVNKE】です!感想を聞かせてください♪
1そうだね
プレイ済み
返信[36]
親投稿
すぎ field2050
ここではコメントした方しかわからないので、新しくプレイ日記で発表してみてはどうですか?作り方は十人十色、自分にとってわかりやすい方法でいいと思います。丁寧につくってますね。 完成おめでとうございます。
1そうだね
プレイ済み
返信[37]
親投稿
nobu divine-creator
こちらへ先に投稿したのは、このソフトを作るのに協力していただいた人達にお知らせするのが先だろうという考えからです♪ それに、別の所へ投稿するだけだと、見忘れた…という場合もあるかもしれないので、まずこちらへコメントしてから、別に投稿するという方法を選びました! おかげ様で考えていた通りのゲームを作ることができました♪しばらく感想を待ってから、このトピックを終了しますが、別の投稿のほうへ感想を書かれても構いません。
0そうだね
プレイ済み