#include "DxLib.h"
#define migi 0
#define hidari 1//往復時のフラグ
int PlayerX , PlayerY , Player2X , Player2Y;
double JumpPower;
int i=20,count=0;
#define Gs 0
#define Gm 1//GAME のステート判定
#define Go 2
#define Gc 3
int gamestate=Gs; //gameのステート(初期はタイトル)
int start;
int PlayerGraph,PlayerGraph2;
int Key[256];
BOOL g_akey_prev;
//関数宣言
void gamestart(),gamemain(),gameover(),gameclear();
BOOL IsAKeyTrigger(int key);
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
SetMainWindowText( "JUMP GAME" ) ;
SetGraphMode( 800 , 600 , 16 ) ; //画面の大きさ
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
//自分の初期データをセット
Player2X = 800-32 ;
Player2Y = 568 ;
JumpPower= 0 ;
// キャラクターの初期データをセット
PlayerX = 0 ;
PlayerY = 568 ;
while(ProcessMessage()==0 && GetHitKeyStateAll_2(Key)==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
//↑メッセージ処理 ↑入力状態を保存 ↑ESCが押されていない
ClearDrawScreen();
switch (gamestate) //gamestateによるゲームモードの切り替え
{
case Gs:
gamestart();
break;
case Gm:
gamemain();
break;
case Go:
gameover();
break;
case Gc:
gameclear();
break;
}
ScreenFlip();
}
{WaitKey();WaitTimer(3000);
DxLib_End();}
return 0;
}
/*関数定義ここから*/
////////////////////// hitkey////////////////////////////////////////////////////////////////////////////
BOOL IsAKeyTrigger(int key) {
if(key&PAD_INPUT_10){
if( g_akey_prev==FALSE){
g_akey_prev=TRUE;
return TRUE;
}
}
else {
g_akey_prev=FALSE;
}return FALSE;
}
BOOL IsAKeyTrigger2(int key) {
if(key&PAD_INPUT_UP){
if( g_akey_prev==FALSE){
g_akey_prev=TRUE;
return TRUE;
}
}
else {
g_akey_prev=FALSE;
}return FALSE;
}
/////////////////////// gameのスタートの関数定義 ///////////////////////////////////////////////////////
void gamestart()
{
ClearDrawScreen();//画面消す
gamestate=Gs; //ゲームモード スタート
int title=LoadGraph("images/title.png");
DrawGraph( 0 , 130 , title, TRUE ) ;
// 描画する文字列のサイズを設定
int Cr=GetColor(255,255,255);
SetFontSize(30) ;
DrawString( 50 , 500 , "ゲームスタートするにはSPACEキーを押してください" , Cr ) ;
SetFontSize( 28) ;
DrawString( 2 , 550 , "キャラクターを操作するには↑↓→←キーを押してください" , Cr ) ;
//int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);
int bgm;
bgm= LoadSoundMem( "souds/bgm.mp3" ) ;
int key =GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(IsAKeyTrigger(key)==TRUE) gamestate=Gm, PlaySoundMem( bgm , DX_PLAYTYPE_LOOP ),start=GetNowCount(); ;
// 上を押していたら上に進む
}
/////////////////////// gameのメインの関数定義 ///////////////////////////////////////////////////////
void gamemain()//gameのメイン
{
ClearDrawScreen();//画面消す
PlayerGraph2 = LoadGraph( "images/teki.png" ) ;
PlayerGraph = LoadGraph( "images/hito.png" ) ;
// プレイヤーを描画する
DrawGraph( Player2X , Player2Y , PlayerGraph2 , TRUE ) ;
// プレイヤーを描画する
DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;
// キー入力取得
if( CheckHitKey( KEY_INPUT_UP ) ) Player2Y -= 15 ; // 上を押していたら上に進む
if( CheckHitKey( KEY_INPUT_RIGHT )) Player2X += 5 ; // 右を押していたら右に進む
if( CheckHitKey( KEY_INPUT_LEFT )) Player2X -= 5 ; // 左を押していたら左に進む
int key =GetJoypadInputState(DX_INPUT_KEY_PAD1);
int jump= LoadSoundMem( "souds/jump.mp3" ) ;
if(IsAKeyTrigger2(key)==TRUE) gamestate=Gm,PlaySoundMem( jump, DX_PLAYTYPE_BACK ) ;
// 落下処理
Player2Y -= JumpPower ;
JumpPower-=1;
// 落下加速度を加える
//あたり
if (( ( PlayerX > Player2X && PlayerX < Player2X + 32) ||
( Player2X > PlayerX && Player2X < PlayerX + 32) ) &&
(Player2Y==PlayerY))
{
gamestate=Go;
int se;
se= LoadSoundMem( "souds/dai.mp3" ) ;
PlaySoundMem( se , DX_PLAYTYPE_BACK ) ;
}
// もし地面についていたら止まる
if( Player2Y > 568 )
{
Player2Y = 568 ;
JumpPower = 0 ;
}
// もし左についていたら止まる
if(Player2X<0)
{
Player2X=0; }
//もし右についたら止まる
if(Player2X>800-32)
{
Player2X=800-32; }
int flag; //一度のみ宣言
PlayerX+=i;
if(PlayerX>800-32)
flag=migi;
if(PlayerX<0)
flag=hidari;
if(flag==migi&&PlayerX>800-32)
i *=-1;
if(flag==hidari&&PlayerX<0)
i *=-1;
if (PlayerX==0 )
if(GetNowCount()-start>30000){
gamestate=Gc;
int cl= LoadSoundMem( "souds/clear.mp3" ) ;
PlaySoundMem( cl , DX_PLAYTYPE_BACK ) ;
}
return ;
}
/////////////////////// gameクリアの関数定義 ///////////////////////////////////////////////////////
void gameclear(){
ClearDrawScreen();
int gc=LoadGraph("images/clear.png");
DrawGraph(0,0,gc,TRUE);
}
/////////////////////// gameoverの関数定義 ///////////////////////////////////////////////////////
void gameover() //game over時の表示
{
ClearDrawScreen();
int gvp=LoadGraph("images/gameover.png");
DrawGraph(0,0,gvp,TRUE);
}
/*関数定義ここまで*/
メモリを食う
メモリを食う
以下のプログラムを実行するとなぜか大量のメモリを消費するのですが理由がわかりません。教えてください。
Re: メモリを食う
ハンドルを閉じてないからです。
LoadGraph()関数や、LoadSoundMem()関数は、呼ばれるたびに第一引数のファイルをメモリ上へ展開します。
不要になったらDeleteGraph()、DeleteSoundMem()等の関数を使って解放します。
LoadGraph()関数や、LoadSoundMem()関数は、呼ばれるたびに第一引数のファイルをメモリ上へ展開します。
不要になったらDeleteGraph()、DeleteSoundMem()等の関数を使って解放します。
Re: メモリを食う
そもそも毎フレームリソースをロードしてはいけません。
ループに入る前にリソースを1度だけロードし、それを使ってください。
ループに入る前にリソースを1度だけロードし、それを使ってください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: メモリを食う
1秒間に60回無限に画像や音声をロードし続けています。
LoadGraphやLoadSoundMemは最初に一回しか呼んではいけません。
また、ClearDrawScreenを複数個所に書いてはいけません。
こちらをお読みください。
http://dixq.net/g/h_11.html
LoadGraphやLoadSoundMemは最初に一回しか呼んではいけません。
また、ClearDrawScreenを複数個所に書いてはいけません。
こちらをお読みください。
http://dixq.net/g/h_11.html