今回も同じことでの質問になりますが、どうかよろしくお願いします。
main,cpp
#include"DxLib.h"
#include"Game.h"
// main関数の開始
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE) ; // debug用ウィンドウサイズ
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先画面を裏画面にする
CGame Game;
while (1) {
ClearDrawScreen() ; // 画面クリア
// 本文の記述
Game.process();
ScreenFlip() ; // redraw 1
WaitTimer(17) ; // 約60fps
if (ProcessMessage() == -1 ) break ; // windowsメッセージ処理
if ( CheckHitKey(KEY_INPUT_ESCAPE ) == 1) break ; // escキーで終了
}
DxLib_End() ;//DXライブラリ終了処理
return 0 ;
}
class CMyBulletManage;
class CMyShip{
private:
int x,y;
enum{v=3};
public:
CMyShip();
void Move();
const void Draw();
int Getx();
int Gety();
};
#include"DxLib.h"
#include"MyShip.h"
#include"MyBullet.h"
CMyShip::CMyShip(){
CMyShip::x=320;
CMyShip::y=440;
}
void CMyShip::Move(){
if(CheckHitKey(KEY_INPUT_LEFT)==1){
CMyShip::x-=CMyShip::v;
if(CMyShip::x<0) CMyShip::x=0;
}
if(CheckHitKey(KEY_INPUT_UP)==1){
CMyShip::y-=CMyShip::v;
if(CMyShip::y<0) CMyShip::y=0;
}
if(CheckHitKey(KEY_INPUT_RIGHT)==1){
CMyShip::x+=CMyShip::v;
if(CMyShip::x>640-24) CMyShip::x=616;
}
if(CheckHitKey(KEY_INPUT_DOWN)==1){
CMyShip::y+=CMyShip::v;
if(CMyShip::y>454) CMyShip::y=454;
}
}
const void CMyShip::Draw(){
DrawString(CMyShip::x,CMyShip::y,"▲",0xffffff);
}
int CMyShip::Getx(){
return CMyShip::x;
}
int CMyShip::Gety(){
return CMyShip::y;
}
class CMyShip;
class CMyBullet{
private:
bool f;
int x,y;
enum{v=4};
public:
CMyBullet();
void Move();
void Set(int x,int y);
bool IsAllocated();
const void Draw();
int Getx();
int Gety();
};
class CMyBulletManage{
private:
enum{MY_BULLET_MAX=20};
CMyBullet MyBullet[MY_BULLET_MAX];
public:
void MoveBullet();
const void DrawBullet();
void SetBullet(int x,int y);
};
#include"DxLib.h"
#include"MyShip.h"
#include"MyBullet.h"
CMyBullet::CMyBullet(){
CMyBullet::f=FALSE;
CMyBullet::x=0;
CMyBullet::y=0;
}
void CMyBullet::Set(int x,int y){
CMyBullet::f=true;
CMyBullet::x=x;
CMyBullet::y=y;
}
void CMyBullet::Move(){
CMyBullet::y-=CMyBullet::v;
if(CMyBullet::y<0)CMyBullet::f=FALSE;
}
const void CMyBullet::Draw(){
DrawString(CMyBullet::x,CMyBullet::y,"|",0xffffff);
}
bool CMyBullet::IsAllocated(){
return CMyBullet::f;
}
int CMyBullet::Getx(){
return CMyBullet::x;
}
int CMyBullet::Gety(){
return CMyBullet::y;
}
void CMyBulletManage::MoveBullet(){
int i;
for(i=0;i<MY_BULLET_MAX;i++){
if(MyBullet[i].IsAllocated()==TRUE){
MyBullet[i].Move();
}
}
}
const void CMyBulletManage::DrawBullet(){
int i;
for(i=0;i<MY_BULLET_MAX;i++){
if(MyBullet[i].IsAllocated()==TRUE){
MyBullet[i].Draw();
}
}
}
void CMyBulletManage::SetBullet(int x,int y){
int i;
for(i=0;i<MY_BULLET_MAX;i++){
if(MyBullet[i].IsAllocated()==FALSE){
MyBullet[i].Set(x,y);
break;
}
}
}
どうしたってCMyShip::Shot()をprivateとして作れないです。
CGame::Process()にifなんて使いたくなかったのに、結局使わないで設計すると、すべてアクセスエラーおこします。
CMyShip::Getx(),CMyShip::Gety()だって本当なら使わずに済むはずなのに、どうしてもうまくいかないです。
弾の情報を作る、CMyBullet CMyShip::BulletMake()などを作って弾の情報を返すにしても、CMyBulletManageにその情報をまわせないです。
お互いの情報を渡せるところがCGame::Process()だけで、それでもクラスを直接引数にわたす形になってしまいます。
自機と弾のDraw(),Move()までならまだまとまるのに、Shot()が絡むとわけがわからなくなります。
どう考えたって、前回書いたコードの方がきれいだし、わかりやすいです。
個人的に考えていたまとめ方は、
void CMyBullet::Move()内で、スペースキーが押された判定を受けて、CMyBullet CMyShip::Shot()
CMyBullet CMyShip::Shot()内で、一時的にCMyBullet Temp を作り、Temp.x=CMyBullet::xとyを渡して return Temp
CMyBulletManage::SetBullet(CMyBullet &MyBullet)で、CMyBulletの空き情報を探して、MyBulletを渡す。
としたかったんですが...
前にサンプルだって見せてもらっていたのに、結局できずじまいです。
ずうずうしいのは分かっています。でも、本当に僕一人だとどう頑張ってもできないんです。
僕の作ったものを、みなさんならどう設計するか教えてください。どうかお願いします。