|
|
|
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系で纏めた方が良いかもしれない
| |
|
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さん
なるほど、そういうまとめ方もあるんですね
もっと勉強する必要がありそうです
ありがとうございました
|
|