書籍『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点について教えてください。
よろしくお願い致します。
DXライブラリでのアニメーションに方法について
Re: DXライブラリでのアニメーションに方法について
・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...」と表示される様になるでしょうか?
・・・・これで、ヒントとしてはどうでしょうか?
>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...」と表示される様になるでしょうか?
・・・・これで、ヒントとしてはどうでしょうか?
Re: DXライブラリでのアニメーションに方法について
ご返信ありがとうございました。
アニメーションについて…
すみません言葉足らずでした。やろうとしていることについてコードを載せて改めてご説明させていただきますと
上記のhero[64]にLoaddivGraphを使ってスプライトシートを読み込んで
DrawGraphで歩く、ジャンプ、攻撃とアニメーションを使い分ける方法についてです。
1、一次配列を使うと、0~8=攻撃、9~24=ジャンプ、25~32=歩くと煩雑になりますが
2、二次配列を使うと、
hero[攻撃][ac%8]
hero[ジャンプ][ac%16]
hero[歩く][ac%8]と表現できてわかりやくなると思いますが
LoaddivGraph関数で上記を実現することはできるのでしょうか?
3について
if文を使ってなんぼやってもうまくいかないと悩みまくっていたのに現実はこんな簡単なことで実現できるとは…
解決した喜びもあるのですが、こんな事で悩んでいたことにへこんでしまいそうです。
アニメーションについて…
すみません言葉足らずでした。やろうとしていることについてコードを載せて改めてご説明させていただきますと
#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;
}
DrawGraphで歩く、ジャンプ、攻撃とアニメーションを使い分ける方法についてです。
1、一次配列を使うと、0~8=攻撃、9~24=ジャンプ、25~32=歩くと煩雑になりますが
2、二次配列を使うと、
hero[攻撃][ac%8]
hero[ジャンプ][ac%16]
hero[歩く][ac%8]と表現できてわかりやくなると思いますが
LoaddivGraph関数で上記を実現することはできるのでしょうか?
3について
if文を使ってなんぼやってもうまくいかないと悩みまくっていたのに現実はこんな簡単なことで実現できるとは…
解決した喜びもあるのですが、こんな事で悩んでいたことにへこんでしまいそうです。
Re: DXライブラリでのアニメーションに方法について
返信いただきありがとうございます。
私のレベルでは、画像を分割して二次元配列に入れ込む方法がわからないので
そのやり方も聞いてみたかったのですが、まだ教えていただいても理解できるレベルに達していないのと
二次元配列で画像の管理はあまりおすすめしないとのことでしたので
取り合えず、教本でもあるように一次元配列と教授いただいた数字の途中からカウントを駆使して勉強していこうと思います。
解決ではあるのですが
理解できるレベルには達していないけど1つ仕組みについて気になる事があって
int handle1=LoadGraph("32*32size_gazou.png");
int handle2=LoadGraph("2560*1600size_gazou.png");
printf("%d",handle1);
printf("%d,handle2);
ってやってみると同じくらいの値が表示されました。
読み込んでる画像サイズによってhandleのデータサイズが変わるのかなと思ったのですが
一体、int handle達には何が入っているのですか?
私のレベルでは、画像を分割して二次元配列に入れ込む方法がわからないので
そのやり方も聞いてみたかったのですが、まだ教えていただいても理解できるレベルに達していないのと
二次元配列で画像の管理はあまりおすすめしないとのことでしたので
取り合えず、教本でもあるように一次元配列と教授いただいた数字の途中からカウントを駆使して勉強していこうと思います。
解決ではあるのですが
理解できるレベルには達していないけど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ライブラリでのアニメーションに方法について
データサイズが入るわけではありません。
識別ハンドルが格納されています。
DXライブラリの中で
32*32size_gazou.png は 1111
2560*1600size_gazou.png は 2222
の番号で管理する
というような取り決めがあり、その管理番号が返ってきているだけでprintfでその値を表示しても何の意味も無いです。
DXライブラリの内部にしか意味が分からない数値です。
識別ハンドルが格納されています。
DXライブラリの中で
32*32size_gazou.png は 1111
2560*1600size_gazou.png は 2222
の番号で管理する
というような取り決めがあり、その管理番号が返ってきているだけでprintfでその値を表示しても何の意味も無いです。
DXライブラリの内部にしか意味が分からない数値です。
Re: DXライブラリでのアニメーションに方法について
管理人さん、どうもです。
なるほどです。
まだまだ知らなくてよい領域または知らなくてもよい領域っぽいですね。
すっきりしました。ありがとうございました。
またよろしくお願いします。
なるほどです。
まだまだ知らなくてよい領域または知らなくてもよい領域っぽいですね。
すっきりしました。ありがとうございました。
またよろしくお願いします。