http://dixq.net/g/index.html
http://homepage2.nifty.com/natupaji/DxLib/
ここのサイトを参考に勉強しています。
で、ここのサイトにある画像を使った簡単なゲーム?を作っています。
・スペースボタンで弾を発射します。
・W・A・S・Dキーあるいは↑・←・↓・→キーで自機の移動です
・敵はドラゴンの画像を使わせていただいてます。ドラゴンは波みたいに揺れて移動します。弾は発射しません。
・自機は新・ゲームプログラミングの館さんのキャラクタ00をGIMPの練習で背景を透過させたキャラクタ01とまったく同じものをしようさせていただいてます。
みたいな内容です
コードは
#include "DxLib.h"
#define SHOT 20
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
if(DxLib_Init()==-1)return -1;
//////////////////////////////////////////////宣言
int DX=320,DY=70,DM1=1,DM2=1,Dragon=LoadGraph("ドラゴン.png");
int PX=320,PY=400,Player=LoadGraph("キャラクタ.png");
int SX[SHOT],SY[SHOT],SF[SHOT],Shot=LoadGraph("弾.png");
int SBF=0,a=0;
int DW,DH,SW,SH;
int Back=LoadGraph("背景.png");
int Blue=GetColor(0,255,255),Green=GetColor(0,255,0),GreenYello=GetColor(150,255,0);
int Black=LoadGraph("Black.png");
int Font1=CreateFontToHandle(NULL,64,3);
int Font2=CreateFontToHandle(NULL,32,2);
for(int i=0;i<SHOT;i++){
SF[i]=0;
}
GetGraphSize(Shot ,&SW,&SH);
GetGraphSize(Dragon,&DW,&DH);
////////////////////////////////////////////////////////////////////
////////////////
///////////////////// ///メインコード///
//////////////////////////
////////////////////////////////////////////////////////////////////
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
//////////////////////////////背景、文字、自機、敵の読み込み
DrawGraph(0,45,Back,TRUE);
DrawFormatStringToHandle(500,400,Blue,Font1,"%03d",a);
DrawRotaGraph(PX,PY,0.8,0.0,Player,TRUE);
DrawRotaGraph(DX,DY,1.2,0.0,Dragon,TRUE);
///////自機の操作
if(CheckHitKey(KEY_INPUT_RIGHT)==1 || CheckHitKey(KEY_INPUT_D)==1){
PX+=3;
}
if(CheckHitKey(KEY_INPUT_LEFT)==1 || CheckHitKey(KEY_INPUT_A)==1){
PX-=3;
}
if(CheckHitKey(KEY_INPUT_UP)==1 || CheckHitKey(KEY_INPUT_W)==1){
PY-=3;
}
if(CheckHitKey(KEY_INPUT_DOWN)==1 || CheckHitKey(KEY_INPUT_S)==1){
PY+=3;
}
//////////////////////////////////////自機の弾
if(CheckHitKey(KEY_INPUT_SPACE)|| CheckHitKey(KEY_INPUT_E) || CheckHitKey(KEY_INPUT_R)){
if(SBF==0){
for(int i=0;i<SHOT;i++){
if(SF[i]==0){
SX[i]=PX;
SY[i]=PY;
SF[i]=1;
break;
}
}
}
SBF=1;
}else{
SBF=0;
}
////////////////////////////////自機の発射した弾を移動させる
for(int i=0;i<SHOT;i++){
if(SF[i]==1){
SY[i]-=16;
if(SY[i]<-80){
SF[i]=0;
}
DrawRotaGraph(SX[i],SY[i],0.3,0.0,Shot,TRUE);
}
}
///////////////////////////////////////自機を画面から出さない
if(PX>=640){
PX=640;
}else if(PX<=0){
PX=0;
}else if(PY>=480){
PY=480;
}else if(PY<=0){
PY=0;
}
/////////////////////////////////////////////////敵機を動かす
//////////////////////////////////////////////////////横移動
if(DM1==1){DX+=2;}
if(DM1==0){DX-=2;}
if(DX>600){
DX=600;
DM1=0;
}
if(DX<40){
DX=40;
DM1=1;
}
///////////////////////////////////////////////////////縦移動
if(DM2==1){DY+=1;}
if(DM2==0){DY-=1;}
if(DY>100){
DY=100;
DM2=0;
}
if(DY<45){
DY=45;
DM2=1;
}
///////////////////////////////////////////////当たり判定
for(int i=0;i<SHOT;i++){
if( SF[i]==1 ){
if( ( ( SX[i] > DX && SX[i] < DX + DW ) ||
( DX > SX[i] && DX < SX[i] + SW ) ) &&
( ( SY[i] > DY && SY[i] < DY + DH ) ||
( DY > SY[i] && DY < SY[i] + SH ) ) ){
SF[i]=0;
a+=1;
}
}
}
////////////////////////////////////////////////閉じる
if(CheckHitKey(KEY_INPUT_ESCAPE)==1 || CheckHitKey(KEY_INPUT_RETURN)==1){
break;
}
if(a>5){
WaitTimer(200);
DrawGraph(0,0,Black,FALSE);
DrawStringToHandle(30,220,"C o m p l e t e d !!",Green,Font1);
DrawStringToHandle(80,280,"Push!EnterKey!!",GreenYello,Font2);
}
}
DxLib_End(); ///////////////////////////////// DXライブラリ終了処理
return 0;
}
[1] 質問文
[1.1] 自分が今行いたい事は何か
>>先ほど言ったとおり簡単な内容のゲームの作成です。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
>>コード自体に一切のエラーはありません。
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
>>分割コンパイルというのをやろうと思ったのですが変数について不明です。
[1.4] 今何がわからないのか、知りたいのか
>>1.3と同じです
[2] 環境
[2.1] OS : Windows, Linux等々
>>Windows7 HomePremium 64bit
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
>>VisualStudioExpress 2012 for WindowsDesktop
というのですか?です!
[3] その他
・どの程度C言語を理解しているか
>>さらっと入門書に書いてあるようなことは勉強しました。理解といわれると怪しいですがその都度調べればそれなりに理解はできると思います。
・ライブラリを使っている場合は何を使っているか
>>DXライブラリはライブラリですよね・・・はい!DXライブラリ使ってます!
<<<<<<<重要なところ>>>>>>>>
分割コンパイルをさせたいのですがうまくいきません。
具体的に言うと
上記のコードをMain.cppとすると
敵が移動する処理のコードを
Enemymove.cpp と Enemymove.h
に作るのはよいのですが
ファイル間での変数(例:DX DY )をどうすればよいのかがわかりません。
Main.cppで宣言するとEnemymove.cppの方では使えませんし
その逆も同じようなことが起こります。
両方で宣言すると動かなくなります。
分割コンパイルでの変数の扱い方を詳しく教えてください!
長々とすいません!回答お願いします!!