ページ 11

画像に動きをつける

Posted: 2010年9月05日(日) 21:52
by 麻耶
お世話になってます。
また、こちらに書き込んでしまいすみません;

画像を分割して読み込み、動きを付けたいと思うのですが
イマイチ分からないので教えて下さい。

添付した画像を使って動きを付けたいのですが
int image[2];
LoadDivGraph( "○○.bmp" , 2 , 2 , 60 , 60 , image ) ;

これで良いのでしょうか?
ゲームプログラミングの館のほうを見てやってみたんですが
縦の画像枚数が無いのであえて書かなかったのですが
大丈夫ですかね・・。

Re:画像に動きをつける

Posted: 2010年9月05日(日) 22:00
by 釣り師
>LoadDivGraph( "○○.bmp" , 2 , 2 , 60 , 60 , image ) ;
>これで良いのでしょうか?
>ゲームプログラミングの館のほうを見てやってみたんですが
>縦の画像枚数が無いのであえて書かなかったのですが
そんなことしちゃいけませんよ。絶対エラーになります。


とりあえず、縦の枚数はかならず「1」になるはずですよ。縦*横で2。この場合は1*2になるはずです。
1*2で分割画像総数2枚になります。
LoadDivGraph( "○○.bmp" ,2 , 1 , 2 , 60 , 60 , image ) ;
にしましょう。 画像

Re:画像に動きをつける

Posted: 2010年9月05日(日) 22:04
by 麻耶
DecentLoveさん

なるほど・・!ありがとうございます!
1で良かったんですね。

また、↑の画像を2枚にわけて
それを関数で1つの画像にして動きをつけることって出来ますか・・?

Re:画像に動きをつける

Posted: 2010年9月05日(日) 22:14
by 釣り師
動きをつけるとは、どういうことでしょう?
交互に描画するということになりますかね?

僕もC++初心者なのであまり的確なことはできませんが、
龍神録プログラミングの館のコードの1つに
void calc_ch(){
ch.cnt++;
ch.img=(ch.cnt%24)/6;
}
とあります。
ch.imgが描画する画像を表しています。
このコードは一定周期で描画する画像を変更していますので、キャラの服が風にたなびく映像を描画できます。

なので、この場合 メインループの中に
int i ;
とでも1つ宣言しておいて

i++;
image = i%2 ;

というのを追加すれば2つの画像を交互に描画できるはずです。

もしかしたら、色々間違ってるかもしれません。

Re:画像に動きをつける

Posted: 2010年9月05日(日) 22:32
by 麻耶
DecentLoveさん
お早いお返事ありがとうございます!

我侭なことを言って大変お手数かけてしまい申し訳ないのですが
11章で自キャラと敵キャラの変更をしたいのですが
画像を変える場合はload.cpp main.cpp graph.cppを変更すれば大丈夫でしょうか・・。

色々と書いてしまいすみません;

Re:画像に動きをつける

Posted: 2010年9月05日(日) 22:37
by 釣り師
おそらく画像を変えるだけならば、画像を読み込んでいるところだけ変えてしまえばいいのではないでしょうか?


僕もまだそこら辺はまだ完全に慣れていないところがありますので^^;。正確ではないかもしれません。

Re:画像に動きをつける

Posted: 2010年9月06日(月) 00:24
by 麻耶
見当たるところ全部変えてみたんですが
なかなか上手くいかなくて・・;

デバッグ実行した時もエラーの警告は出ずに
デバッグしたときの画面に画像が表示されなくてorz

何がいけないんでしょうか;

Re:画像に動きをつける

Posted: 2010年9月06日(月) 13:58
by 麻耶
最終的に一番上の画像を添付した画像みたいにエンジンら辺をパカパカさせたいのですが

load.cppはコレであってますでしょうか・・・。何度やっても画像が出なくてわからなくて;
ファイル名はk5.pngで、一番上の画像を使っています。

#include "../include/GV.h"

void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/k5.png" , 2 , 1 , 2 , 60 , 60 ,img_ch[0]) ;
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
}

//敵の出現情報をエクセルから読み込んで格納する関数
void load_story(){
int n,num,i,fp;
char fname[32]={"../dat/csv/11章/storyH0.csv"};
int input[64];
char inputc[64];

fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');

n=0 , num=0;
while(1){
for(i=0;i<64;i++){
inputc=input=FileRead_getc(fp);//1文字取得する
if(inputc=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input==',' || input=='\n'){//カンマか改行なら
inputc='\0';//そこまでを文字列とし
break;
}
if(input==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}

おかしなエラーも表示されずに、ただデバッグすると画像が出てきません・・。
どこがおかしいんでしょうか・・・。 画像

Re:画像に動きをつける

Posted: 2010年9月06日(月) 21:53
by 釣り師
うむむ…。
エラーが表示されないのでしたら、描画などのものがないのでは?

すみません!これ以上は僕ではお手上げです!ごめんなさい。
他に、どなたかいらっしゃいましたら、引き続き回答の方お願いできませんでしょうか
すみません。

Re:画像に動きをつける

Posted: 2010年9月06日(月) 21:55
by シエル
とりあえず、いらないコードは消してパカパカ光らせる動作のコードだけ書いてみてはどうですか?

Re:画像に動きをつける

Posted: 2010年9月06日(月) 22:28
by 麻耶
DecentLove さん
親身になって色々アドバイスくださってありがとうございます;
勉強不足で逆に困らせてしまってすみませんでした;
ありがとうございます!

シエルさん
反応ありがとうございます。
パカパカ光らせるコードですか・・!
こんなこと言って申し訳ないのですが
どこら辺消せばいいですかね・・。

C言語プログラミングの館のほうを見たら
動かすのには最低16枚必要と書いてあったのですが
16枚はないとやっぱ難しいですかね・・、
2枚を交互に表示して動いてるように見せるのでは
厳しいでしょうか・・。

LoadDivGraph( "../dat/img/char/k5.png" , 2 , 1 , 2 , 60 , 60 ,img_ch[0]) ;

Re:画像に動きをつける

Posted: 2010年9月06日(月) 22:36
by MAY
横からすみません。
16枚必要というのは4方向×4枚という意味であって
別に16枚ないといけないわけではありません。

Re:画像に動きをつける

Posted: 2010年9月06日(月) 23:26
by シエル
画像が横に2枚並んでいるのであれば、LoadDivGraph("char.png",2,2,1,54,54,gh);とかけばいいと思います。

これは総画像数が2、横分割数が2、縦分割数が1、画像一つ分の横と縦の長さが
54のものを読み込んでいるわけです。

で、以下が0.25秒ごとに画像をパカパカ切り換えてるコードです。

普段DXライブラリは一切使わないので、間違っているかもしれませんが、よろしくお願いします。

#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化



int flag=0;

int count=0;
int gh[2];

LoadDivGraph("char.png",2,2,1,54,54,gh);


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


//ココ!!

if(flag){
DrawGraph(100,100,gh[0],TRUE);
}else{
DrawGraph(100,100,gh[1],TRUE);
}

if(count%15==0){//0.25秒ごとにフラグを反転
flag^=1;
}


++count;
Sleep(16);


ScreenFlip();
}

DxLib_End();
return 0;
}

画像

Re:画像に動きをつける

Posted: 2010年9月06日(月) 23:26
by wing
GV.hで
int img_ch[2][12]となっているのを
int img_ch[2][2]か、あるいは適切に変えていますか?

Re:画像に動きをつける

Posted: 2010年9月06日(月) 23:28
by wing
すいません。
変えているようですね。
失礼しました。

Re:画像に動きをつける

Posted: 2010年9月06日(月) 23:34
by wing
>LoadDivGraph( "../dat/img/char/k5.png" , 2 , 1 , 2 , 60 , 60 ,img_ch[0]) ;

これは、2, 1, 2,
ではなく、2, 2, 1,ではないですか?

Re:画像に動きをつける

Posted: 2010年9月06日(月) 23:47
by wing
すいません。
これもシエルさんがちゃんと指摘していましたね。

私は最近どうも調子が悪いようです。
本当に失礼しました。

予断ですが、最近「ギンギラパラダイス2」のリーチアクションを
まねしてみようと暇があればパチンコ屋に通っています。
ちょっとパチンコのやりすぎのようです。反省。

Re:画像に動きをつける

Posted: 2010年9月07日(火) 00:42
by 麻耶
シエルさん

お手数かけてすみません・・!コードまでありがとうございますorz
load.cppを修正してみたんですがやっぱり駄目でした;
初心者な私がこんな生意気なこと言って申し訳ないのですが
LoadDivGraph("char.png",2,2,1,54,54,gh); のChar.pngって
"../dat/img/char/k5.png"で、画像を呼んだらダメですかね・・。

画像はいちばん上の隣同士になっている自機画像を使ってやってみましたが
Char.pngも"../dat/img/char/k5.png"もダメだったみたいで;:

ほかのファイルがなにか変更し忘れているんですかね・・。

Re:画像に動きをつける

Posted: 2010年9月07日(火) 00:43
by 麻耶
wingさん
いえいえ!
助けて下さりありがとうございます!

Re:画像に動きをつける

Posted: 2010年9月07日(火) 07:23
by シエル
麻耶さん

駄目だったとは具体的にどう駄目だったのでしょうか?
エラーが出たのか、画像が表示されなかったのかなど、具体的に説明していただかないと、
的確なアドバイスが出来ません。

ちなみに私の先ほどのコードで動作確認はしております。
新しくプロジェクトごと作成しなおして、すべてコピペし、
プロジェクトファイルがあるフォルダに画像一つの大きさが54×54の大きさの画像が横に
2枚ならんだものをchar.pngという名前で放り込んでやれば、動きます。

Re:画像に動きをつける

Posted: 2010年9月07日(火) 08:15
by DVDM
>>麻耶さん
DxLib で使える関数の一部を本家リファレンスより拾ってきました。
LoadDicGraph:http://homepage2.nifty.com/natupaji/DxL ... .html#R3N3
DrawGraph:http://homepage2.nifty.com/natupaji/DxL ... .html#R3N7


[color=gray>> LoadDivGraph("char.png",2,2,1,54,54,gh); のChar.pngって
> "../dat/img/char/k5.png"で、画像を呼んだらダメですかね・・。[/color]
画像の名前を変更しても
画像の名前や分割数、グラフィックハンドルの指定が間違っていなければ大丈夫です。
一応確認しておきますが、

・読み込み、描画関数が呼ばれているか
・ファイルパスや画像の名前が間違っていないか
・gh が指定されているグラフィックハンドル(img_ch?)の定義がしっかり行われているか
・描画の際、読み込んだ時のグラフィックハンドル(img_ch?)を指定出来ているか


など、もう一度確認してみて下さい。

エラーが出ずに画像が表示されないとのことなのでなんとなく関数が呼ばれていないような気がしますが
No:61115 で提示された麻耶さんのソースからは判断できませんでしたので、
駄目そうなら関連するソースを提示頂かなくては対応できないです。