すみません。ソースを表示するのがうまくいきませんでした。
#include "DxLib.h"
#include <math.h>
#define PI 3.141593
struct data{
double x;
double y;
double size;
int flag;
int counter;
int hp;
int pattern;
};
struct data enemy[100];
void EnemyCalcDisp();
void EnemyPattern1(int i);
void EnemyPattern2(int i);
void EnemyPattern3(int i);
void EnemyPattern4(int i);
void EnemyControl();
/* グローバル宣言 */
int counter=0;
char Key[256];
int img_enemy1[5];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int RefreshTime=0;
// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen( DX_SCREEN_BACK ) ;
// BMP画像のメモリへの読みこみ
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png");
for(int i=0;i<100;i++)
enemy.flag=0;
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
{
RefreshTime = GetNowCount();
ClearDrawScreen(); //裏画面のデータを全て削除
EnemyControl();
EnemyCalcDisp();
ScreenFlip();
counter++;
if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
void EnemyCalcDisp(){
int i;
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
switch(counter){
case 50:
enemy.pattern=1; //どういう軌道を描くか
enemy.flag=1; //出現フラグを立てる
enemy.counter=0;//出現して何カウント目か測るカウンター初期化
enemy.size=0.5f;//敵の大きさ
enemy.x=100.0; //xの初期座標
enemy.y=-10.0; //yの初期座標
break;
case 200:
enemy.pattern=2;
enemy.flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
case 350:
enemy[i].pattern=3;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
case 500:
enemy[i].pattern=4;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
default:
break;
}
int enemy_img[8]={0,1,2,3,4,3,2,1};
for(i=0;i<100;i++)
if(enemy[i].flag==1)
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;
if(enemy[i].x<0.0-140/2.0*enemy[i].size || enemy[i].x>420.0+140/2.0*enemy[i].size ||
enemy[i].y<0.0-128/2.0*enemy[i].size || enemy[i].y<0.0-128/2.0*enemy[i].size)
enemy[i].flag=0;
}
void EnemyPattern1(int i){
enemy[i].y+=1.5;
}
void EnemyPattern2(int i){
if(enemy[i].counter<50)
enemy[i].y+=4.0f;
if(enemy[i].counter>50 && enemy[i].counter<100)
enemy[i].y+=0;
if(enemy[i].counter>100)
enemy[i].y-=4.0f;
}
void EnemyPattern3(int i){
enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f;
enemy[i].y+=1.5f;
}
void EnemyPattern4(int i){
if(enemy[i].counter<100)
enemy[i].y+=2.5f;
if(enemy[i].counter>=100){
enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f;
enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f;
}
}
void EnemyControl(){
for(int i=0;i<100;i++)
if(enemy[i].flag==1)
if(enemy[i].pattern==1)
EnemyPattern1(i);
if(enemy[i].pattern==2)
EnemyPattern2(i);
if(enemy[i].pattern==3)
EnemyPattern3(i);
if(enemy[i].pattern==4)
EnemyPattern4(i);
}
パタパタと一人降りてきて、二人目は画面上部でちょっとだけ見えています。
敵キャラの表示2
Re:敵キャラの表示2
Justyさんの指摘されている通り、
for文の構文がおかしいため、
for(int i=0;i<100;i++)
if(enemy.flag==1)
if(enemy.pattern==1)
EnemyPattern1(i);
のところでforのループが終わってるような気がします。
さらにi=100となってループを抜けた後にパターン2のif文に処理が移ってませんか?
"{","}"をよく確認されてみてください。
for文の構文がおかしいため、
for(int i=0;i<100;i++)
if(enemy.flag==1)
if(enemy.pattern==1)
EnemyPattern1(i);
のところでforのループが終わってるような気がします。
さらにi=100となってループを抜けた後にパターン2のif文に処理が移ってませんか?
"{","}"をよく確認されてみてください。
Re:敵キャラの表示2
早速の返事ありがとうございます。自分なりに括弧を整理してみたのですが、やはりうまく動きません。プログラム自体がよく判っていないのかもしませんが、一人目がゆっくり降りてくるときに、二人目がさっと降りてきて(移動量が違うのは判ります)これで終わります。一人目が降りたら二人目が降りてきて上に上がるはずなのですがやはりEnemyControl()のところでしょうか。
#include "DxLib.h" #include <math.h> #define PI 3.141593 struct data{ double x; double y; double size; int flag; int counter; int hp; int pattern; }; struct data enemy[100]; void EnemyCalcDisp(); void EnemyPattern1(int i); void EnemyPattern2(int i); void EnemyPattern3(int i); void EnemyPattern4(int i); void EnemyControl(); /* グローバル宣言 */ int counter=0; char Key[256]; int img_enemy1[5]; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int RefreshTime=0; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetDrawScreen( DX_SCREEN_BACK ) ; img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png"); img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png"); img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png"); img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png"); img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png"); for(int i=0;i<100;i++) { enemy.flag=0; } while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0) { RefreshTime = GetNowCount(); ClearDrawScreen(); EnemyControl(); EnemyCalcDisp(); ScreenFlip(); counter++; if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了 while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } void EnemyCalcDisp() { int i; for(i=0;i<100;i++) { if(enemy.flag==0) break; } switch(counter){ case 50: enemy.pattern=1; //どういう軌道を描くか enemy.flag=1; //出現フラグを立てる enemy.counter=0;//出現して何カウント目か測るカウンター初期化 enemy.size=0.5f;//敵の大きさ enemy.x=100.0; //xの初期座標 enemy.y=-10.0; //yの初期座標 break; case 200: enemy.pattern=2; enemy.flag=1; enemy[i].counter=0; enemy[i].size=0.5f; enemy[i].x=100.0; enemy[i].y=-10.0; break; case 350: enemy[i].pattern=3; enemy[i].flag=1; enemy[i].counter=0; enemy[i].size=0.5f; enemy[i].x=100.0; enemy[i].y=-10.0; break; case 500: enemy[i].pattern=4; enemy[i].flag=1; enemy[i].counter=0; enemy[i].size=0.5f; enemy[i].x=100.0; enemy[i].y=-10.0; break; default: break; } for(i=0;i<100;i++) { if(enemy[i].flag==1) { DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ; if(enemy[i].x<0.0-140/2.0*enemy[i].size || enemy[i].x>420.0+140/2.0*enemy[i].size || enemy[i].y<0.0-128/2.0*enemy[i].size || enemy[i].y<0.0-128/2.0*enemy[i].size) enemy[i].flag=0; } } } void EnemyPattern1(int i) { enemy[i].y+=1.5; } void EnemyPattern2(int i) { if(enemy[i].counter<50) enemy[i].y+=4.0f; if(enemy[i].counter>100) enemy[i].y-=4.0f; } void EnemyPattern3(int i) { enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f; enemy[i].y+=1.5f; } void EnemyPattern4(int i) { if(enemy[i].counter<100) enemy[i].y+=2.5f; if(enemy[i].counter>=100) { enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f; enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f; } } void EnemyControl() { for(int i=0;i<100;i++) { if(enemy[i].flag==1) { if(enemy[i].pattern==1) EnemyPattern1(i); if(enemy[i].pattern==2) EnemyPattern2(i); if(enemy[i].pattern==3) EnemyPattern3(i); if(enemy[i].pattern==4) EnemyPattern4(i); } } }
Re:敵キャラの表示2
ぷ~です。
えーと、C言語素人の私が言うのも何なんですが・・・
今、引っかかっているのは「2体目の敵の軌道が思い通りにいっていない」
と言うことでよろしいでしょうか。
3体目以降はうまくいっているのかな?
それは置いといて、なぜ2体目がうまく動かないかと言うと、
enemy.counter の値が変わっていないからではないでしょうか?
グローバル変数のcounterと思いっきり混同しやすいですが、別ですよね?
EnemyPattern2 のところで座標をセットし終わった後に、enemy.counterの値を増減されてはどうでしょう?
enemy.counter++;
なのかな?
enemy.counter+=counter;
なのかな?
そうすればうまくいきそうな気がしませんか?(全く検証していない投げやりな意見ですみません^^;)
また、
DrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[0] , TRUE ) ;
ですが、「img_enemy1[0]」と画像ファイル固定になってますが??
「img_enemy1」ですか?
えーと、C言語素人の私が言うのも何なんですが・・・
今、引っかかっているのは「2体目の敵の軌道が思い通りにいっていない」
と言うことでよろしいでしょうか。
3体目以降はうまくいっているのかな?
それは置いといて、なぜ2体目がうまく動かないかと言うと、
enemy.counter の値が変わっていないからではないでしょうか?
グローバル変数のcounterと思いっきり混同しやすいですが、別ですよね?
EnemyPattern2 のところで座標をセットし終わった後に、enemy.counterの値を増減されてはどうでしょう?
enemy.counter++;
なのかな?
enemy.counter+=counter;
なのかな?
そうすればうまくいきそうな気がしませんか?(全く検証していない投げやりな意見ですみません^^;)
また、
DrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[0] , TRUE ) ;
ですが、「img_enemy1[0]」と画像ファイル固定になってますが??
「img_enemy1」ですか?
Re:敵キャラの表示2
アドバイスありがとうございました。熱を出して寝込んでしまってお返事が遅くなりました。
敵が4体降りてきて、これで正解のようです。
img_enemy[0]のところは、本当は配列にいくつが画像を入れてアニメさせるのですが、ド素人のためわざと固定でアニメさせていないためです。ありがとうございました。
敵が4体降りてきて、これで正解のようです。
img_enemy[0]のところは、本当は配列にいくつが画像を入れてアニメさせるのですが、ド素人のためわざと固定でアニメさせていないためです。ありがとうございました。
#include "DxLib.h" #include <math.h> #define PI 3.141593 struct data{ double x; double y; double size; int flag; int counter; int hp; int pattern; }; struct data enemy[100]; void EnemyDisp(); void EnemyPattern1(int i); void EnemyPattern2(int i); void EnemyPattern3(int i); void EnemyPattern4(int i); void EnemyControl(); void EnemyCalc(); /* グローバル宣言 */ int counter=0; char Key[256]; int img_enemy1[5]; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int RefreshTime=0; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetDrawScreen( DX_SCREEN_BACK ) ; img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png"); img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png"); img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png"); img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png"); img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png"); for(int i=0;i<100;i++) { enemy.flag=0; } while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0) { RefreshTime = GetNowCount(); ClearDrawScreen(); EnemyCalc(); EnemyControl(); EnemyDisp(); ScreenFlip(); counter++; if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了 while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } void EnemyCalc(){ int i; for(i=0;i<100;i++) { if(enemy.flag==0) break; } switch(counter){ case 100: case 150: case 200: case 250: enemy.flag=1; //出現フラグを立てる enemy.counter=0;//出現して何カウント目か測るカウンター初期化 enemy.pattern=1; //どういう軌道を描くか enemy.size=0.5f;//敵の大きさ enemy.x=100.0; //xの初期座標 enemy.y=-10.0; //yの初期座標 break; default: break; } } void EnemyPattern1(int i) { enemy.y+=1.5; } void EnemyPattern2(int i) { if(enemy.counter<50) enemy[i].y+=4.0f; if(enemy[i].counter>100) enemy[i].y-=4.0f; } void EnemyPattern3(int i) { enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f; enemy[i].y+=1.5f; } void EnemyPattern4(int i) { if(enemy[i].counter<100) enemy[i].y+=2.5f; if(enemy[i].counter>=100) { enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f; enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f; } } void EnemyControl() { for(int i=0;i<100;i++) { if(enemy[i].flag==1) { if(enemy[i].pattern==1) EnemyPattern1(i); } } } void EnemyDisp() { for(int i=0;i<100;i++) { if(enemy[i].flag==1) DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ; } }