敵キャラの表示2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
湘南七夕

敵キャラの表示2

#1

投稿記事 by 湘南七夕 » 18年前

すみません。ソースを表示するのがうまくいきませんでした。
#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);

}
パタパタと一人降りてきて、二人目は画面上部でちょっとだけ見えています。

ぷ~

Re:敵キャラの表示2

#2

投稿記事 by ぷ~ » 18年前

Justyさんの指摘されている通り、
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

#3

投稿記事 by 湘南七夕 » 18年前

早速の返事ありがとうございます。自分なりに括弧を整理してみたのですが、やはりうまく動きません。プログラム自体がよく判っていないのかもしませんが、一人目がゆっくり降りてくるときに、二人目がさっと降りてきて(移動量が違うのは判ります)これで終わります。一人目が降りたら二人目が降りてきて上に上がるはずなのですがやはり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

#4

投稿記事 by ぷ~ » 18年前

ぷ~です。

えーと、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

#5

投稿記事 by 湘南七夕 » 18年前

アドバイスありがとうございました。熱を出して寝込んでしまってお返事が遅くなりました。
敵が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 ) ;
	}
}

閉鎖

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