アニメーション実装
敵機をクルクルアニメーションさせてみた。
DrawAnimationと言う関数を新たに追加。
アニメを簡単に表示する方法を考えたんだけど思いつかなくて、最初の方の記事で使っていたテキスト『14歳からはじめるC言語ゲームプログラミング』を調べた。
なるほどね!
よく思いつくなあと、しばし関心。
まず、1秒間に何コマアニメーションさせるかを fps とする。
1000/fps で1コマの時間が計算できる。
例えば1秒で8コマ動かすなら、1000/8で1コマの時間は125ミリ秒となる。
次にGetNowCount関数で現在の時間をミリ秒で得る。
それをさっき求めた1コマの時間で割る。
t = GetNowCount( )
とすると
t / ( 1000/fps )
って感じで。
そうすると、1コマ分の時間が経過するごとに1増える値が得られる。
これをアニメが一回りする総コマ数で割ってやる。
その余りをアニメパターンのコマ番号に使うのだ。
表示するコマ番号 = ( int )( t / (1000/fps) ) % 総コマ数
計算は割り算で小数になることもあるので、変数は float型で宣言し、割り算計算する部分の頭に ( int )を付けて整数に変換する。
ちょっとややこしいけど、落ち着いて一つ一つの処理を追えば難しくは無い。
例えば1秒間に10コマ進むアニメパターンのfpsは10だ。
1000/10は100。
現在時刻が15545だったとしよう。
15545/100は155.45となる。
整数にするために小数点以下を切り捨てると、155になる。
このアニメパターンの総コマ数が4だったとすると、
155/4で、応えは38と余りが3となる。
この余り3がコマ番号だ。
4で割っているので、この余りは割られる数が1増えるごとに0から3の範囲でループする。
で、割られる数は何だったかと振り返ると、1コマ分の時間ごとに1増える数なのだ。
つまり、1コマ分の時間経過にあわせて余りは1ずつ増え、総コマ数に達すると0に戻る。
わかりやすく説明できたかなあ・・・。
この計算を関数内でおこなう。
渡す引数は(座標x、y、アニメパターの入ったグラフィックハンドル配列の最初のコマのアドレス、fps、総コマ数)って感じだ。
これで、座標、キャラクターの種類、1コマの時間、総コマ数を問わずに、この関数を通せばアニメーションさせることが出来る。
ルールはひとつ。
アニメーションパターンは順番どおりにグラフィックハンドルの配列変数に入れておくこと。
では実行ファイルを。
ソースも入ってます。
http://multip.net/view/bEcjpJQM0k
そういや、返り値の必要ない関数はvoid型でよかったんだね。
だいぶ前にやったから忘れてて、関数全部int型で宣言してた・・・(汗)
いちいち return 0; って書くのなんか違和感あったんだよなあ(笑)
というわけで、ちゃんとvoid型になってます。
たまに復習もしないとだめだね。
敵機をクルクルアニメーションさせてみた。
DrawAnimationと言う関数を新たに追加。
アニメを簡単に表示する方法を考えたんだけど思いつかなくて、最初の方の記事で使っていたテキスト『14歳からはじめるC言語ゲームプログラミング』を調べた。
なるほどね!
よく思いつくなあと、しばし関心。
まず、1秒間に何コマアニメーションさせるかを fps とする。
1000/fps で1コマの時間が計算できる。
例えば1秒で8コマ動かすなら、1000/8で1コマの時間は125ミリ秒となる。
次にGetNowCount関数で現在の時間をミリ秒で得る。
それをさっき求めた1コマの時間で割る。
t = GetNowCount( )
とすると
t / ( 1000/fps )
って感じで。
そうすると、1コマ分の時間が経過するごとに1増える値が得られる。
これをアニメが一回りする総コマ数で割ってやる。
その余りをアニメパターンのコマ番号に使うのだ。
表示するコマ番号 = ( int )( t / (1000/fps) ) % 総コマ数
計算は割り算で小数になることもあるので、変数は float型で宣言し、割り算計算する部分の頭に ( int )を付けて整数に変換する。
ちょっとややこしいけど、落ち着いて一つ一つの処理を追えば難しくは無い。
例えば1秒間に10コマ進むアニメパターンのfpsは10だ。
1000/10は100。
現在時刻が15545だったとしよう。
15545/100は155.45となる。
整数にするために小数点以下を切り捨てると、155になる。
このアニメパターンの総コマ数が4だったとすると、
155/4で、応えは38と余りが3となる。
この余り3がコマ番号だ。
4で割っているので、この余りは割られる数が1増えるごとに0から3の範囲でループする。
で、割られる数は何だったかと振り返ると、1コマ分の時間ごとに1増える数なのだ。
つまり、1コマ分の時間経過にあわせて余りは1ずつ増え、総コマ数に達すると0に戻る。
わかりやすく説明できたかなあ・・・。
この計算を関数内でおこなう。
渡す引数は(座標x、y、アニメパターの入ったグラフィックハンドル配列の最初のコマのアドレス、fps、総コマ数)って感じだ。
これで、座標、キャラクターの種類、1コマの時間、総コマ数を問わずに、この関数を通せばアニメーションさせることが出来る。
ルールはひとつ。
アニメーションパターンは順番どおりにグラフィックハンドルの配列変数に入れておくこと。
では実行ファイルを。
ソースも入ってます。
http://multip.net/view/bEcjpJQM0k
そういや、返り値の必要ない関数はvoid型でよかったんだね。
だいぶ前にやったから忘れてて、関数全部int型で宣言してた・・・(汗)
いちいち return 0; って書くのなんか違和感あったんだよなあ(笑)
というわけで、ちゃんとvoid型になってます。
たまに復習もしないとだめだね。
PR
この記事にコメントする
- ABOUT
やってやれないことはないっ!たぶん・・・
- カレンダー
04 | 2025/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 最新コメント
[11/09 CALL MY NAME]
[11/09 erin]
[08/18 うずランド]
[07/11 うずランド]
[06/23 うずランド]
- プロフィール
HN:
Call my name
年齢:
50
性別:
男性
誕生日:
1974/05/22
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析