はじめまして、超初心者趣味グラマーのマシュマロです。現在自作シューティングゲームを作ろうとしていて、まず自機の描画、操作、とアニメーションをクリアしたいのですがアニメーションの段階で困っています。アニメーションは具体的に自機が左右に滑らかに傾く事を再現したいと思ってます。過去にいくつか似たような投稿はあったのですが、自分の再現したい物とは少し違うので、今回初めての投稿ですがどうぞよろしくお願いします。
こちらのフレーム画像は自機となるイメージが五つ横一列に並んでます(gh[5])。そのうちの真ん中(配列要素2)は機体が傾いていないイメージ、そこから左に(0←1)右に(3→4)と2段階傾くイメージをならべています(全体的には01234のイメージ)。これを使って例えば右キーが押されっぱなしなら2からインクリメント(最大4まで)、左キーならデクリメント(最低0まで)させたいのです。さらに、左右どちらかが押されっぱなしの後ニュートラルに戻った(キーが離された)らそこから2を目掛けてインクリメント又はデクリメントさせたいのです。
当サイトのsp2章「キーが押されているフレーム数を取得する」が一番のヒントになっているとは思うのですが、
どうにか2を中心に0から4の数値を左右キーで自由にコントロール出来ないでしょうか?それともアニメーションの考え方自体おかしいのでしょうか?
Cでアニメーションの質問(STG)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: Cでアニメーションの質問(STG)
そういう事は当然可能ですが、インクリメントなしに左向きや右向き 0←2→4 と言う変化をするプログラムは作れますか?
それだけを行うコードを提示してもらって、そこをベースに機能追加していけば良いと思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/03_01.html
これとかベースに良いんじゃないでしょか。
それだけを行うコードを提示してもらって、そこをベースに機能追加していけば良いと思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/03_01.html
これとかベースに良いんじゃないでしょか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: Cでアニメーションの質問(STG)
読みづらい…w
もう少し改行をですね
ってそれは置いておきまして
マシュマロモンスターさんがおっしゃる通り
ゲームプログラミングの館の「キーが押されているフレーム数を取得する」を応用すれば実装できますよ~
考え方を教えますと(右方向の入力を例にとります)
ニュートラル状態の時に少しでも右が押されると数値を1つだけインクリメントさせます(3にする)
そして数値が3の状態(1段階傾いている状態)で更に一定時間(時間は適当に決めちゃってください)キーを押し続けると、もう1段階インクリメントさせる
という処理を作ればいいと思います。
元に戻る時は、そうですね
4から3に戻す時は、キーが離された瞬間でいいと思います。
3から2に戻す時は、キーのカウントとは別にモーション用のカウンタを用意しておいて
キーが”押されていない”間モーションカウントを増やしていき、これも一定の時間になったらデクリメント(2に戻す)
でいいと思います。
4から3に戻った後でまたキーが押された場合はモーションカウントを0に戻し
また一定時間押され続けたら4に戻す、すぐにキーが離された場合はまたモーションカウントを加算していく
という処理で大丈夫だと思いますよ
もう少し改行をですね
ってそれは置いておきまして
マシュマロモンスターさんがおっしゃる通り
ゲームプログラミングの館の「キーが押されているフレーム数を取得する」を応用すれば実装できますよ~
考え方を教えますと(右方向の入力を例にとります)
ニュートラル状態の時に少しでも右が押されると数値を1つだけインクリメントさせます(3にする)
そして数値が3の状態(1段階傾いている状態)で更に一定時間(時間は適当に決めちゃってください)キーを押し続けると、もう1段階インクリメントさせる
という処理を作ればいいと思います。
元に戻る時は、そうですね
4から3に戻す時は、キーが離された瞬間でいいと思います。
3から2に戻す時は、キーのカウントとは別にモーション用のカウンタを用意しておいて
キーが”押されていない”間モーションカウントを増やしていき、これも一定の時間になったらデクリメント(2に戻す)
でいいと思います。
4から3に戻った後でまたキーが押された場合はモーションカウントを0に戻し
また一定時間押され続けたら4に戻す、すぐにキーが離された場合はまたモーションカウントを加算していく
という処理で大丈夫だと思いますよ
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ
-
- 記事: 9
- 登録日時: 12年前
Re: Cでアニメーションの質問(STG)
jayさん、softyaさん、どうもありがとうございます。
とりあえずsoftyaさんの仰った様に「インクリメントなしで 0←2→4 と言う変化をする」
というプログラムはすぐに出来ました。必要な部分だけ提示します。
(右キーの場合のみです)。
これで一応右キーで傾き2段階まで行って離したらニュートラルの位置(2)に戻ります
(押2→3→4 離2←4)。
この時点でキーボード取得関数はとりあえずゲームプログラミングの館の3.1章にあるgpUpdateKey()を使わせていただきました。
ここからjayさんの提案を元に機能を追加して行きたいのですが
とりあえず離したら加算されるカウンターを作ったりして試してみます。
まだクラスとかは使わずメイン関数に全部書いていて
http://dixq.net/g/sp_02.html を参考にしたいのですが
中々前に進まない状況です。
理想的には出来上がった物を後に一つのMove()関数(自機の移動処理)にまとめて
クラスなど使うようになったら扱いやすくしたいです。
とりあえずsoftyaさんの仰った様に「インクリメントなしで 0←2→4 と言う変化をする」
というプログラムはすぐに出来ました。必要な部分だけ提示します。
(右キーの場合のみです)。
//何も押されてなかったらニュートラルの位置
if(Key[KEY_INPUT_RIGHT]==0 && Key[KEY_INPUT_LEFT]==0)
{
tilt=2;
}
if (Key[KEY_INPUT_RIGHT]>=1)//→キーが押された瞬間
{
tilt=3;//傾き一段階目
if(Key[KEY_INPUT_RIGHT]>3)//3フレーム以上経ったら
{
tilt=4;//傾き二段階目
}
}
(押2→3→4 離2←4)。
この時点でキーボード取得関数はとりあえずゲームプログラミングの館の3.1章にあるgpUpdateKey()を使わせていただきました。
ここからjayさんの提案を元に機能を追加して行きたいのですが
とりあえず離したら加算されるカウンターを作ったりして試してみます。
まだクラスとかは使わずメイン関数に全部書いていて
http://dixq.net/g/sp_02.html を参考にしたいのですが
中々前に進まない状況です。
理想的には出来上がった物を後に一つのMove()関数(自機の移動処理)にまとめて
クラスなど使うようになったら扱いやすくしたいです。
Re: Cでアニメーションの質問(STG)
たかだか数フレームで切り替わるのならテーブルで持っちゃってもいいかも,とか.
(切り替わりタイミングとかの変更や微調整が楽かもしれない)
(切り替わりタイミングとかの変更や微調整が楽かもしれない)
const int MaxAbsCount=8; //一方へのキー押し続けを数える最大数
const TiltTable[2*MaxAbsCount+1] = { 0,0,0,0,1,1,1,2, 2, 2,3,3,3,4,4,4,4 };
int ShiftedTableIndex = 0; //TiltTable[]用index初期値=0. tilt=TiltTable[ShiftedTableIndex+MaxAbsCount]として使う
{//キー処理
if( キー押されてない )
{ ShiftedTableIndex /= 2; } //てきとー.ShiftedTableIndex=0;とかで一気に戻すのとどっちが良いか?
else if( 右キー )
{
ShiftedTableIndex = ( ShiftedTableIndex>=0 ? ShiftedTableIndex+1 : 1 );
if( ShiftedTableIndex>MaxAbsCount )ShiftedTableIndex=MaxAbsCount;
}
else if( 左キー )
{
ShiftedTableIndex = ( ShiftedTableIndex<=0 ? ShiftedTableIndex-1 : -1 );
if( ShiftedTableIndex<-MaxAbsCount )ShiftedTableIndex=-MaxAbsCount;
}
//0~4までの結果値
tilt = TiltTable[ShiftedTableIndex+MaxAbsCount];
}
Re: Cでアニメーションの質問(STG)
学生の頃にドット絵のアニメーションを再生していたときは
私はアニメーションの再生インデックスとフレームを対応付けしていましたね。
「右が押されたら右へ傾くアニメを再生する」
「左が押されたら左へ傾くアニメを再生する」
「離されたらニュートラルに戻るアニメを再生する」
というアニメを一つの形式にまとめると楽に管理できますしドット絵の枚数が増えても簡単に対応できます。
キーの入力は「現在の入力情報」と「前回のフレームの入力情報」の比較を取れば簡単に得られます。
例えば「今回の更新ではKey[KEY_INPUT_RIGHT]には1の値が入っていたけど、前回のフレームでは0の値だった」なら入力初回タイミングですし、
逆に「今回の更新ではKey[KEY_INPUT_RIGHT]には0の値が入っていたけど、前回のフレームでは1(以上)の値だった」なら離されたタイミングです。
現在も前回も1以上なら入力されっぱなし、というわけですね。
私はアニメーションの再生インデックスとフレームを対応付けしていましたね。
「右が押されたら右へ傾くアニメを再生する」
「左が押されたら左へ傾くアニメを再生する」
「離されたらニュートラルに戻るアニメを再生する」
というアニメを一つの形式にまとめると楽に管理できますしドット絵の枚数が増えても簡単に対応できます。
キーの入力は「現在の入力情報」と「前回のフレームの入力情報」の比較を取れば簡単に得られます。
例えば「今回の更新ではKey[KEY_INPUT_RIGHT]には1の値が入っていたけど、前回のフレームでは0の値だった」なら入力初回タイミングですし、
逆に「今回の更新ではKey[KEY_INPUT_RIGHT]には0の値が入っていたけど、前回のフレームでは1(以上)の値だった」なら離されたタイミングです。
現在も前回も1以上なら入力されっぱなし、というわけですね。
ヽ(*゚д゚)ノ カイバー
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: Cでアニメーションの質問(STG)
usaoさんの方法で大体OKだと思います。
ただ、いきなりキーを逆方向に切り返した時は、どうアニメーションするかは考えておいたほうが良いかなって気がします。
ただ、いきなりキーを逆方向に切り返した時は、どうアニメーションするかは考えておいたほうが良いかなって気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 9
- 登録日時: 12年前
Re: Cでアニメーションの質問(STG)
皆様、本当にどうもありがとうございます!物凄く勉強になりました。
@usaoさん
提示してくださったコードを使ってみたところ思い通りにアニメーション出来ました。わかり易く書いていただいて感謝しております!
@softyaさん
仰ったように、右から左へいきなり切り返した時はやはり直に2(真ん中)に戻っているように見えます。しかし今はフレーム数が少ない為、現時点ではあまり気にはなりません。
これからもし多数のフレームを扱いたいと思った時に備えてsoftyaさんのアドバイスをメモさせていただきます。
@せんちゃさん
あぁその手もありましたか!確かにそれぞれの動作に応じて必要なアニメーションを用意すればコードも劇的に短くなりそうですね。
是非試させていただきます。
ところで、「現在の入力情報」と「前回のフレームの入力情報」を比較するにはどうしたらいいのでしょうか?
大体の想像はつくのですが、せんちゃさんだったらどう対応しますか?
是非教えてください!
@usaoさん
提示してくださったコードを使ってみたところ思い通りにアニメーション出来ました。わかり易く書いていただいて感謝しております!
@softyaさん
仰ったように、右から左へいきなり切り返した時はやはり直に2(真ん中)に戻っているように見えます。しかし今はフレーム数が少ない為、現時点ではあまり気にはなりません。
これからもし多数のフレームを扱いたいと思った時に備えてsoftyaさんのアドバイスをメモさせていただきます。
@せんちゃさん
あぁその手もありましたか!確かにそれぞれの動作に応じて必要なアニメーションを用意すればコードも劇的に短くなりそうですね。
是非試させていただきます。
ところで、「現在の入力情報」と「前回のフレームの入力情報」を比較するにはどうしたらいいのでしょうか?
大体の想像はつくのですが、せんちゃさんだったらどう対応しますか?
是非教えてください!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: Cでアニメーションの質問(STG)
>ところで、「現在の入力情報」と「前回のフレームの入力情報」を比較するにはどうしたらいいのでしょうか?
今回のをstaticに保存しておいて次回に使うとかでしょうね。
今回のをstaticに保存しておいて次回に使うとかでしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 9
- 登録日時: 12年前
Re: Cでアニメーションの質問(STG)
おーなるほど、わかった様な気がします!この方法は自機の弾発射処理などにも、色々使えそうですね。softya(ソフト屋) さんが書きました:今回のをstaticに保存しておいて次回に使うとかでしょうね。
これでこの件は解決とします。皆様、御協力ありがとうございます!今後ともよろしくお願いします。