>>ミスティさん
返信ありがとうございました。よく見たらページに書いてありましたね。よく読んでいませんでした。申し訳ありません
コード:
//main文
#include"Player.h"
#include"BackGround.h"
#include"Enemy.h"
#include"Box.h"
#pragma warning(disable:4996)
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
ChangeWindowMode(true);
if(DxLib_Init()==-1)
{
return -1;
}
SetTransColor(0,255,255);
SetDrawScreen(DX_SCREEN_BACK);
Player *hero=new Player(1,-4,7);
Box *asiba[3];
for(int i=0;i<3;i++)
{
asiba[0]=new Box(30,230);
asiba[1]=new Box(140,180);
asiba[2]=new Box(299,200);
}
BackGround *haikei[2];
for(int i=0;i<2;i++)
{
haikei[0]=new BackGround(0,0);
haikei[1]=new BackGround(630,0);
}
FILE* fp;//
data enemydata[3];//構造体
char buf[100];//バッファ
int c=0;
int col=1;//列
int row=0;//行
//バッファ初期化
memset(buf,0,sizeof(buf));
fp = fopen("EnemyData.csv","r");//ファイルを開く
while(fgetc(fp)!='\n');//ヘッダーを読み飛ばす。
while(1)
{
while(1)
{
if(c==EOF) break;//ファイルの終わりに来たらループを抜ける。
c=fgetc(fp);//fpに入れたファイルの文字を一文字ずつ読み込む
if(c!=','&&c!='\n') strcat(buf,(const char*)&c);//カンマ化改行でなければ文字としてつなげる
else break;//カンマが抜けたらループを抜ける。
}
switch(col)
{
//セルに書かれた文字をatoi()で数値に変更。
case 1:enemydata[row].x=atoi(buf);break;
case 2:enemydata[row].y=atoi(buf);break;
case 3:enemydata[row].speed=atoi(buf);break;
case 4:enemydata[row].CMAX=atoi(buf);break;
}
memset(buf,0,sizeof(buf));//バッファ初期化
col++;//列数を足す
if(c=='\n')//読み込んだ文字が改行なら
{
col=1;//列数を1に戻す
row++;//行を増やす。=CSVの下の行に移動
}
}
Enemy *monster[3];
for(int i=0;i<3;i++)//オブジェクト生成
{
monster[i]=new Enemy(enemydata[i].x,enemydata[i].y,enemydata[i].speed,enemydata[i].CMAX);
}
/*for(int i=0;i<3;i++)
{
monster[0]=new Enemy(200,360,0.5,90);
monster[1]=new Enemy(400,360,0.5,90);
monster[2]=new Enemy(600,360,0.5,90);
}
*/
while(true)
{
ClearDrawScreen();
//背景の描画
for(int i=0;i<2;i++)
{
haikei[i]->BackDraw();
haikei[i]->BackScroll(hero->GetX());
}
//-----------------------
bool a[2];
//適当な配列を二個生成
/*for(int i=0;i<2;i++)
{
a[i] = haikei[0]->GetScrollFlag();//両方にScrollFlagを取った関数を代入
}
*/
//以下、敵に関する情報
for(int i=0;i<3;i++)
{
monster[i]->EnemyScroll(a,(int)hero->GetX());
monster[i]->EnemyDraw();
monster[i]->DamageCheck((int)hero->GetX(),(int)hero->GetY(),(int)hero->GetW(),(int)hero->GetH(),hero->GetAFlag());
monster[i]->EnemyMove();
}
/*
for(int i=3;i<7;i++)
{
monster[i]->EnemyScroll(a,(int)hero->GetX());
monster[i]->EnemyDraw();
monster[i]->DamageCheck((int)hero->GetX(),(int)hero->GetY(),(int)hero->GetW(),(int)hero->GetH(),hero->GetAFlag());
}
*/
//ここから下はプレイヤーの動き
hero->PlayerMove(a);
hero->PlayerAtack();
hero->Doge();
hero->PlayerJump();
hero->PreChakchi();
for(int i=0;i<3;i++)
{
hero->PlayerChakchi(asiba[i]->GetX(),asiba[i]->GetY(),asiba[i]->GetW(),asiba[i]->GetH());
}
for(int i=0;i<3;i++)
{
hero->PDamageCheck(monster[i]->GetEX(),monster[i]->GetEY(),monster[i]->GetEW(),monster[i]->GetEH(),monster[i]->GetFlag());
}
hero->PlayerDraw();
for(int i=0;i<3;i++)
{
asiba[i]->BoxDraw();
}
//DrawFormatString(500,450,-1,"敵データ:%d",enemydata[2].x);
ScreenFlip();
if(CheckHitKey(KEY_INPUT_ESCAPE) || ProcessMessage()==-1) break;
}
delete hero;
for(int i=0;i<3;i++)
{
delete asiba[i];
}
for(int i=0;i<2;i++)
{
delete haikei[i];
}
for (int i=0;i<3;i++)
{
delete monster[i];
}
DxLib_End();
return 0;
}
コード:
//Enemy.h
#pragma once
#ifndef H_ENEMY
#define H_ENEMY
#include"Struct.h"
#include"Player.h"
class Enemy
:public Player
{
private:
data rect;
bool Flag;
int SX;
int MoveCount;//XまたはY座標にどれだけ動いたかを数える
float MoveWay;
public:
Enemy(float x,float y,float speed,int CMAX);
~Enemy();
void EnemyScroll(bool SF,int pX);
void EnemyMove();
void EnemyDraw();
void DamageCheck(int pX,int pY,int pW,int pH,bool paF);
void SetFlag(bool SF);
bool GetFlag();
int GetEX();
int GetEY();
int GetEW();
int GetEH();
int GetHP();
};
typedef enum tag_Move{Nomove,Pattern1,Pattern2,Pattern3}Move;
#endif
コード:
#include"Enemy.h"
Enemy::Enemy(float x,float y,float speed,int CMAX):Player(this->rect.x,this->rect.y,this->HP)
{
this->rect.x=x;
this->rect.y=y;
this->rect.Graph=LoadGraph("img/wall.png");
this->Flag=true;
GetGraphSize(this->rect.Graph,&this->rect.w,&this->rect.h);
this->MoveWay=0;
this->MoveCount=0;
this->rect.speed=speed;
this->rect.CMAX=CMAX;
this->HP=HP;
}
Enemy::~Enemy()
{}
void Enemy::EnemyScroll(bool SF,int pX)
{
this->PadINPUT=GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(SF==true&&this->PadINPUT&PAD_INPUT_RIGHT&&pX>300)
{
this->rect.x-=2;
if(CheckHitKey(KEY_INPUT_Z))
{
this->rect.x-=3;
}
}
}
void Enemy::EnemyMove()
{
if(this->MoveWay==0)
{
this->rect.x-=this->rect.speed;
this->MoveCount++;
if(this->MoveCount>=this->rect.CMAX)
{
this->MoveCount=0;
this->MoveWay=1;
}
}
if(this->MoveWay==1)
{
this->rect.x+=this->rect.speed;
this->MoveCount++;
if(this->MoveCount>=this->rect.CMAX)
{
this->MoveCount=0;
this->MoveWay=0;
}
}
}
void Enemy::DamageCheck(int pX,int pY,int pW,int pH,bool paF)
{
if(this->Flag==true)
{
if(paF==true)
{
if(((pX>=this->rect.x&&pX<=this->rect.x+this->rect.w)||
(this->rect.x>=pX&&this->rect.x<=pX+pW))&&
((pY>=this->rect.y&&pY<=this->rect.y+this->rect.h)||
(this->rect.y>=pY&&this->rect.y<=pY+pH)))
{
this->HP-=1;
if(this->HP<=0)
{
this->Flag=false;
}
}
}
}
}
void Enemy::SetFlag(bool SF)
{
this->Flag=SF;
}
bool Enemy::GetFlag()
{
return this->Flag;
}
int Enemy::GetEX()
{
return this->rect.x;
}
int Enemy::GetEY()
{
return this->rect.y;
}
int Enemy::GetEW()
{
return this->rect.w;
}
int Enemy::GetEH()
{
return this->rect.h;
}
int Enemy::GetHP()
{
return this->HP;
}
void Enemy::EnemyDraw()
{
if(this->Flag==true)
{
DrawGraph((int)this->rect.x,(int)this->rect.y,(int)this->rect.Graph,true);
}
//DrawFormatString(460,20,GetColor(255,255,0),"敵のY:%f",this->rect.y);
if(this->Flag==true)
{
DrawBox((int)this->rect.x,(int )this->rect.y,((int)this->rect.x+(int)this->rect.w),(int)this->rect.y+(int)this->rect.h,-1,false);
}
/*
for(int i=0;i<3;i++)
{
DrawFormatString(550,60,GetColor(255,255,0),"方向:%f",this->MoveCount);
}
*/
}
コード:
//data構造体
#pragma once
#ifndef H_STRUCT
#define H_STRUCT
#include"DXlib.h"
typedef struct tag_data
{
float x,y;//座標(敵、プレイヤー共通)
int CMAX;//敵が動く限界これを超えると反対に移動する。
float speed;//敵が動くスピード
int h,w;//絵の幅と高さ(プレイヤー、敵共通)
int Graph,AGrah;//Graph=普通の絵を入れる(プレイヤー敵共通、AGraph=プレイヤーが攻撃するときの絵)
}data;
#endif
コード:
//CSV(エクセルで作った)
x座標,y座標,速さ,動ける範囲
200,390,0.6,80
100,100,1,60
300,380,0.7,80
ファイル読み込みはmain文の40~90行目です。ファイル処理をmain文に書いてしまっていますが、後で修正します。今は、ファイル読み込みを成功させることだけを考えているので。怪しいと思っているのが59行目だと私は考えているのですが、解決策が見つかりません。「~.exeは動作を停止しました。」と出てしまいます。そして、55行目のwhile文を消そうとすると、敵が出てこなくなります。何かこうしたほうがいい、自分はこうしているというものなどがあれば、回答してくださると助かります。結構長い時間悩んでいます。どうかよろしくお願いします。
後、書き忘れていましたが、環境はvisual studio2010 のDXライブラリを使っています。
以下は自分がファイル読み込みをする時に参考にしたURLです。
http://bituse.info/game/shot/11