DXライブラリのゲームで制限時間を追加したいです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
名も無い者
記事: 10
登録日時: 12年前

DXライブラリのゲームで制限時間を追加したいです

#1

投稿記事 by 名も無い者 » 12年前

現在、DXライブラリでゲームを制作しているんですが、「1分間たったらゲームを終了させる」という処理がうまくいかずに悩んでいます。GetNowCount関数を使ってやろうと思っているのですが。
どうすればいいでしょうか?上も下も右も左もわからない初心者ですが、よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#2

投稿記事 by softya(ソフト屋) » 12年前

普通に組んでいれば1秒間に60回ループするので60x60回カウントで一分経過が分かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#3

投稿記事 by ISLe » 12年前

メインループはできているのでしょうから、一分経ったらをどのように判定しようとしたのか、うまくいかなかったコードを(メインループ含めて)見せてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#4

投稿記事 by softya(ソフト屋) » 12年前

フォーラムルールにテンプレートがありますので、これを使ってもらえると答えやすいです。
http://dixq.net/board/board.html
フォーラムルールもよく読んでください。 どの程度分かっているのかも重要な情報となります。
----------------------------------------------------------------------------------
各項目に対して答える形で記載して下さい。

[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々

[3] その他
 ・どの程度C言語を理解しているか
 ・ライブラリを使っている場合は何を使っているか
----------------------------------------------------------------------------------
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

名も無い者
記事: 10
登録日時: 12年前

Re: DXライブラリのゲームで制限時間を追加したいです

#5

投稿記事 by 名も無い者 » 12年前

ウワーッすいません。初心者なもので・・・・
 
[1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか→プログラムコードがあるので記載します

//g_lasttime = GetNowCount() & INT_MAX; //現在時刻の記録
//{
//
// int curtime = GetNowCount() & INT_MAX; //1ループにかかった時間を計測
// g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
// g_lasttime = curtime;

// ClsDrawScreen();
//}
 [1.3] どのようなエラーやトラブルで困っているか→関数の使い方です
 [1.4] 今何がわからないのか、知りたいのか→「1分間たったらゲームを終了させる」という処理のやり方

[2] 環境  
 [2.1] OS →Windows7です
 [2.2] コンパイラ名 → VC++ 2010です

[3] その他
 ・どの程度C言語を理解しているか→ろくにすっぽ理解してません
 ・ライブラリを使っている場合は何を使っているか→DXライブラリです
----------------------------------------------------------------------------------

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#6

投稿記事 by ISLe » 12年前

ISLe さんが書きました:メインループはできているのでしょうから、一分経ったらをどのように判定しようとしたのか、うまくいかなかったコードを(メインループ含めて)見せてください。
繰り返しになりますが…
メインループに対してどこにコードを書いたのかが重要なので分かるようにしてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#7

投稿記事 by softya(ソフト屋) » 12年前

codeタグを使ってくださいね。

>どの程度C言語を理解しているか→ろくにすっぽ理解してません

そこが問題ですね。C言語のある程度の理解は必要です。
そうしないと、こちらのアドバイスを受け止めきれないと思います。

このサイトのコンテンツのゲームプログラミングの館は読まれましてか?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
ここに
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 前書1章. C言語って何?」
http://dixq.net/g/m_01.html
ここに書かれている
> 例えばこちらのサイトで言えば7章まで理解出来ていれば十分です。(6章のポインタは難しいので理解しなくても構いません)
程度は勉強されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#8

投稿記事 by Dixq (管理人) » 12年前

書かれたコードでは何がなんだかわかりません。
全てのコードをcodeタグで囲んで投稿してください。

ためしに秒数を表示するプログラムを作ってみました

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	int startTime = GetNowCount();

	while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){
		DrawFormatString(100,100,GetColor(255,255,255),"%d秒",(GetNowCount()-startTime)/1000);
	}

	DxLib_End();
	return 0;
}  
実行結果はこうなります。
[youtube][/youtube]

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 12年前

Re: DXライブラリのゲームで制限時間を追加したいです

#9

投稿記事 by 超絶右留斗羅天才プログラマー » 12年前

使い方は以下のようになります。
ゲーム制作、頑張ってくださいねヽ(*´∀`)ノ

コード:

// 開始時間を記録しておきます。
int s = GetNowCount();

// 10分後にゲームを終了します。
// 1秒=1000 10分=600000
// 開始時間から600000の差があればループしなくなります。
while(GetNowCount()-s <600000){
	// ここにゲームの実行処理
}
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

名も無い者
記事: 10
登録日時: 12年前

Re: DXライブラリのゲームで制限時間を追加したいです

#10

投稿記事 by 名も無い者 » 12年前

なんだか色々とすいません・・・以下がすべてのコードです

コード:

 #include "DxLib.h"
#include <math.h>

#define MAX_M	100			// ミサイルの最大数定義
#define PI		3.14159		// 円周率





// データ定義

int Hx , Hy ;					  // 砲台の座標
int Hx2, Hy2;					  // 砲台2の座標
int Hm, Hm2 ;                     // 砲台の移動方向
int Hsc ;						  // 砲台のショット間隔カウンタ
int Px , Py ;					  // 自機の座標
int Mg ;						  // ミサイルのグラフィック
int Mg1 ;						  // 玉のグラフィック
int Mx[	MAX_M ] ,My[ MAX_M ] ;	  // ミサイルの座標
int Msx[ MAX_M ] , Msy[ MAX_M ] ; // ミサイルの速度
int Mv[ MAX_M ] ;				  // ミサイルデータの使用状態(1:使用中 0:未使用)
double Ma[ MAX_M ] ;			  // ミサイルの角度
int Mc[ MAX_M ] ;			      // ミサイルの追尾カウンタ							
int Score=0 ;                     // スコア
int StartTime=0 ;
int g_lasttime = 0;			      //直前の計測時刻
float g_frametime = 0;		      //1フレームにかかった時間
int Date;
LONGLONG timecnt;
int timelimit;






// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine, int nCmdShow )
{
	int Key ;
	LONGLONG Time ;
	int i ;

	char *alist;

	// 画面モードの設定
	SetGraphMode( 640 , 481 , 16 ) ;
	

	// DXライブラリ初期化処理
	if( DxLib_Init() == -1 )
	{
		// エラーが起きたら直ちに終了
		return -1;
	}



	// 描画先を裏画面にセット
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// 初期化処理
	{
		int number = 0;
		number = GetRand(2);
		if (number <2){
			alist = "TAMAtamaquarter.png";
		}
		else
		{
			alist="KINtamaquarter.png";
		}
	
		// ミサイルのグラフィックロード
		//Mg1 = LoadGraph( "TAMAtamaquarter.png" ) ;
		Mg2 = LoadGraph( "KINtamaquarter.png" ) ;

		// 自機の座標セット
		Px = 320 ; Py = 200 ;

		// 砲台の座標セット
		Hx = 320 ; Hy = 30 ;

		// 砲台2の座標セット
		Hx2 = 170; Hy2 =30 ;  //Hx2 = 170; Hy2 =30 ;

		// 砲台の移動方向セット
		Hm = 3 ;
		Hm2 = 3;
		// 砲台の移動間隔カウンタセット
		Hsc = 30 ;

		// ミサイルデータの初期化
		for( i = 0 ; i < MAX_M ; i ++ )
			Mv[ i ] = 0 ;
	}
	



	// ゲームループ
	Time = GetNowHiPerformanceCount() + 1000000 / 60 ; 
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// プレイヤーの移動処理
		{
			// 入力取得
			Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

			if( Key & PAD_INPUT_RIGHT ) Px += 5 ;	// 右を押していたら右に進む
			if( Key & PAD_INPUT_LEFT ) Px -= 5 ;	// 左を押していたら左に進む

			if( Key & PAD_INPUT_UP ) Py -= 5 ;	// 上を押していたら上に進む
			if( Key & PAD_INPUT_DOWN ) Py += 5 ;	// 下を押していたら下に進む

			// 画面外に出ていたら補正
			if( Px > 640 - 16 ) Px = 640 - 16 ;
			if( Px < 0 ) Px = 0 ;

			if( Py > 480 - 16 ) Py = 480 - 16 ;
			if( Py < 0 ) Py = 0 ;
		}

		// ミサイルの移動処理
		for( i = 0 ; i < MAX_M ; i ++ )
		{
			// ミサイルデータが無効だったらスキップ
			if( Mv[ i ] == 0 ) continue ;

			// 照準に当たっていたらミサイルデータを無効にする
			if( ( ( Mx[ i ] > Px && Mx[ i ] < Px + 32 ) || ( Px > Mx[ i ] && Px < Mx[ i ] + 16 ) ) &&
				( ( My[ i ] > Py && My[ i ] < Py + 32 ) || ( Py > My[ i ] && Py < My[ i ] + 16 ) ) )
			{
				Mv[ i ] = 0 ;
			 	Score++;
			 	if(Score>=10){ //10
				int GrHandle ;
				GrHandle = LoadGraph( "GAMEOVER.jpg" ) ;//int	Screen	
				DrawGraph( 100 , 100 , GrHandle , FALSE ) ;
				WaitTimer( 3000 ) ;
				return 0 ;
				}
				printfDx("                             被弾数 = %d \n", Score);
				continue  ;
			}

			// 追尾カウンタが規定値に来ていなければ追尾処理
			if( Mc[ i ] < 100 )
			{
				double ax , ay , bx , by ;

				// bx,by 自分の進んでいる方向 ax,ay 本来進むべき方向  
				bx = cos( Ma[ i ] ) ;
				by = sin( Ma[ i ] ) ;
				ax = ( Px + 16 ) - Mx[ i ] ;
				ay = ( Py + 16 ) - My[ i ] ;

				// 外積を利用し向きを照準側に向ける
				Ma[ i ] += ( ax * by - ay * bx < 0.0 ) ? + PI / 180 * 15 : - PI / 180 * 15 ;
			}

			// 追尾カウンタ加算
			Mc[ i ] ++ ;

			// 速度変更
			Msx[ i ] += ( int )( cos( Ma[ i ] ) * 15.0 ); //30
			Msy[ i ] += ( int )( sin( Ma[ i ] ) * 15.0 ); //30
  
			// 移動
			Mx[ i ] = ( Mx[ i ] * 100 + Msx[ i ] ) / 100 ;
			My[ i ] = ( My[ i ] * 100 + Msy[ i ] ) / 100 ;

			// 画面外に出ていたらミサイルデータを無効にする
			if( Mx[ i ] < -100 || Mx[ i ] > 740 ||
				My[ i ] < -100 || My[ i ] > 580 ) Mv[ i ] = 0 ;
		}

		// 砲台の移動処理
		{
			Hx  += Hm;
			Hx2 += Hm;
			Hy2 += Hm2;

			// 画面端まで来ていたら反転
			if( Hx > 640 - 16 || Hx < 0 ) Hm *= -1 ;
			if( Hx2 > 640 -16 || Hx2 < 0) Hm *= -1;
			if( Hy2 > 480 -16 || Hy2 < 0) Hm2 *= -1;
			
			// ショットカウンタを減らす
			Hsc -- ;

			// カウンタが0になっていたらミサイル発射
			if( Hsc == 0 )
			{
				// 使われていないミサイルデータを探す
				for( i = 0 ; i < MAX_M ; i ++ )
				{
					if( Mv[ i ] == 0 ) break ;
				}
		
				// もし使われていないミサイルデータがあったらショットを出す
				if( i != MAX_M )
				{
					// ミサイルの位置を設定
					
					int number = GetRand(2);
					if (number <2){
						Mx[ i ] = Hx + 16 ;
						My[ i ] = Hy + 16 ;
					}
					else{
    					Mx[ i ] = Hx2 + 16 ;
						My[ i ] = Hy2 + 16 ;
					}


					// 速度セット
					Msx[ i ] = 0 ;
					Msy[ i ] = 0 ;

					// 角度をセット
					Ma[ i ] = PI / 2 ;

					// 追尾カウンタをセット
					Mc[ i ] = 0 ;

					// ショットデータを使用中にセット
					Mv[ i ] = 1 ;
				}

				// 発射間隔カウンタ値をセット
				Hsc = 30 ; //30
		}
		  }

		// 描画処理
		{
			// 画面の初期化
			ClearDrawScreen() ;

			// ミサイルの描画
			for( i = 0 ; i < MAX_M ; i ++ )
			{
				// ミサイルデータが有効でない場合は次に移る
				if( Mv[ i ] == 0 ) continue ;
				
				Mg=Mg1;
				Mg=Mg2;

				int a = 2;
				printf("%d\n", a > 2);
				printf("%d\n", a < 2);

				if(a >2) printf("Mg1\n");
				if(a <2) printf("Mg2\n");

				// ミサイルの描画
				DrawRotaGraph( Mx[ i ], My[ i ], 1.0 , Ma[ i ] , Mg , TRUE ) ;
			}

			// プレーヤーの描画
			DrawBox( Px , Py , Px + 32 , Py + 32 , GetColor( 255 , 255 , 255 ) , TRUE ) ;

			// 砲台の描画
			DrawBox( Hx - 8 , Hy - 8 , Hx + 8 , Hy + 8 , GetColor( 255 , 255 , 0 ) , TRUE ) ;
			DrawBox( Hx2 - 8 , Hy2 -8, Hx2 + 8, Hy2 + 8, GetColor(255,0,0),true);

			// 裏画面の内容を表画面に反映
			ScreenFlip() ;

			// 時間待ち
			while( GetNowHiPerformanceCount() < Time ){}
			Time += 1000000 / 60 ;
		}
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;				// ソフトの終了
}

//  } 

non
記事: 1097
登録日時: 14年前

Re: DXライブラリのゲームで制限時間を追加したいです

#11

投稿記事 by non » 12年前

あなたのプログラムで必要そうな部分だけを抜き取りました。

コード:

    LONGLONG Time ;
    Time = GetNowHiPerformanceCount() + 1000000 / 60 ; 
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
    {
            // 裏画面の内容を表画面に反映
            ScreenFlip() ;
 
            // 時間待ち
            while( GetNowHiPerformanceCount() < Time ){}
            Time += 1000000 / 60 ;
    }
やりたいことは、1分したら終了したいのですよね。
1000000 / 60  はどういう意味で使っていますか?
non

名も無い者
記事: 10
登録日時: 12年前

softya(ソフト屋)さんへ

#12

投稿記事 by 名も無い者 » 12年前

>ここに書かれている
>> 例えばこちらのサイトで言えば7章まで理解出来ていれば十分です。(6章のポインタは難しいので理解しなくても構いません)
>程度は勉強されていますか?

読みましたが、理解できたのは3章まででした・・・

名も無い者
記事: 10
登録日時: 12年前

nonさんへ

#13

投稿記事 by 名も無い者 » 12年前

>やりたいことは、1分したら終了したいのですよね。
はい。

>1000000 / 60  はどういう意味で使っていますか?
1/60秒、すなわち1フレーム秒を得ているのだと思いますが、拾ってきたものですので詳しいことはよくわかりません。すみません。

non
記事: 1097
登録日時: 14年前

Re: DXライブラリのゲームで制限時間を追加したいです

#14

投稿記事 by non » 12年前

ScreenFlip() ;
があることで、自動的に1/60秒待っています。

あなたが、使っている

コード:

            // 時間待ち
            while( GetNowHiPerformanceCount() < Time ){}
            Time += 1000000 / 60 ;
が1/60秒待つプログラムです。
ですから、これはScreenFlip() ;があればいりません。

1秒で終了したいのなら、どこかで1秒数えなくてはいけませんが、あなたのプログラムではどこで数えているのでしょうか。
また、1秒後にwhileから抜けるための条件がどこにもありません。
non

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 12年前

Re: DXライブラリのゲームで制限時間を追加したいです

#15

投稿記事 by 超絶右留斗羅天才プログラマー » 12年前

GetNowCount関数は使わなくても大丈夫です(*´∀`)
「どうしてもGetNowCount関数が使いたいんだ!」というご要望であれば、また新しく作り直しますので、その時はまたお知らせください!

①int g_nFrameを新しく作成します。(同じような変数がある場合はそちらを使って下さい)
②ゲームループ内で、g_nFrameを+1していく処理を追加します。(ちなみに1秒で60ずつ加算されます)
③そのすぐ下に、g_nFrameが3600になったらゲームループが終了するif文の処理を追加します。

そうすれば、一分後にウインドウが閉じます。
以下にコードのサンプルを提示します。

もしよろしければ参考にしてくださいヽ(*´∀`)ノ

コード:

 #include "DxLib.h"
#include <math.h>
 
#define MAX_M   100         // ミサイルの最大数定義
#define PI      3.14159     // 円周率
 
 
 
 
 
// データ定義
 
int Hx , Hy ;                     // 砲台の座標
int Hx2, Hy2;                     // 砲台2の座標
int Hm, Hm2 ;                     // 砲台の移動方向
int Hsc ;                         // 砲台のショット間隔カウンタ
int Px , Py ;                     // 自機の座標
int Mg ;                          // ミサイルのグラフィック
int Mg1 ;                         // 玉のグラフィック
int Mx[ MAX_M ] ,My[ MAX_M ] ;    // ミサイルの座標
int Msx[ MAX_M ] , Msy[ MAX_M ] ; // ミサイルの速度
int Mv[ MAX_M ] ;                 // ミサイルデータの使用状態(1:使用中 0:未使用)
double Ma[ MAX_M ] ;              // ミサイルの角度
int Mc[ MAX_M ] ;                 // ミサイルの追尾カウンタ                          
int Score=0 ;                     // スコア
int StartTime=0 ;
int g_lasttime = 0;               //直前の計測時刻
float g_frametime = 0;            //1フレームにかかった時間
int Date;
LONGLONG timecnt;
int timelimit;
 
// 新しく変数を作ります。
int g_nFrame = 0;
 
 
 
 
 
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow )
{
    int Key ;
    LONGLONG Time ;
    int i ;
 
    char *alist;
 
    // 画面モードの設定
    SetGraphMode( 640 , 481 , 16 ) ;
    
 
    // DXライブラリ初期化処理
    if( DxLib_Init() == -1 )
    {
        // エラーが起きたら直ちに終了
        return -1;
    }
 
 
 
    // 描画先を裏画面にセット
    SetDrawScreen( DX_SCREEN_BACK ) ;
 
    // 初期化処理
    {
        int number = 0;
        number = GetRand(2);
        if (number <2){
            alist = "TAMAtamaquarter.png";
        }
        else
        {
            alist="KINtamaquarter.png";
        }
    
        // ミサイルのグラフィックロード
        //Mg1 = LoadGraph( "TAMAtamaquarter.png" ) ;
        Mg2 = LoadGraph( "KINtamaquarter.png" ) ;
 
        // 自機の座標セット
        Px = 320 ; Py = 200 ;
 
        // 砲台の座標セット
        Hx = 320 ; Hy = 30 ;
 
        // 砲台2の座標セット
        Hx2 = 170; Hy2 =30 ;  //Hx2 = 170; Hy2 =30 ;
 
        // 砲台の移動方向セット
        Hm = 3 ;
        Hm2 = 3;
        // 砲台の移動間隔カウンタセット
        Hsc = 30 ;
 
        // ミサイルデータの初期化
        for( i = 0 ; i < MAX_M ; i ++ )
            Mv[ i ] = 0 ;
    }
    
 
 
 
    // ゲームループ
    Time = GetNowHiPerformanceCount() + 1000000 / 60 ; 
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
    {
        // ゲーム時間をカウント
        g_nFrame++;

        // 終了処理
        if( g_nFrame >= 3600 )break;

        // プレイヤーの移動処理
        {
            // 入力取得
            Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;
 
            if( Key & PAD_INPUT_RIGHT ) Px += 5 ;   // 右を押していたら右に進む
            if( Key & PAD_INPUT_LEFT ) Px -= 5 ;    // 左を押していたら左に進む
 
            if( Key & PAD_INPUT_UP ) Py -= 5 ;  // 上を押していたら上に進む
            if( Key & PAD_INPUT_DOWN ) Py += 5 ;    // 下を押していたら下に進む
 
            // 画面外に出ていたら補正
            if( Px > 640 - 16 ) Px = 640 - 16 ;
            if( Px < 0 ) Px = 0 ;
 
            if( Py > 480 - 16 ) Py = 480 - 16 ;
            if( Py < 0 ) Py = 0 ;
        }
 
        // ミサイルの移動処理
        for( i = 0 ; i < MAX_M ; i ++ )
        {
            // ミサイルデータが無効だったらスキップ
            if( Mv[ i ] == 0 ) continue ;
 
            // 照準に当たっていたらミサイルデータを無効にする
            if( ( ( Mx[ i ] > Px && Mx[ i ] < Px + 32 ) || ( Px > Mx[ i ] && Px < Mx[ i ] + 16 ) ) &&
                ( ( My[ i ] > Py && My[ i ] < Py + 32 ) || ( Py > My[ i ] && Py < My[ i ] + 16 ) ) )
            {
                Mv[ i ] = 0 ;
                Score++;
                if(Score>=10){ //10
                int GrHandle ;
                GrHandle = LoadGraph( "GAMEOVER.jpg" ) ;//int   Screen  
                DrawGraph( 100 , 100 , GrHandle , FALSE ) ;
                WaitTimer( 3000 ) ;
                return 0 ;
                }
                printfDx("                             被弾数 = %d \n", Score);
                continue  ;
            }
 
            // 追尾カウンタが規定値に来ていなければ追尾処理
            if( Mc[ i ] < 100 )
            {
                double ax , ay , bx , by ;
 
                // bx,by 自分の進んでいる方向 ax,ay 本来進むべき方向  
                bx = cos( Ma[ i ] ) ;
                by = sin( Ma[ i ] ) ;
                ax = ( Px + 16 ) - Mx[ i ] ;
                ay = ( Py + 16 ) - My[ i ] ;
 
                // 外積を利用し向きを照準側に向ける
                Ma[ i ] += ( ax * by - ay * bx < 0.0 ) ? + PI / 180 * 15 : - PI / 180 * 15 ;
            }
 
            // 追尾カウンタ加算
            Mc[ i ] ++ ;
 
            // 速度変更
            Msx[ i ] += ( int )( cos( Ma[ i ] ) * 15.0 ); //30
            Msy[ i ] += ( int )( sin( Ma[ i ] ) * 15.0 ); //30
  
            // 移動
            Mx[ i ] = ( Mx[ i ] * 100 + Msx[ i ] ) / 100 ;
            My[ i ] = ( My[ i ] * 100 + Msy[ i ] ) / 100 ;
 
            // 画面外に出ていたらミサイルデータを無効にする
            if( Mx[ i ] < -100 || Mx[ i ] > 740 ||
                My[ i ] < -100 || My[ i ] > 580 ) Mv[ i ] = 0 ;
        }
 
        // 砲台の移動処理
        {
            Hx  += Hm;
            Hx2 += Hm;
            Hy2 += Hm2;
 
            // 画面端まで来ていたら反転
            if( Hx > 640 - 16 || Hx < 0 ) Hm *= -1 ;
            if( Hx2 > 640 -16 || Hx2 < 0) Hm *= -1;
            if( Hy2 > 480 -16 || Hy2 < 0) Hm2 *= -1;
            
            // ショットカウンタを減らす
            Hsc -- ;
 
            // カウンタが0になっていたらミサイル発射
            if( Hsc == 0 )
            {
                // 使われていないミサイルデータを探す
                for( i = 0 ; i < MAX_M ; i ++ )
                {
                    if( Mv[ i ] == 0 ) break ;
                }
        
                // もし使われていないミサイルデータがあったらショットを出す
                if( i != MAX_M )
                {
                    // ミサイルの位置を設定
                    
                    int number = GetRand(2);
                    if (number <2){
                        Mx[ i ] = Hx + 16 ;
                        My[ i ] = Hy + 16 ;
                    }
                    else{
                        Mx[ i ] = Hx2 + 16 ;
                        My[ i ] = Hy2 + 16 ;
                    }
 
 
                    // 速度セット
                    Msx[ i ] = 0 ;
                    Msy[ i ] = 0 ;
 
                    // 角度をセット
                    Ma[ i ] = PI / 2 ;
 
                    // 追尾カウンタをセット
                    Mc[ i ] = 0 ;
 
                    // ショットデータを使用中にセット
                    Mv[ i ] = 1 ;
                }
 
                // 発射間隔カウンタ値をセット
                Hsc = 30 ; //30
        }
          }
 
        // 描画処理
        {
            // 画面の初期化
            ClearDrawScreen() ;
 
            // ミサイルの描画
            for( i = 0 ; i < MAX_M ; i ++ )
            {
                // ミサイルデータが有効でない場合は次に移る
                if( Mv[ i ] == 0 ) continue ;
                
                Mg=Mg1;
                Mg=Mg2;
 
                int a = 2;
                printf("%d\n", a > 2);
                printf("%d\n", a < 2);
 
                if(a >2) printf("Mg1\n");
                if(a <2) printf("Mg2\n");
 
                // ミサイルの描画
                DrawRotaGraph( Mx[ i ], My[ i ], 1.0 , Ma[ i ] , Mg , TRUE ) ;
            }
 
            // プレーヤーの描画
            DrawBox( Px , Py , Px + 32 , Py + 32 , GetColor( 255 , 255 , 255 ) , TRUE ) ;
 
            // 砲台の描画
            DrawBox( Hx - 8 , Hy - 8 , Hx + 8 , Hy + 8 , GetColor( 255 , 255 , 0 ) , TRUE ) ;
            DrawBox( Hx2 - 8 , Hy2 -8, Hx2 + 8, Hy2 + 8, GetColor(255,0,0),true);
 
            // 裏画面の内容を表画面に反映
            ScreenFlip() ;
 
            // 時間待ち
            while( GetNowHiPerformanceCount() < Time ){}
            Time += 1000000 / 60 ;
        }
    }
 
    DxLib_End() ;               // DXライブラリ使用の終了処理
 
    return 0 ;              // ソフトの終了
}
 
//  }
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

名も無い者
記事: 10
登録日時: 12年前

超絶右留斗羅天才プログラマーさんへ

#16

投稿記事 by 名も無い者 » 12年前

ありがとうございました!目から鱗どころか水晶体まで溶け落ちそうです

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 12年前

Re: 超絶右留斗羅天才プログラマーさんへ

#17

投稿記事 by 超絶右留斗羅天才プログラマー » 12年前

あはは、そんな表現初めてお聞きしました(^^♪

何かわからないことがあればまたお聞き下さい(*´∀`)
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#18

投稿記事 by softya(ソフト屋) » 12年前

あまりこういう事は言いたくないのですが、フォーラムルールにあります
http://dixq.net/board/board.html
「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
に該当するかと思います。
回答してくれた皆様への感謝をお願いします。

>読みましたが、理解できたのは3章まででした・・・

それだと、今後機能を追加していくことは難しいと思います。
ゲームを作りたいなら嫌だとは思いますが勉強はしないといけません。
そうしないと思ったように作れないからです。

今回の場合は文法ではなく考え方の問題でしたが、これも自分で考えないと何時まで経っても自分で作れるようになりません。
ヒントンだけで作る事をまず目指すべきかと思います。

お小言ばかりで申しわけないですが、今後の為を思って書かせて頂きました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#19

投稿記事 by ISLe » 12年前

DXライブラリのScreenFlipって垂直帰線期間を待つだけではなかったでしたっけ。
60Hz前提で良いのでしょうかね。

SetGraphMode( 640 , 481 , 16 ) ;
と書かれているのでたいていはウィンドウモードになるはずですし。
画面モードをカスタマイズできる環境ではフルスクリーンになる可能性もあります。

ウィンドウモードにしたいなら
ChangeWindowMode(TRUE);
と書かないと確実ではないと思います。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#20

投稿記事 by usao » 12年前

わたしはDXライブラリを使ったことがないので 的外れかもしれませんが…

ゲームループ内に記述されている処理が「絶対に1/60秒以内に終わる」保証があるのでしょうか?
複雑な処理を行えばそれだけ処理時間がかかると思うのですが,
「1分」を実現する方法として,単純にループ回数をカウントすればOKみたいな話で本当に解決するのか疑問です.

#そもそも「ゲーム的な制限時間」に「実時間での1分」を制限時間とすることの妥当性はあまりないでしょうから
 ループの回数を使う方が ゲームの制限時間 の実現方法としては良い方法だとは思うのですけど,
 なんかレスをみていると,「実時間の1分」の方をを測ろうとしている?ように見えるので…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#21

投稿記事 by softya(ソフト屋) » 12年前

正確に言えば、1分を測る場合ScreenFlip()が1/60であること前提にしてはいけません。
ただ、ループ回数の方が簡単なので最初に書かせてもらいました。

モニタによって変わるのでScreenFlip()が1/50秒から1/120秒まで色々とバリエーションは考えられます。
多くのPCは1/60秒だと思います。
あと処理や描画負荷次第では、1/60秒に成らない場合もありえます。
なので、GetNowCount()で時間を計測したほうが正確に1分を過ぎたことは判明します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#22

投稿記事 by ISLe » 12年前

1分が実時間なのかゲーム内時間なのか、というのはゲームの仕様によります。
あと1フレームあたりの時間を固定にするのかどうかとか、コマ落ちをどう扱うかとかも。
実際のところ突き詰めるとかなり難しい問題なんですよね。


以下余談でDXライブラリとは関係ない話になりますが。
同じプラットフォームでも実機に種類があって性能が極めてバラバラだったりするとフルフレーム出るハードと出ないハードがあります。
そういう状況では実時間で計測するしかないんですよね。
そもそもリフレッシュレートが固定でなかったり不明だったりしますし。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#23

投稿記事 by ISLe » 12年前

そういう点では質問者さんのコードにある時間待ちは意味のあるものです。
同時にScreenFlipでVSYNC待ちしないようにすべきですが。

でもスリープ入れないとCPU使用率が跳ね上がってしまいますけど。
正確さに欠けますし。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#24

投稿記事 by softya(ソフト屋) » 12年前

最初のコードの問題は、1/60秒未満で抜けてくることが前提となっている事も問題かと思います。
処理の重いコードを書いてしまうと、それだけで破綻してしまいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#25

投稿記事 by Dixq (管理人) » 12年前

私のサンプルコードは見てもらえました?
あのサンプルの通り秒数を測って60秒超えたらループを抜ければいいだけではないでしょうか・・?

名も無い者
記事: 10
登録日時: 12年前

申し訳ございません

#26

投稿記事 by 名も無い者 » 12年前

>管理人様へ
すみません、すっかり舞い上がってしまい見るのを忘れていました・・・

>あまりこういう事は言いたくないのですが、フォーラムルールにあります
>http://dixq.net/board/board.html
>「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
>に該当するかと思います。
>回答してくれた皆様への感謝をお願いします。
軽率な行動をとってしまい申し訳ございません。改めて、回答していただいた皆様に感謝いたします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#27

投稿記事 by みけCAT » 12年前

失礼します。
名も無い者 さんが書きました:ありがとうございました!目から鱗どころか水晶体まで溶け落ちそうです
softya(ソフト屋) さんが書きました:あまりこういう事は言いたくないのですが、フォーラムルールにあります
http://dixq.net/board/board.html
「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
に該当するかと思います。
回答してくれた皆様への感謝をお願いします。
「ありがとうございました」と書くだけでは感謝したことにならないことがあるのでしょうか?
書かれていることだけでなく、きちんと名も無い者さんの心の中を読んでsoftya(ソフト屋)さんが回答したのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#28

投稿記事 by softya(ソフト屋) » 12年前

すいません。うまく伝わったいなかったですね。
私が言いたかったのは「超絶右留斗羅天才プログラマーさん」だけに対してお礼を書いていることです。
誰かにだけに返答をするのは、円滑なコミュニケーションとは言えないと思った次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#29

投稿記事 by みけCAT » 12年前

なるほど、わかりました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: DXライブラリのゲームで制限時間を追加したいです

#30

投稿記事 by ISLe » 12年前

無視されたらそっと無視し返すというのも円滑なコミュニケーションかと思います。

超絶右留斗羅天才プログラマーさんがそうだというわけではありませんが、質問者さんは、自分が分かる範囲の知識のみを使った回答を優先して選択する傾向が強いので、虚しく感じることは多々ありますけど、だからと言ってお礼を強制するのは見苦しいかなとか。

閉鎖

“C言語何でも質問掲示板” へ戻る