Cでアニメーションの質問(STG)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マシュマロモンスター
記事: 9
登録日時: 7年前

Cでアニメーションの質問(STG)

#1

投稿記事 by マシュマロモンスター » 7年前

はじめまして、超初心者趣味グラマーのマシュマロです。現在自作シューティングゲームを作ろうとしていて、まず自機の描画、操作、とアニメーションをクリアしたいのですがアニメーションの段階で困っています。アニメーションは具体的に自機が左右に滑らかに傾く事を再現したいと思ってます。過去にいくつか似たような投稿はあったのですが、自分の再現したい物とは少し違うので、今回初めての投稿ですがどうぞよろしくお願いします。

こちらのフレーム画像は自機となるイメージが五つ横一列に並んでます(gh[5])。そのうちの真ん中(配列要素2)は機体が傾いていないイメージ、そこから左に(0←1)右に(3→4)と2段階傾くイメージをならべています(全体的には01234のイメージ)。これを使って例えば右キーが押されっぱなしなら2からインクリメント(最大4まで)、左キーならデクリメント(最低0まで)させたいのです。さらに、左右どちらかが押されっぱなしの後ニュートラルに戻った(キーが離された)らそこから2を目掛けてインクリメント又はデクリメントさせたいのです。

当サイトのsp2章「キーが押されているフレーム数を取得する」が一番のヒントになっているとは思うのですが、
どうにか2を中心に0から4の数値を左右キーで自由にコントロール出来ないでしょうか?それともアニメーションの考え方自体おかしいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: Cでアニメーションの質問(STG)

#2

投稿記事 by softya(ソフト屋) » 7年前

そういう事は当然可能ですが、インクリメントなしに左向きや右向き 0←2→4 と言う変化をするプログラムは作れますか?
それだけを行うコードを提示してもらって、そこをベースに機能追加していけば良いと思います。

「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/03_01.html
これとかベースに良いんじゃないでしょか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: Cでアニメーションの質問(STG)

#3

投稿記事 by jay » 7年前

読みづらい…w
もう少し改行をですね

ってそれは置いておきまして


マシュマロモンスターさんがおっしゃる通り
ゲームプログラミングの館の「キーが押されているフレーム数を取得する」を応用すれば実装できますよ~

考え方を教えますと(右方向の入力を例にとります)
ニュートラル状態の時に少しでも右が押されると数値を1つだけインクリメントさせます(3にする)
そして数値が3の状態(1段階傾いている状態)で更に一定時間(時間は適当に決めちゃってください)キーを押し続けると、もう1段階インクリメントさせる
という処理を作ればいいと思います。

元に戻る時は、そうですね
4から3に戻す時は、キーが離された瞬間でいいと思います。

3から2に戻す時は、キーのカウントとは別にモーション用のカウンタを用意しておいて
キーが”押されていない”間モーションカウントを増やしていき、これも一定の時間になったらデクリメント(2に戻す)
でいいと思います。

4から3に戻った後でまたキーが押された場合はモーションカウントを0に戻し
また一定時間押され続けたら4に戻す、すぐにキーが離された場合はまたモーションカウントを加算していく
という処理で大丈夫だと思いますよ
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

マシュマロモンスター
記事: 9
登録日時: 7年前

Re: Cでアニメーションの質問(STG)

#4

投稿記事 by マシュマロモンスター » 7年前

jayさん、softyaさん、どうもありがとうございます。
とりあえず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段階まで行って離したらニュートラルの位置(2)に戻ります
(押2→3→4 離2←4)。
この時点でキーボード取得関数はとりあえずゲームプログラミングの館の3.1章にあるgpUpdateKey()を使わせていただきました。
ここからjayさんの提案を元に機能を追加して行きたいのですが
とりあえず離したら加算されるカウンターを作ったりして試してみます。

まだクラスとかは使わずメイン関数に全部書いていて
http://dixq.net/g/sp_02.html を参考にしたいのですが
中々前に進まない状況です。

理想的には出来上がった物を後に一つのMove()関数(自機の移動処理)にまとめて
クラスなど使うようになったら扱いやすくしたいです。

usao

Re: Cでアニメーションの質問(STG)

#5

投稿記事 by usao » 7年前

たかだか数フレームで切り替わるのならテーブルで持っちゃってもいいかも,とか.
(切り替わりタイミングとかの変更や微調整が楽かもしれない)

コード:

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];
}

アバター
せんちゃ
記事: 50
登録日時: 9年前
住所: 江別市東野幌町
連絡を取る:

Re: Cでアニメーションの質問(STG)

#6

投稿記事 by せんちゃ » 7年前

学生の頃にドット絵のアニメーションを再生していたときは
私はアニメーションの再生インデックスとフレームを対応付けしていましたね。
「右が押されたら右へ傾くアニメを再生する」
「左が押されたら左へ傾くアニメを再生する」
「離されたらニュートラルに戻るアニメを再生する」
というアニメを一つの形式にまとめると楽に管理できますしドット絵の枚数が増えても簡単に対応できます。


キーの入力は「現在の入力情報」と「前回のフレームの入力情報」の比較を取れば簡単に得られます。
例えば「今回の更新ではKey[KEY_INPUT_RIGHT]には1の値が入っていたけど、前回のフレームでは0の値だった」なら入力初回タイミングですし、
逆に「今回の更新ではKey[KEY_INPUT_RIGHT]には0の値が入っていたけど、前回のフレームでは1(以上)の値だった」なら離されたタイミングです。
現在も前回も1以上なら入力されっぱなし、というわけですね。
ヽ(*゚д゚)ノ カイバー

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: Cでアニメーションの質問(STG)

#7

投稿記事 by softya(ソフト屋) » 7年前

usaoさんの方法で大体OKだと思います。
ただ、いきなりキーを逆方向に切り返した時は、どうアニメーションするかは考えておいたほうが良いかなって気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マシュマロモンスター
記事: 9
登録日時: 7年前

Re: Cでアニメーションの質問(STG)

#8

投稿記事 by マシュマロモンスター » 7年前

皆様、本当にどうもありがとうございます!物凄く勉強になりました。

@usaoさん
提示してくださったコードを使ってみたところ思い通りにアニメーション出来ました。わかり易く書いていただいて感謝しております!

@softyaさん
仰ったように、右から左へいきなり切り返した時はやはり直に2(真ん中)に戻っているように見えます。しかし今はフレーム数が少ない為、現時点ではあまり気にはなりません。
これからもし多数のフレームを扱いたいと思った時に備えてsoftyaさんのアドバイスをメモさせていただきます。

@せんちゃさん
あぁその手もありましたか!確かにそれぞれの動作に応じて必要なアニメーションを用意すればコードも劇的に短くなりそうですね。
是非試させていただきます。
ところで、「現在の入力情報」と「前回のフレームの入力情報」を比較するにはどうしたらいいのでしょうか?
大体の想像はつくのですが、せんちゃさんだったらどう対応しますか?
是非教えてください!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: Cでアニメーションの質問(STG)

#9

投稿記事 by softya(ソフト屋) » 7年前

>ところで、「現在の入力情報」と「前回のフレームの入力情報」を比較するにはどうしたらいいのでしょうか?

今回のをstaticに保存しておいて次回に使うとかでしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マシュマロモンスター
記事: 9
登録日時: 7年前

Re: Cでアニメーションの質問(STG)

#10

投稿記事 by マシュマロモンスター » 7年前

softya(ソフト屋) さんが書きました:今回のをstaticに保存しておいて次回に使うとかでしょうね。
おーなるほど、わかった様な気がします!この方法は自機の弾発射処理などにも、色々使えそうですね。

これでこの件は解決とします。皆様、御協力ありがとうございます!今後ともよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る