どうすればいいのでしょうか。
言語:C++
OS:Windows10
コンパイラ:VisualStudio2010
//Main.cpp
#include"Main.h"
#include"Player.h"
#include"Enemy.h"
PLAYER Player;
ENEMY Enemy[ENEMY_NUM];
int ProcessLoop(){
if(ProcessMessage() != 0){ return 0; }
if(ClearDrawScreen() != 0){ return 0; }
return 1;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
SetOutApplicationLogValidFlag(FALSE);
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 16);
SetBackgroundColor(0, 0, 0);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
Player.Init();
for(int i = 0; i < ENEMY_NUM; i++){
Enemy[i].Init(i);
}
while(ProcessLoop() && !CheckHitKey(KEY_INPUT_ESCAPE)){
Player.Update();
for(int i = 0; i < ENEMY_NUM; i++){
Enemy[i].Update();
}
Player.Draw();
for(int i = 0; i < ENEMY_NUM; i++){
Enemy[i].Draw();
}
ScreenFlip();
}
DxLib_End();
return 0;
}
//Main.h
#ifndef _MAIN
#define _MAIN
#include"DxLib.h"
#define ENEMY_NUM (3)
struct VECTOR2{
float X;
float Y;
};
#endif
//Player.cpp
#include"Player.h"
#define PLAYER_MOVE_SPEED (5)
void PLAYER::Init(){
Pos.X = 320;
Pos.Y = 400;
}
void PLAYER::Update(){
if(CheckHitKey(KEY_INPUT_RIGHT)){
Pos.X += PLAYER_MOVE_SPEED;
}
if(CheckHitKey(KEY_INPUT_LEFT)){
Pos.X -= PLAYER_MOVE_SPEED;
}
if(CheckHitKey(KEY_INPUT_UP)){
Pos.Y -= PLAYER_MOVE_SPEED;
}
if(CheckHitKey(KEY_INPUT_DOWN)){
Pos.Y += PLAYER_MOVE_SPEED;
}
}
void PLAYER::Draw(){
DrawCircle((int)Pos.X, (int)Pos.Y, 20, GetColor(0,0,255), TRUE);
}
//Player.h
#ifndef _PLAYER
#define _PLAYER
#include"Main.h"
class PLAYER{
private:
VECTOR2 Pos;
public:
void Init();
void Update();
void Draw();
VECTOR2 GetPos(){ return Pos; }
};
#endif
//Enemy.cpp
#include"Enemy.h"
#include"Bullet.h"
ENEMY_BULLET EnemyBullet[ENEMY_NUM];
void ENEMY::Init(int i){
Number = i;
//座標の設定
Pos.X = 150.0f + 170.0f * Number;
Pos.Y = -50.0f;
SetShotInterval(); //次に撃つ弾の射撃間隔の設定
Life = 1000; //体力の設定
}
void ENEMY::Update(){
if(Life < 1){ return; } //敵が死んでたら入らない
ShotInterval--; //射撃までのカウントを減らす
if(ShotInterval < 0){
EnemyBullet[Number].Set(Number);
}
if(Pos.Y < 50){
Pos.Y += 1;
}
EnemyBullet[Number].Update();
}
void ENEMY::Draw(){
DrawCircle((int)Pos.X, (int)Pos.Y, 20, GetColor(255,0,0), TRUE);
for(int i = 0; i < ENEMY_NUM; i++){
EnemyBullet[i].Draw();
}
}
//Enemy.h
#ifndef _ENEMY
#define _ENEMY
#include"Main.h"
class ENEMY{
private:
VECTOR2 Pos; //座標
int Life; //体力
int ShotInterval; //次に撃つ弾の射撃間隔
int Number; //番号
public:
void Init(int i);
void Update();
void Draw();
VECTOR2 GetPos(){ return Pos; }
void SetShotInterval(){ ShotInterval = rand() % 200 + 100; }
};
#endif
//Bullet.cpp
#include"Bullet.h"
#include<math.h>
#include"Player.h"
#include"Enemy.h"
#define BULLET_SPEED (8)
#define BULLET_3WAY_ROT (25 * 3.14f / 180)
PLAYER Player2;
ENEMY Enemy2[ENEMY_NUM];
void ENEMY_BULLET::Set(int i){
if(!ShotFlag){
Number = i;
ShotFlag = true;
VECTOR2 PlayerPos = Player2.GetPos();
VECTOR2 EnemyPos = Enemy2[Number].GetPos();
float TargetRot = atan2f(PlayerPos.Y - EnemyPos.Y, PlayerPos.X - EnemyPos.X);
for(int j = 0; j < 3; j++){
Pos[j] = EnemyPos;
}
Vec[0].X = cosf(TargetRot - BULLET_3WAY_ROT) * BULLET_SPEED;
Vec[1].X = cosf(TargetRot) * BULLET_SPEED;
Vec[2].X = cosf(TargetRot + BULLET_3WAY_ROT) * BULLET_SPEED;
Vec[0].Y = sinf(TargetRot - BULLET_3WAY_ROT) * BULLET_SPEED;
Vec[1].Y = sinf(TargetRot) * BULLET_SPEED;
Vec[2].Y = sinf(TargetRot + BULLET_3WAY_ROT) * BULLET_SPEED;
}
}
void ENEMY_BULLET::Update(){
if(ShotFlag){
for(int i = 0; i < 3; i++){
Pos[i].X += Vec[i].X;
Pos[i].Y += Vec[i].Y;
}
if(Pos[0].Y > 480 && Pos[1].Y > 480 && Pos[2].Y > 480){
ShotFlag = false;
Enemy2[Number].SetShotInterval(); //次に撃つ弾の射撃間隔の設定
}
}
}
void ENEMY_BULLET::Draw(){
if(ShotFlag){
for(int i = 0; i < 3; i++){
DrawCircle((int)Pos[i].X, (int)Pos[i].Y, 7, GetColor(255,255,0), TRUE);
}
}
}