トピック
こう subwars

質問:SPANIM関連

画像のプログラムで 敵を撃沈した際に次の3つをさせたいのですが 上手く行きません。どうしたら良いですか? 1.撃沈されると沈んでいく(SPANIM) 2.同時に色を暗くする(〃) 3.一定フレーム沈んだら爆発&消滅する 2/3はまだしも1が上手くいかない……
2そうだね
プレイ済み
返信[1]
親投稿
みむ*mim hidemimtp
’----撃沈 IF GEKICHIN(SP) THEN  SPVAR SP,0,1 ’処理フラグを1に  SPANIM SP,"XY+" ,-120,0,32 ,1 ’2秒で32ドット沈む  SPANIM SP,"C" ,-120,#BLACK ,1 ’2秒で黒にする ENDIF ’----爆発 IF SPVAR(SP,0)==1 && !SPANIM(SP) THEN ’撃沈アニメが終わってたら  SPVAR SP,0,2 ’処理フラグを2に  SPANIM SP,"I" ,~~爆発~~ ,1 ENDIF ’----消滅 IF SPVAR(SP,0)==2 && !SPANIM(SP) THEN ’爆発アニメが終わってたら  SPCLR(SP) ENDIF
0そうだね
プレイ済み
返信[2]
親投稿
こう subwars
VARの部分二次元配列にしても大丈夫ですよね? 課題終わったらやってみます
0そうだね
プレイ済み
返信[3]
親投稿
みむ*mim hidemimtp
VARを2次元配列?? よく分かりませんが色々試してみてくださーい。
0そうだね
プレイ済み
返信[4]
親投稿
こう subwars
質問です 上のIF文例にある &&!って何ですか?
0そうだね
プレイ済み
返信[5]
親投稿
みむ*mim hidemimtp
あ、すみません、今間違いに気付きました。 IF SPVAR(SP,0)==1 && !SPANIM(SP) THEN  ↓ IF SPVAR(SP,0)==1 && !SPCHK(SP) THEN (消滅の方も同じく) で、 &&!ではなく、!SPCHK(SP)がセットです。 「!」は否定形で、 SPCHK(SP)だと、「SPANIMしていたら」ですが、 !SPCHK(SP)だと、「SPANIMしていなかったら」という意味です。 撃沈アニメが終わったら爆発アニメ、 爆発アニメが終わったら消滅、と順番に処理させる訳です。
0そうだね
プレイ済み
返信[6]
親投稿
こう subwars
そんな使いかたがあったのか...... 今までフレーム数取得してどうにかしようとして 失敗してました 配列うんぬんは SPVARに代入する代わりに 配列変数に入れようとしてるだけです
0そうだね
プレイ済み
返信[7]
親投稿
みむ*mim hidemimtp
あー、なるほど。 SPSETの時点でSP自体に配列を持っているようなものなので、それを使えばメモリを節約できますけど、どちらでもいいと思います。 SPFUNCが使えるようになればフラグすら不用になりますけどね。 またどこかに書きますね。
0そうだね
プレイ済み
返信[8]
親投稿
こう subwars
メモリの節約はしなきゃなんですけどね...... 現状newでさえ60fps切る時がありますから......
0そうだね
プレイ済み
返信[9]
親投稿
みむ*mim hidemimtp
動作が遅いのは、動いていないものを毎ループ再描画したりしているのが原因である可能性もありますけどね。 スコアとか自機とか・・・
0そうだね
プレイ済み
返信[10]
親投稿
こう subwars
常に変動する数をSPANIMに使ったのですが もしかしてSPANIM実行開始時点の数しか 代入されないのでしょうか
0そうだね
プレイ済み
返信[11]
親投稿
こう subwars
↑936行です 画面とマップの相対座標を 代入したかったのですが……
0そうだね
プレイ済み
返信[12]
親投稿
みむ*mim hidemimtp
部分的過ぎて何が何やら・・・
0そうだね
プレイ済み
返信[13]
親投稿
こう subwars
ちょっと急ぎだったもんで(^^;)
0そうだね
プレイ済み
返信[14]
親投稿
こう subwars
現状だと、敵撃沈の際に自機が止まっていれば 真下に沈んでいくのですが、自機が動いて いるとそれが上手くいきませんでした。 ↑のコメントの画像のように修正したものの 効果はなく、お手上げの状態です
0そうだね
プレイ済み
返信[15]
親投稿
みむ*mim hidemimtp
あ、文を読んで今分かりました。 そうです、変動する数は評価されません。SPANIM実行時の値のみが有効です。
0そうだね
プレイ済み
返信[16]
親投稿
こう subwars
そうか…… 解決策ありますかね? SPANIM連続実行しようもんなら処理落ち待ったなし SPOFSでもいけなくはないだろうけど 複数同時に倒したときとかは処理が不安です
0そうだね
プレイ済み
返信[17]
親投稿
みむ*mim hidemimtp
SPANIMは連続実行しちゃダメです・・・・ SPFUNCを使うと色々便利ですよ。 想像されているものか分かりませんが、SPFUNCの使用例です。 EKCYA3L4
0そうだね
プレイ済み
返信[18]
親投稿
こう subwars
いまいち何やってるか…… OFSでやってみました ↑のキーからXY座標のANIM消して、 一部を画像のように修正したところ Illegural function call。555行の SPOFS:1がエラーって……何が?
0そうだね
プレイ済み
返信[19]
親投稿
こう subwars
↑キー出しました 555行周辺のコメントを外すとエラーはきます
0そうだね
プレイ済み
返信[20]
親投稿
みむ*mim hidemimtp
す、すごいの作ってるんですね・・・ でもこれくらいで画面がチカチカするのはおかしいです。 コメントはずしてもエラーが再現しなかったので想像ですが、SP系のIllegal~は、SPSETされていない番号に対してSP系命令を出した場合が多いです。 552行のループ開始直後に IF !SPUSED(I+101) THEN CONTINUE を入れてみたらどうでしょうか? SPFUNCを使用しない場合は、SPUSEDは必須です。 553は書くなら「&&!」ではなく「&& !SPCHK(~」ですよ。
0そうだね
プレイ済み
返信[21]
親投稿
みむ*mim hidemimtp
「SPUSEDは必須」は言い過ぎでした。SPの番号と数が固定だったり増えるだけであれば不要です。事故防止用に書いておくのも策ですけど。
0そうだね
プレイ済み
返信[22]
親投稿
こう subwars
再現されない……? 555、556のコメント解放したら そのままステージ2選択してください エラります
0そうだね
プレイ済み
返信[23]
親投稿
みむ*mim hidemimtp
エラー後、 ?I 30 ?SPUSED(I+101) 0 ですので、存在のないSP番号にSPOFSしてますね。
0そうだね
プレイ済み
返信[24]
親投稿
こう subwars
帰ったらもっかいキー更新します もし時間があればでいいのですが FUNCを使って書いてみては頂けませんか? ちなみに ENE[○○,0]== 1 ;生存 ENE[○○,0]== 0 ;死亡アニメーション ENE[○○,0]==-1 ;消去 です
0そうだね
プレイ済み
返信[25]
親投稿
こう subwars
存在しないものにOFS……? その下の生存機移動は同じ構文で可能、 死んでもSPCLRはしていないのに存在しない…… 何が何やら……
0そうだね
プレイ済み
返信[26]
親投稿
こう subwars
何でだかしらないけど 撃沈アニメっぽいものは出来ました ただ、今度は撃沈した敵が消えなくなり…… どうやら寝たバグを起こしたようです
0そうだね
プレイ済み
返信[27]
親投稿
みむ*mim hidemimtp
昨日公開したのがSPFUNCで書いた例ですよ。 SPSETする時は空き番号を自動的に割り当てるようにします。 (公開PGの4行目) そして6行目ですが、 こうさんのプログラム内でいえば、 敵が出現してSPSETした時にENE[○○,0]=1 していると思いますが、それを、 SPFUNC oo,"ENE_MOVE"に。 そしてメインループに「CALL SPRITE」とだけ記載します。 これによって、このように設定したSPは全て「DEF ENE_MOVE」に勝手に飛ぶようになります。
0そうだね
プレイ済み
返信[28]
親投稿
みむ*mim hidemimtp
「DEF ENE_MOVE」には移動処理と、爆破されたらSPANIMとSPFUNC oo,"SP_CLR"を実行します。(公開PGの17~19行目) (これにより、このSPはENE_MOVEには飛ばす、SP_CLRに飛ぶようになる) 「DEF SP_CLR」には、アニメが止まった(!SPCHK(oo))ら、SPCLR oo する処理を書いておきます。(公開PG33行目~)
0そうだね
プレイ済み
返信[29]
親投稿
こう subwars
DEFの自作命令を呼び出すのとは何が違うのですか?
0そうだね
プレイ済み
返信[30]
親投稿
みむ*mim hidemimtp
自作を呼び出すなら、1つ1つ呼びますよね。 FOR I=o TO 511 IF SPUSED(I) && ENE[oo,0]==1 THEN ENE_MOVE I みたいに。 でもSPFUNCは SPFUNC oo,ENE_MOVE としておけば、「CALL SPRITE」された時に、一斉に実行されます。 で、それだと「DEF ENE_MOVE」内でのSP番号が分からないので、 SP=CALLIDX みたいなのを最初に書くわけです。 で、そのSPに対して処理すれば、ENE_MOVEに飛ぶべきSPキャラ全てに対して同じ処理が行われます。
0そうだね
プレイ済み
返信[31]
親投稿
みむ*mim hidemimtp
シンプルにしてみました。
0そうだね
プレイ済み
返信[32]
親投稿
みむ*mim hidemimtp
敵が出現してSPSETした時にSPFUNCも設定をして、 「CALL SPRITE」を実行したときに毎回ENE_MOVEの処理(移動&撃沈チェック)を繰り返させます。 撃沈されたら、APANIMしつつ、「CALL SPRITE」の飛び先をENE_MOVEからSP_CLRに変更します。 SP_CHKを繰り返し、ANIMが終わったらそのSPを開放します。(SPFUNCの内容も消えます)
0そうだね
プレイ済み
返信[33]
親投稿
こう subwars
はー…… やっと何となく理解 とりあえずOFS版のキー:ZK2438QV
0そうだね
プレイ済み
返信[34]
親投稿
みむ*mim hidemimtp
おお、海上の敵が消えない以外はちゃんと動いてるっぽいですね。 沈没だけして黒くならず攻撃を続ける時があるみたいですが・・・沈没中に攻撃しちゃったからかな? それにしても細かいところまで作りこんであってスゴイですね。
0そうだね
プレイ済み
返信[35]
親投稿
こう subwars
FUNCじゃないけどこんな感じでしょうか スタッフロール見たら分かりますが 俺はメインプログラムを担当していません いろんな方に協力して作ったメインを 改造して公開してるだけです
0そうだね
プレイ済み
返信[36]
親投稿
みむ*mim hidemimtp
全体を見ていないので何ともいえませんが、パッと見でおかしい感じはないですし、敵が増減しないならSPFUNCでなくてもいいと思います。 559~566だけまとめられそうだったのでまとめてみました。
0そうだね
プレイ済み
返信[37]
親投稿
こう subwars
現状こんな感じです
1そうだね
プレイ済み