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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0130
名無しゲームのアニメーションの管理5解決


名無し

リンク

2013/1/30(Wed) 22:11:08|NO.52111

ゲームでプレイヤーのアニメーションを作っています
今はこんな感じのスクリプトになっています


x = 100 : y = 300 speed = 5 dir = 0 dim anim, 4 anim(0) = 0 anim(1) = 0 anim(2) = 0 dim frame, 3 frame(0) = 0 frame(1) = 0 frame(2) = 0 *main stick key, 1+4+8 gosub *calc gosub *draw await 16 goto *main *calc if key & 4 : x += speed : dir = 0 if key & 1 : x -= speed : dir = 1 return *draw redraw 0 color 255, 255, 255 : boxf ;立ちアニメ pos x, y if dir = 0 : gcopy 2, anim(0), 0, 26, 43 if dir = 1 : gcopy 2, anim(0), 48, 26, 43 frame(0) = frame(0)+1 if frame(0) >= 0 : anim(0) = 0 if frame(0) >= 10 : anim(0) = 43 if frame(0) >= 20 : anim(0) = 86 if frame(0) >= 100 : anim(0) = 129 if frame(0) = 110 : frame(0) = 0 ;しゃがみアニメ if key & 8 : dir = 0 : gcopy 2, anim(1), 93, 26, 43 if key & 8 : dir = 1 : gcopy 2, anim(1), 138, 26, 43 frame(1) = frame(1)+1 if frame(1) >= 0 : anim(1) = 0 if frame(1) >= 20 : anim(1) = 40 if frame(1) >= 100 : anim(1) = 80 if frame(1) >= 110 : anim(1) = 120 if frame(1) >= 120 : anim(1) = 160 if frame(1) = 130 : frame(1) = 20 ;ダッシュアニメ if key & 4 : gcopy 2, anim(2), 186, 35, 43 if key & 1 : gcopy 2, anim(2), 233, 35, 43 frame(2) = frame(2)+1 if frame(2) >= 0 : anim(2) = 0 if frame(2) >= 3 : anim(2) = 42 if frame(2) >= 6 : anim(2) = 84 if frame(2) >= 9 : anim(2) = 126 if frame(2) >= 12 : anim(2) = 168 if frame(2) >= 15 : anim(2) = 210 if frame(2) >= 18 : anim(2) = 252 if frame(2) >= 21 : anim(2) = 294 if frame(2) >= 24 : anim(2) = 336 if frame(2) >= 27 : anim(2) = 378 if frame(2) = 30 : frame(2) = 0 redraw 1 return

お手数ですがいくつか質問させて頂きます

アニメのフレームの管理はこれで問題はないでしょうか?
実際はこれできちんと動いてはいるんですが
少しごちゃついてややこしい感じがしているので
もっと効率のいい方法があれば教えて頂きたいです

ダッシュアニメなどの際にキーの右入力を解除すると立ちアニメに戻りますがこの時に
もう一度ダッシュするとさっきの中途で終わったアニメのコマから再開してしまいます
つまりダッシュアニメの5コマ目に立ちアニメに戻しもう一度ダッシュさせると
ダッシュアニメの5〜6コマ目からアニメが始まってしまいます
これをきちんと1コマ目から再開させるにはどうすればいいのでしょうか?

プレイヤーの向きについてですが今のままだと
立ちアニメとダッシュアニメはきちんとその方向に向いてくれるんですが
しゃがみアニメの場合はきちんとその方向に向いてくれません
どこがおかしいのか指摘があればお願いします



この記事に返信する


暇人

リンク

2013/1/30(Wed) 23:42:12|NO.52113

>もう一度ダッシュするとさっきの中途で終わったアニメのコマから再開してしまいます
別のアニメーションになったら変数を初期化すれば良い

>if key & 8 : dir = 0 : gcopy 2, anim(1), 93, 26, 43
>しゃがみアニメの場合はきちんとその方向に向いてくれません
↓入力判定だけしてdirの判定をしてない
代入しちゃってる


pos x, y if key_old = key {//前回の入力と今回の入力が同じ frame(0)+1 }else{//入力が変ったので初期化 frame(0) = 0 anim(0) = 0 } key_old = key//今回の入力を保存 ;立ちアニメ if key = 0 {//入力無し if dir = 0 : gcopy 2, anim(0), 0, 26, 43 if dir = 1 : gcopy 2, anim(0), 48, 26, 43 if frame(0) >= 0 : anim(0) = 0 if frame(0) >= 10 : anim(0) = 43 if frame(0) >= 20 : anim(0) = 86 if frame(0) >= 100 : anim(0) = 129 if frame(0) = 110 : frame(0) = 0 }else{//入力有り ;しゃがみアニメ if key & 8 { if dir = 0 : gcopy 2, anim(0), 93, 26, 43 if dir = 1 : gcopy 2, anim(0), 138, 26, 43 if frame(0) >= 0 : anim(0) = 0 if frame(0) >= 20 : anim(0) = 40 if frame(0) >= 100 : anim(0) = 80 if frame(0) >= 110 : anim(0) = 120 if frame(0) >= 120 : anim(0) = 160 if frame(0) = 130 : frame(0) = 20 }else{ ;ダッシュアニメ if key & 4 : gcopy 2, anim(0), 186, 35, 43 if key & 1 : gcopy 2, anim(0), 233, 35, 43 if frame(0) >= 0 : anim(0) = 0 if frame(0) >= 3 : anim(0) = 42 if frame(0) >= 6 : anim(0) = 84 if frame(0) >= 9 : anim(0) = 126 if frame(0) >= 12 : anim(0) = 168 if frame(0) >= 15 : anim(0) = 210 if frame(0) >= 18 : anim(0) = 252 if frame(0) >= 21 : anim(0) = 294 if frame(0) >= 24 : anim(0) = 336 if frame(0) >= 27 : anim(0) = 378 if frame(0) = 30 : frame(0) = 0 } }

>少しごちゃついてややこしい感じがしているので
次画像フレーム数と画像開始位置を配列に入れて
要素数にアニメーションカウンタを使って参照するようにすれば
if文を並べる必要が無くなる

後、使用する画像自体も考えた方が良いと思う
同じ大きさのチップにしてcel系で纏めた方が良いかもしれない



KA

リンク

2013/1/31(Thu) 01:01:54|NO.52114

dim anim, 4 ←これでanim(0)(1)(2)(3)は初期化される
anim(0) = 0 ←不要
anim(1) = 0 ←不要
anim(2) = 0 ←不要

dim frame, 3 ←これでframe(0)(1)(2)は初期化される
frame(0) = 0 ←不要
frame(1) = 0 ←不要
frame(2) = 0 ←不要
------------------------------------------------------
if frame(2) >= 0 : anim(2) = 0
if frame(2) >= 3 : anim(2) = 42
if frame(2) >= 6 : anim(2) = 84
if frame(2) >= 9 : anim(2) = 126
if frame(2) >= 12 : anim(2) = 168
if frame(2) >= 15 : anim(2) = 210
if frame(2) >= 18 : anim(2) = 252
if frame(2) >= 21 : anim(2) = 294
if frame(2) >= 24 : anim(2) = 336
if frame(2) >= 27 : anim(2) = 378

上は等差数列なので

repeat 10
if frame(2) < (27-cnt*3) : continue
anim(2) = (378-cnt*42)
break
loop

等にすると、すっきりします。



暇人

リンク

2013/1/31(Thu) 01:16:09|NO.52115

配列にフレーム数と画像位置を入れてカウンタ使ってアニメーションする方法

//立ちアニメ用 frame_A=10,20,100,110 anim_A=0,43,86,129 //ダッシュアニメ用 frame_B=3,6,9,12,15,18,21,24,27,30 anim_B=0,42,84,126,168,210,252,294,336,378 //しゃがみアニメ用 frame_C=20,100,110,120,130 anim_C=0,40,80,120,160
上のを*mainの前に追加

pos x, y if key_old = key {//z前回の入力と今回の入力が同じ frame+1 }else{//入力が変ったので初期化 anim_cnt=0 frame = 0 } key_old = key//今回の入力を保存 if key = 0 {//入力無し ;立ちアニメ if dir = 0 : gcopy 2, anim_A(anim_cnt), 0, 26, 43 if dir = 1 : gcopy 2, anim_A(anim_cnt), 48, 26, 43 if frame = frame_A(anim_cnt) { anim_cnt = (anim_cnt+1) \ length(frame_A) if anim_cnt = 0 {frame = 0} } }else{//入力有り if key & 5 {//1+4 ;ダッシュアニメ if key & 4 : gcopy 2, anim_B(anim_cnt), 186, 35, 43 if key & 1 : gcopy 2, anim_B(anim_cnt), 233, 35, 43 if frame = frame_B(anim_cnt) { anim_cnt = (anim_cnt+1) \ length(frame_B) if anim_cnt = 0 {frame = 0} } }else{ if key & 8 { ;しゃがみアニメ if dir = 0 : gcopy 2, anim_C(anim_cnt), 93, 26, 43 if dir = 1 : gcopy 2, anim_C(anim_cnt), 138, 26, 43 if frame = frame_C(anim_cnt) { anim_cnt = (anim_cnt+1) \ length(frame_C) if anim_cnt = 0 {frame = 20 : anim_cnt = 1}//NO.52111のがif frame(1) = 130 : frame(1) = 20となってるので } } } }
分かりやすいようにアニメーション別に配列を使用



暇人

リンク

2013/1/31(Thu) 01:20:51|NO.52116

>anim_A=0,43,86,129
43の倍数とか決まってるなら

gcopy 2, anim_A(anim_cnt), 0, 26, 43


gcopy 2, anim_cnt*43, 0, 26, 43
にできる



名無し

リンク

2013/1/31(Thu) 02:12:19|NO.52117

>>暇人さん
出来ました!ありがとうございました
何日も試行錯誤していたので本当に助かりました
配列にフレーム数と画像位置を入れて
管理する方法も試してみようかと思います
こっちの方がすっきりまとめられそうですね
他のアドバイスも参考にさせてもらいます

>>KAさん
なるほど、そういうまとめ方もあるんですね
もっと勉強する必要がありそうです
ありがとうございました



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