上手な画像の表示の仕方
-
toty
上手な画像の表示の仕方
突然ですみませんが、例えば2dアクションなどで敵を吹っ飛ばしてその後敵が数秒間倒れる、といったことを作りたいのですがうまくいきません。
具体的には、LoadDivGraph関数で(敵がのけ反る画像や倒れている画像をまとめた)画像を分割して表示したところ、
確かにのけ反っていて、そしてほんの一瞬だけ倒れてすぐに起き上がってしまっているのですが倒れている状態を数秒間キープするにはどうしたらいいでしょうか?
また、これに限った話ではないのですが画像を分割して読み込んだものを順番に表示させてもそれぞれ一瞬しか表示されませんよね。全体的にもっとゆっくりと表示させたいのですが…。
具体的には、LoadDivGraph関数で(敵がのけ反る画像や倒れている画像をまとめた)画像を分割して表示したところ、
確かにのけ反っていて、そしてほんの一瞬だけ倒れてすぐに起き上がってしまっているのですが倒れている状態を数秒間キープするにはどうしたらいいでしょうか?
また、これに限った話ではないのですが画像を分割して読み込んだものを順番に表示させてもそれぞれ一瞬しか表示されませんよね。全体的にもっとゆっくりと表示させたいのですが…。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 上手な画像の表示の仕方
簡単なのだと表示する絵のイメージ配列番号をフレーム数繰り返してをテーブル管理する方法があります。
このテーブルだと
0→1→1→1→2→3→4→5→5→5→5→5→5
とアニメーションします。
// フレームとアニメコマの対応を必要なフレームだけ繰り返します。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 上手な画像の表示の仕方
どこの部分が理解出来ないのでしょうか?toty さんが書きました:すみません。もう少し詳しくおねがいします・・・。
①同じコマを繰り返せば、表示時間をコントロールできるという点。
②フレームとコマ番号を変換しているテーブルという物。
③配列が理解できない。
④フレームという言葉が理解出来ない。
⑤自分のプログラムへの組み込み方。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 上手な画像の表示の仕方
DXライブラリが毎秒60フレーム(重くない場合)で書き換えられているのはご存知でしょうか?toty さんが書きました:①と②がいまいち・・・
つまり一秒間同じ絵を表示するには、60フレーム同じ絵を表示し続けなければいけません。
私のやり方は、何フレーム同じ絵を表示するかでアニメーションの速度をコントロールする方法です。
ここまでは理解できますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 上手な画像の表示の仕方
では①はOKですね。
②の方法は経過フレームとアニメのコマを対応させるためのテーブルです。
アニメーションを開始してからの経過フレーム数をカウントして、経過フレームに合わせたアニメのコマ表示させるための仕組みを配列で行っています。
配列を経過フレームで読みだすので、0フレーム後のアニメのコマ、10フレーム目のアニメのコマと配列の初期値で定義することで任意のコマを任意のフレーム間表示することが出来ます。
分りやすいようにframeのカウントを追加。
②の方法は経過フレームとアニメのコマを対応させるためのテーブルです。
アニメーションを開始してからの経過フレーム数をカウントして、経過フレームに合わせたアニメのコマ表示させるための仕組みを配列で行っています。
配列を経過フレームで読みだすので、0フレーム後のアニメのコマ、10フレーム目のアニメのコマと配列の初期値で定義することで任意のコマを任意のフレーム間表示することが出来ます。
分りやすいようにframeのカウントを追加。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
toty
Re: 上手な画像の表示の仕方
・・・?配列を経過フレームで読みだすので、0フレーム後のアニメのコマ、10フレーム目のアニメのコマと配列の初期値で定義することで任意のコマを任意のフレーム間表示することが出来ます。
後、
frame++;//フレームのカウント。
とありますが配列の要素数を超えてしまうのですが・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 上手な画像の表示の仕方
それは「アニメ終わりの処理」が実装されていないからです。
このプログラム自体は実装が完全なコードではありません。
元々のコードやアニメのコマ数も分かりませんので、あくまで擬似コードです。
アニメーションの開始処理や、この処理に入る条件などは記載していませんので前後の関係を考慮した上でちゃんと足らないものを付け足してやる必要があるサンプルコードに過ぎません。
[追記]
これでは分からないということでしたら、下記のコードをサンプルに改造してみますので確認してみてください。
「C言語~ゲームプログラミングの館~ 19. キャラをキー入力によって移動させる。」
http://dixq.net/g/21.html
スペースキーを押すと所定のアニメを始めてアニメ配列の値が-1になると止め絵に戻ります。
このプログラム自体は実装が完全なコードではありません。
元々のコードやアニメのコマ数も分かりませんので、あくまで擬似コードです。
アニメーションの開始処理や、この処理に入る条件などは記載していませんので前後の関係を考慮した上でちゃんと足らないものを付け足してやる必要があるサンプルコードに過ぎません。
[追記]
これでは分からないということでしたら、下記のコードをサンプルに改造してみますので確認してみてください。
「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: 上手な画像の表示の仕方
とりあえずは当初の目的通り敵を数秒間倒すことに成功しました(色々と課題は残りますが)。
softya(ソフト屋) さんありがとうございます。
それはそれでいいんですがコードが以前にも増してごちゃごちゃになってしまいました。
もっときれいに書くにはどうすればいいのか・・・。(新しくトピック立てて聞いたほうがいいかな?)
softya(ソフト屋) さんありがとうございます。
それはそれでいいんですがコードが以前にも増してごちゃごちゃになってしまいました。
もっときれいに書くにはどうすればいいのか・・・。(新しくトピック立てて聞いたほうがいいかな?)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 上手な画像の表示の仕方
うまくいって良かったです。toty さんが書きました:とりあえずは当初の目的通り敵を数秒間倒すことに成功しました(色々と課題は残りますが)。
softya(ソフト屋) さんありがとうございます。
そうですね。新しいトピックでお願いします。toty さんが書きました:それはそれでいいんですがコードが以前にも増してごちゃごちゃになってしまいました。
もっときれいに書くにはどうすればいいのか・・・。(新しくトピック立てて聞いたほうがいいかな?)
たぶん簡単な方法でアドバイスしたから効率が悪いのかなと思っていたりします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。