上手な画像の表示の仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
toty

上手な画像の表示の仕方

#1

投稿記事 by toty » 14年前

突然ですみませんが、例えば2dアクションなどで敵を吹っ飛ばしてその後敵が数秒間倒れる、といったことを作りたいのですがうまくいきません。
具体的には、LoadDivGraph関数で(敵がのけ反る画像や倒れている画像をまとめた)画像を分割して表示したところ、
確かにのけ反っていて、そしてほんの一瞬だけ倒れてすぐに起き上がってしまっているのですが倒れている状態を数秒間キープするにはどうしたらいいでしょうか?
また、これに限った話ではないのですが画像を分割して読み込んだものを順番に表示させてもそれぞれ一瞬しか表示されませんよね。全体的にもっとゆっくりと表示させたいのですが…。

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

Re: 上手な画像の表示の仕方

#2

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

簡単なのだと表示する絵のイメージ配列番号をフレーム数繰り返してをテーブル管理する方法があります。

コード:

//	フレームとアニメコマの対応を必要なフレームだけ繰り返します。
int ImageAnimKoma[] = {
	0,
	1,1,1,
	2,
	3,
	4,
	5,5,5,5,5,5,
	-1,	//アニメの終わりマーク
};

	//	フレーム番号でアニメのコマを制御
	koma = ImageAnimKoma[frame];
	if( koma == -1  ) {
		アニメ終わりの処理
	} else {
		//	描画する
		DrawGraph( x,y , Image[koma]);
	}
このテーブルだと
0→1→1→1→2→3→4→5→5→5→5→5→5
とアニメーションします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

toty

Re: 上手な画像の表示の仕方

#3

投稿記事 by toty » 14年前

すみません。もう少し詳しくおねがいします・・・。

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

Re: 上手な画像の表示の仕方

#4

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

toty さんが書きました:すみません。もう少し詳しくおねがいします・・・。
どこの部分が理解出来ないのでしょうか?
①同じコマを繰り返せば、表示時間をコントロールできるという点。
②フレームとコマ番号を変換しているテーブルという物。
③配列が理解できない。
④フレームという言葉が理解出来ない。
⑤自分のプログラムへの組み込み方。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

toty

Re: 上手な画像の表示の仕方

#5

投稿記事 by toty » 14年前

①と②がいまいち・・・

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

Re: 上手な画像の表示の仕方

#6

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

toty さんが書きました:①と②がいまいち・・・
DXライブラリが毎秒60フレーム(重くない場合)で書き換えられているのはご存知でしょうか?
つまり一秒間同じ絵を表示するには、60フレーム同じ絵を表示し続けなければいけません。
私のやり方は、何フレーム同じ絵を表示するかでアニメーションの速度をコントロールする方法です。
ここまでは理解できますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

toty

Re: 上手な画像の表示の仕方

#7

投稿記事 by toty » 14年前

はい。大丈夫です

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

Re: 上手な画像の表示の仕方

#8

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

では①はOKですね。
②の方法は経過フレームとアニメのコマを対応させるためのテーブルです。
アニメーションを開始してからの経過フレーム数をカウントして、経過フレームに合わせたアニメのコマ表示させるための仕組みを配列で行っています。
配列を経過フレームで読みだすので、0フレーム後のアニメのコマ、10フレーム目のアニメのコマと配列の初期値で定義することで任意のコマを任意のフレーム間表示することが出来ます。

分りやすいようにframeのカウントを追加。

コード:

//  フレームとアニメコマの対応を必要なフレームだけ繰り返します。
int ImageAnimKoma[] = {
    0,
    1,1,1,
    2,
    3,
    4,
    5,5,5,5,5,5,
    -1, //アニメの終わりマーク
};
 
    //  フレーム番号でアニメのコマを制御
    koma = ImageAnimKoma[frame];
    frame++;//フレームのカウント。
    if( koma == -1  ) {
        アニメ終わりの処理
    } else {
        //  描画する
        DrawGraph( x,y , Image[koma]);
    }
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

toty

Re: 上手な画像の表示の仕方

#9

投稿記事 by toty » 14年前

配列を経過フレームで読みだすので、0フレーム後のアニメのコマ、10フレーム目のアニメのコマと配列の初期値で定義することで任意のコマを任意のフレーム間表示することが出来ます。
・・・?

後、
frame++;//フレームのカウント。
とありますが配列の要素数を超えてしまうのですが・・・

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

Re: 上手な画像の表示の仕方

#10

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

それは「アニメ終わりの処理」が実装されていないからです。
このプログラム自体は実装が完全なコードではありません。
元々のコードやアニメのコマ数も分かりませんので、あくまで擬似コードです。
アニメーションの開始処理や、この処理に入る条件などは記載していませんので前後の関係を考慮した上でちゃんと足らないものを付け足してやる必要があるサンプルコードに過ぎません。

[追記]
これでは分からないということでしたら、下記のコードをサンプルに改造してみますので確認してみてください。
「C言語~ゲームプログラミングの館~ 19. キャラをキー入力によって移動させる。」
http://dixq.net/g/21.html

スペースキーを押すと所定のアニメを始めてアニメ配列の値が-1になると止め絵に戻ります。

コード:

#include "DxLib.h"
 
typedef struct{
        int x,y,img;
}ch_t;


//	フレームとアニメコマの対応を必要なフレームだけ繰り返します。
int ImageAnimKoma[] = {
	0,0,			//後ろを2フレーム
	4,4,4,4,4,4,	//左向きを6フレーム
	8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,	//正面を20フレーム
	12,12,12,12,12,12,12,12,12,12,	//右向きを10フレーム
	-1,	//アニメの終わりマーク
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[16];
    char Key[256];
    ch_t ch;
    int frame = -1;
    int AnimFlag = 0;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    ch.x    =320;
    ch.y    =240;
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
    LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
        if( Key[ KEY_INPUT_SPACE ]  == 1 ) {  //スペースボタンが押されたらアニメ開始
        	frame = 0;
        	AnimFlag = 1;
        }
 		
 		//	アニメ有効?
 		if( AnimFlag ) {
		 	//	フレーム番号でアニメのコマを制御
			int koma = ImageAnimKoma[frame];
			frame++;
			if( koma == -1  ) {
				AnimFlag = 0;	//アニメ終了
			} else {
				//	アニメの指定コマを描画する
				DrawGraph( ch.x , ch.y , image[koma] , TRUE );
			}
		}
		//	アニメ無効?
 		if( AnimFlag==0 ) {
			//	止め絵のコマ描画
			DrawGraph( ch.x , ch.y , image[0] , TRUE );
		}
 
        ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

toty

Re: 上手な画像の表示の仕方

#11

投稿記事 by toty » 14年前

とりあえずは当初の目的通り敵を数秒間倒すことに成功しました(色々と課題は残りますが)。
softya(ソフト屋) さんありがとうございます。

それはそれでいいんですがコードが以前にも増してごちゃごちゃになってしまいました。
もっときれいに書くにはどうすればいいのか・・・。(新しくトピック立てて聞いたほうがいいかな?)

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

Re: 上手な画像の表示の仕方

#12

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

toty さんが書きました:とりあえずは当初の目的通り敵を数秒間倒すことに成功しました(色々と課題は残りますが)。
softya(ソフト屋) さんありがとうございます。
うまくいって良かったです。
toty さんが書きました:それはそれでいいんですがコードが以前にも増してごちゃごちゃになってしまいました。
もっときれいに書くにはどうすればいいのか・・・。(新しくトピック立てて聞いたほうがいいかな?)
そうですね。新しいトピックでお願いします。
たぶん簡単な方法でアドバイスしたから効率が悪いのかなと思っていたりします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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