DXライブラリでのアニメーションに方法について

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

DXライブラリでのアニメーションに方法について

#1

投稿記事 by geidou » 7年前

書籍『14歳からはじめる C言語わくわくゲームプログラミング』にて学習中でございます。

今回はアニメーションの描画方法について質問がございます。
現在の知識について

1、二次元配列を利用してアニメーションを表現する。
1.5、一次元配列を利用してアニメーションを表現する。
2、パーツを分割してアニメーションを表現する。

この三通りのやり方があることがわかった段階です。

質問については
1、DXライブラリを利用した場合はこれ上記3点以外にどのようにアニメーション表現方法があるのか知りたいです。
2、スプライトシートの配列[縦][横]で分割してアニメーションをする場合に
LoadDivGraph関数またはそれ以外で二次元配列で分割できるのかどうか
3、一次元配列を利用してアニメーションする場合に剰余算を利用した場合「0.1.2.3.0.1.2.3...」と循環することは理解できたが
「4.5.6.7.4.5.6.7.4...」と循環することはできるのか?
多分、できるだろうとは思うので自力で発見するヒントを頂きたいです。

以上3点について教えてください。

よろしくお願い致します。

小保方 晴夫

Re: DXライブラリでのアニメーションに方法について

#2

投稿記事 by 小保方 晴夫 » 7年前

・1について

>1、二次元配列を利用してアニメーションを表現する。
>1.5、一次元配列を利用してアニメーションを表現する。
>2、パーツを分割してアニメーションを表現する。

まず、1次元配列と2次元配列をどの様に利用するのかと言う点で、ロジックが不明ですので、質問者様がどの様な手法を分かったと言っているのかは分かりかねます。

ただ、古典的な方法として、アニメーションのムービーファイルをそのまま再生させると言う方法はロジックに依存しない方法という意味で上記に無いと考えられるという観点から提示しておきます。

・2について

LoadGraphで読み込んだ画像をDerivationGraphで2次元配列で管理するとか・・・?

・3について

「自力で発見するヒント」と言うよりは、もはや答えを書いた方が楽な事案なのですが、敢えてヒントにすると、例えば、

for(int i=0;i<100;i++) printf("%d."i%3);

とすると「0.1.2.3.0.1.2.3...」と表示されますよね?

では、

for(int i=0;i<100;i++) printf("%d."i%3+1); //+1しました。

とするとどの様に表示されるでしょうか?

また、

for(int i=0;i<100;i++) printf("%d."i%3+2); //+2しました。

とするとどの様に表示されるでしょうか?

そして、では「+?」すると「4.5.6.7.4.5.6.7.4...」と表示される様になるでしょうか?

・・・・これで、ヒントとしてはどうでしょうか?

geidou
記事: 10
登録日時: 7年前

Re: DXライブラリでのアニメーションに方法について

#3

投稿記事 by geidou » 7年前

ご返信ありがとうございました。
アニメーションについて…
すみません言葉足らずでした。やろうとしていることについてコードを載せて改めてご説明させていただきますと

コード:


#include <math.h>
#include "DxLib.h"

#define ANIMERATE 8

static int mStartTime;      //測定開始時刻
static int mCount;          //カウンタ
static float mFps;          //fps
static const int N = 60;	//平均を取るサンプル数
static const int FPS = 60;	//設定したFPS

int x;
int hero[48];
int animcounter = 0;
bool state=0;

bool Update() {
	if (mCount == 0) { //1フレーム目なら時刻を記憶
		mStartTime = GetNowCount();
	}
	if (mCount == N) { //60フレーム目なら平均を計算する
		int t = GetNowCount();
		mFps = 1000.f / ((t - mStartTime) / (float)N);
		mCount = 0;
		mStartTime = t;
	}
	mCount++;

	state = 0;
	return true;
}

void Anim(bool flag) {
	animcounter++;
	animcounter &= MAXINT;

	
	int ac = 0;
	
	ac=animcounter / ANIMRATE;
	
	
	if (flag == 0) {
		DrawGraph(x, 50, hero[ac % 4], true);

	}

	//DrawGraph(x, 50, hero[ac % 8], true);

	DrawFormatString(0, 32, GetColor(255, 255, 255), "animecounter=%d", animcounter);
	DrawFormatString(0, 64, GetColor(255, 255, 255), "ac=%d", ac);
	DrawFormatString(0, 96, GetColor(255, 255, 255), "ac %%16=%d", ac % 4+2);
	DrawFormatString(0, 128, GetColor(255, 255, 255), "satate=%d", state);
}

void Draw() {
	DrawFormatString(0, 0, GetColor(255, 255, 255), "%.1f", mFps);
	
	Anim(state);
	if (CheckHitKey(KEY_INPUT_RIGHT) != 0) {
		state = 1;
		x = x + 10;
	}
	if (CheckHitKey(KEY_INPUT_LEFT) != 0) {
		state = 1;

		x = x - 10;
	}
	
}

void Wait() {
	int tookTime = GetNowCount() - mStartTime;	//かかった時間
	int waitTime = mCount * 1000 / FPS - tookTime;	//待つべき時間
	if (waitTime > 0) {
		Sleep(waitTime);	//待機
	}
}





int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	int x = 0;
	LoadDivGraph("media\\spritesheet_64col.png", 48, 6, 8, 64, 64, hero);



	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
	while (ProcessMessage() == 0 && ClearDrawScreen() == 0) {

		

		Update();	//更新
		Draw();		//描画
		ScreenFlip();
		Wait();		//待機


	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
} 
 
 
上記のhero[64]にLoaddivGraphを使ってスプライトシートを読み込んで
DrawGraphで歩く、ジャンプ、攻撃とアニメーションを使い分ける方法についてです。

1、一次配列を使うと、0~8=攻撃、9~24=ジャンプ、25~32=歩くと煩雑になりますが

2、二次配列を使うと、
hero[攻撃][ac%8]
hero[ジャンプ][ac%16]
hero[歩く][ac%8]と表現できてわかりやくなると思いますが
LoaddivGraph関数で上記を実現することはできるのでしょうか?

3について

if文を使ってなんぼやってもうまくいかないと悩みまくっていたのに現実はこんな簡単なことで実現できるとは…
解決した喜びもあるのですが、こんな事で悩んでいたことにへこんでしまいそうです。

hide

Re: DXライブラリでのアニメーションに方法について

#4

投稿記事 by hide » 7年前

二次元配列を使わずとも

コード:

int getAnimationGraphic(int type, int index) {
  return handles[type * シートの列数+ index];
}
みたいな定義にして

コード:

int handle = getAnimationGraphic(攻撃, アニメーションの番号);
というような使い方をすれば良いのではないでしょうか?
あんまり画像等の管理を複雑にすると解放が面倒なので、多次元配列にしない方が楽かと思います。

geidou
記事: 10
登録日時: 7年前

Re: DXライブラリでのアニメーションに方法について

#5

投稿記事 by geidou » 7年前

返信いただきありがとうございます。

私のレベルでは、画像を分割して二次元配列に入れ込む方法がわからないので
そのやり方も聞いてみたかったのですが、まだ教えていただいても理解できるレベルに達していないのと
二次元配列で画像の管理はあまりおすすめしないとのことでしたので
取り合えず、教本でもあるように一次元配列と教授いただいた数字の途中からカウントを駆使して勉強していこうと思います。

解決ではあるのですが
理解できるレベルには達していないけど1つ仕組みについて気になる事があって
int handle1=LoadGraph("32*32size_gazou.png");
int handle2=LoadGraph("2560*1600size_gazou.png");

printf("%d",handle1);
printf("%d,handle2);

ってやってみると同じくらいの値が表示されました。
読み込んでる画像サイズによってhandleのデータサイズが変わるのかなと思ったのですが

一体、int handle達には何が入っているのですか?

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリでのアニメーションに方法について

#6

投稿記事 by Dixq (管理人) » 7年前

データサイズが入るわけではありません。
識別ハンドルが格納されています。
DXライブラリの中で
32*32size_gazou.png は 1111
2560*1600size_gazou.png は 2222
の番号で管理する
というような取り決めがあり、その管理番号が返ってきているだけでprintfでその値を表示しても何の意味も無いです。
DXライブラリの内部にしか意味が分からない数値です。

geidou
記事: 10
登録日時: 7年前

Re: DXライブラリでのアニメーションに方法について

#7

投稿記事 by geidou » 7年前

管理人さん、どうもです。
なるほどです。
まだまだ知らなくてよい領域または知らなくてもよい領域っぽいですね。
すっきりしました。ありがとうございました。

またよろしくお願いします。

返信

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