DXライブラリのゲームで制限時間を追加したいです
DXライブラリのゲームで制限時間を追加したいです
現在、DXライブラリでゲームを制作しているんですが、「1分間たったらゲームを終了させる」という処理がうまくいかずに悩んでいます。GetNowCount関数を使ってやろうと思っているのですが。
どうすればいいでしょうか?上も下も右も左もわからない初心者ですが、よろしくお願いします。
どうすればいいでしょうか?上も下も右も左もわからない初心者ですが、よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
普通に組んでいれば1秒間に60回ループするので60x60回カウントで一分経過が分かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリのゲームで制限時間を追加したいです
メインループはできているのでしょうから、一分経ったらをどのように判定しようとしたのか、うまくいかなかったコードを(メインループ含めて)見せてください。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
フォーラムルールにテンプレートがありますので、これを使ってもらえると答えやすいです。
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言語を理解しているか
・ライブラリを使っている場合は何を使っているか
----------------------------------------------------------------------------------
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリのゲームで制限時間を追加したいです
ウワーッすいません。初心者なもので・・・・
[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ライブラリです
----------------------------------------------------------------------------------
[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ライブラリです
----------------------------------------------------------------------------------
Re: DXライブラリのゲームで制限時間を追加したいです
繰り返しになりますが…ISLe さんが書きました:メインループはできているのでしょうから、一分経ったらをどのように判定しようとしたのか、うまくいかなかったコードを(メインループ含めて)見せてください。
メインループに対してどこにコードを書いたのかが重要なので分かるようにしてください。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
codeタグを使ってくださいね。
>どの程度C言語を理解しているか→ろくにすっぽ理解してません
そこが問題ですね。C言語のある程度の理解は必要です。
そうしないと、こちらのアドバイスを受け止めきれないと思います。
このサイトのコンテンツのゲームプログラミングの館は読まれましてか?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
ここに
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 前書1章. C言語って何?」
http://dixq.net/g/m_01.html
ここに書かれている
> 例えばこちらのサイトで言えば7章まで理解出来ていれば十分です。(6章のポインタは難しいので理解しなくても構いません)
程度は勉強されていますか?
>どの程度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ライブラリのゲームで制限時間を追加したいです
書かれたコードでは何がなんだかわかりません。
全てのコードをcodeタグで囲んで投稿してください。
ためしに秒数を表示するプログラムを作ってみました
実行結果はこうなります。
[youtube][/youtube]
全てのコードを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ライブラリのゲームで制限時間を追加したいです
使い方は以下のようになります。
ゲーム制作、頑張ってくださいねヽ(*´∀`)ノ
ゲーム制作、頑張ってくださいねヽ(*´∀`)ノ
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: DXライブラリのゲームで制限時間を追加したいです
なんだか色々とすいません・・・以下がすべてのコードです
#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 ; // ソフトの終了
}
// }
Re: DXライブラリのゲームで制限時間を追加したいです
あなたのプログラムで必要そうな部分だけを抜き取りました。
やりたいことは、1分したら終了したいのですよね。
1000000 / 60 はどういう意味で使っていますか?
LONGLONG Time ;
Time = GetNowHiPerformanceCount() + 1000000 / 60 ;
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// 時間待ち
while( GetNowHiPerformanceCount() < Time ){}
Time += 1000000 / 60 ;
}
1000000 / 60 はどういう意味で使っていますか?
non
softya(ソフト屋)さんへ
>ここに書かれている
>> 例えばこちらのサイトで言えば7章まで理解出来ていれば十分です。(6章のポインタは難しいので理解しなくても構いません)
>程度は勉強されていますか?
読みましたが、理解できたのは3章まででした・・・
>> 例えばこちらのサイトで言えば7章まで理解出来ていれば十分です。(6章のポインタは難しいので理解しなくても構いません)
>程度は勉強されていますか?
読みましたが、理解できたのは3章まででした・・・
Re: DXライブラリのゲームで制限時間を追加したいです
ScreenFlip() ;
があることで、自動的に1/60秒待っています。
あなたが、使っている が1/60秒待つプログラムです。
ですから、これはScreenFlip() ;があればいりません。
1秒で終了したいのなら、どこかで1秒数えなくてはいけませんが、あなたのプログラムではどこで数えているのでしょうか。
また、1秒後にwhileから抜けるための条件がどこにもありません。
があることで、自動的に1/60秒待っています。
あなたが、使っている が1/60秒待つプログラムです。
ですから、これはScreenFlip() ;があればいりません。
1秒で終了したいのなら、どこかで1秒数えなくてはいけませんが、あなたのプログラムではどこで数えているのでしょうか。
また、1秒後にwhileから抜けるための条件がどこにもありません。
non
-
- 記事: 44
- 登録日時: 12年前
Re: DXライブラリのゲームで制限時間を追加したいです
GetNowCount関数は使わなくても大丈夫です(*´∀`)
「どうしてもGetNowCount関数が使いたいんだ!」というご要望であれば、また新しく作り直しますので、その時はまたお知らせください!
①int g_nFrameを新しく作成します。(同じような変数がある場合はそちらを使って下さい)
②ゲームループ内で、g_nFrameを+1していく処理を追加します。(ちなみに1秒で60ずつ加算されます)
③そのすぐ下に、g_nFrameが3600になったらゲームループが終了するif文の処理を追加します。
そうすれば、一分後にウインドウが閉じます。
以下にコードのサンプルを提示します。
もしよろしければ参考にしてくださいヽ(*´∀`)ノ
「どうしても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%
-
- 記事: 44
- 登録日時: 12年前
Re: 超絶右留斗羅天才プログラマーさんへ
あはは、そんな表現初めてお聞きしました(^^♪
何かわからないことがあればまたお聞き下さい(*´∀`)
何かわからないことがあればまたお聞き下さい(*´∀`)
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
あまりこういう事は言いたくないのですが、フォーラムルールにあります
http://dixq.net/board/board.html
「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
に該当するかと思います。
回答してくれた皆様への感謝をお願いします。
>読みましたが、理解できたのは3章まででした・・・
それだと、今後機能を追加していくことは難しいと思います。
ゲームを作りたいなら嫌だとは思いますが勉強はしないといけません。
そうしないと思ったように作れないからです。
今回の場合は文法ではなく考え方の問題でしたが、これも自分で考えないと何時まで経っても自分で作れるようになりません。
ヒントンだけで作る事をまず目指すべきかと思います。
お小言ばかりで申しわけないですが、今後の為を思って書かせて頂きました。
http://dixq.net/board/board.html
「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
に該当するかと思います。
回答してくれた皆様への感謝をお願いします。
>読みましたが、理解できたのは3章まででした・・・
それだと、今後機能を追加していくことは難しいと思います。
ゲームを作りたいなら嫌だとは思いますが勉強はしないといけません。
そうしないと思ったように作れないからです。
今回の場合は文法ではなく考え方の問題でしたが、これも自分で考えないと何時まで経っても自分で作れるようになりません。
ヒントンだけで作る事をまず目指すべきかと思います。
お小言ばかりで申しわけないですが、今後の為を思って書かせて頂きました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリのゲームで制限時間を追加したいです
DXライブラリのScreenFlipって垂直帰線期間を待つだけではなかったでしたっけ。
60Hz前提で良いのでしょうかね。
SetGraphMode( 640 , 481 , 16 ) ;
と書かれているのでたいていはウィンドウモードになるはずですし。
画面モードをカスタマイズできる環境ではフルスクリーンになる可能性もあります。
ウィンドウモードにしたいなら
ChangeWindowMode(TRUE);
と書かないと確実ではないと思います。
60Hz前提で良いのでしょうかね。
SetGraphMode( 640 , 481 , 16 ) ;
と書かれているのでたいていはウィンドウモードになるはずですし。
画面モードをカスタマイズできる環境ではフルスクリーンになる可能性もあります。
ウィンドウモードにしたいなら
ChangeWindowMode(TRUE);
と書かないと確実ではないと思います。
Re: DXライブラリのゲームで制限時間を追加したいです
わたしはDXライブラリを使ったことがないので 的外れかもしれませんが…
ゲームループ内に記述されている処理が「絶対に1/60秒以内に終わる」保証があるのでしょうか?
複雑な処理を行えばそれだけ処理時間がかかると思うのですが,
「1分」を実現する方法として,単純にループ回数をカウントすればOKみたいな話で本当に解決するのか疑問です.
#そもそも「ゲーム的な制限時間」に「実時間での1分」を制限時間とすることの妥当性はあまりないでしょうから
ループの回数を使う方が ゲームの制限時間 の実現方法としては良い方法だとは思うのですけど,
なんかレスをみていると,「実時間の1分」の方をを測ろうとしている?ように見えるので…
ゲームループ内に記述されている処理が「絶対に1/60秒以内に終わる」保証があるのでしょうか?
複雑な処理を行えばそれだけ処理時間がかかると思うのですが,
「1分」を実現する方法として,単純にループ回数をカウントすればOKみたいな話で本当に解決するのか疑問です.
#そもそも「ゲーム的な制限時間」に「実時間での1分」を制限時間とすることの妥当性はあまりないでしょうから
ループの回数を使う方が ゲームの制限時間 の実現方法としては良い方法だとは思うのですけど,
なんかレスをみていると,「実時間の1分」の方をを測ろうとしている?ように見えるので…
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
正確に言えば、1分を測る場合ScreenFlip()が1/60であること前提にしてはいけません。
ただ、ループ回数の方が簡単なので最初に書かせてもらいました。
モニタによって変わるのでScreenFlip()が1/50秒から1/120秒まで色々とバリエーションは考えられます。
多くのPCは1/60秒だと思います。
あと処理や描画負荷次第では、1/60秒に成らない場合もありえます。
なので、GetNowCount()で時間を計測したほうが正確に1分を過ぎたことは判明します。
ただ、ループ回数の方が簡単なので最初に書かせてもらいました。
モニタによって変わるのでScreenFlip()が1/50秒から1/120秒まで色々とバリエーションは考えられます。
多くのPCは1/60秒だと思います。
あと処理や描画負荷次第では、1/60秒に成らない場合もありえます。
なので、GetNowCount()で時間を計測したほうが正確に1分を過ぎたことは判明します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリのゲームで制限時間を追加したいです
1分が実時間なのかゲーム内時間なのか、というのはゲームの仕様によります。
あと1フレームあたりの時間を固定にするのかどうかとか、コマ落ちをどう扱うかとかも。
実際のところ突き詰めるとかなり難しい問題なんですよね。
以下余談でDXライブラリとは関係ない話になりますが。
同じプラットフォームでも実機に種類があって性能が極めてバラバラだったりするとフルフレーム出るハードと出ないハードがあります。
そういう状況では実時間で計測するしかないんですよね。
そもそもリフレッシュレートが固定でなかったり不明だったりしますし。
あと1フレームあたりの時間を固定にするのかどうかとか、コマ落ちをどう扱うかとかも。
実際のところ突き詰めるとかなり難しい問題なんですよね。
以下余談でDXライブラリとは関係ない話になりますが。
同じプラットフォームでも実機に種類があって性能が極めてバラバラだったりするとフルフレーム出るハードと出ないハードがあります。
そういう状況では実時間で計測するしかないんですよね。
そもそもリフレッシュレートが固定でなかったり不明だったりしますし。
Re: DXライブラリのゲームで制限時間を追加したいです
そういう点では質問者さんのコードにある時間待ちは意味のあるものです。
同時にScreenFlipでVSYNC待ちしないようにすべきですが。
でもスリープ入れないとCPU使用率が跳ね上がってしまいますけど。
正確さに欠けますし。
同時にScreenFlipでVSYNC待ちしないようにすべきですが。
でもスリープ入れないとCPU使用率が跳ね上がってしまいますけど。
正確さに欠けますし。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
最初のコードの問題は、1/60秒未満で抜けてくることが前提となっている事も問題かと思います。
処理の重いコードを書いてしまうと、それだけで破綻してしまいます。
処理の重いコードを書いてしまうと、それだけで破綻してしまいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
私のサンプルコードは見てもらえました?
あのサンプルの通り秒数を測って60秒超えたらループを抜ければいいだけではないでしょうか・・?
あのサンプルの通り秒数を測って60秒超えたらループを抜ければいいだけではないでしょうか・・?
申し訳ございません
>管理人様へ
すみません、すっかり舞い上がってしまい見るのを忘れていました・・・
>あまりこういう事は言いたくないのですが、フォーラムルールにあります
>http://dixq.net/board/board.html
>「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
>に該当するかと思います。
>回答してくれた皆様への感謝をお願いします。
軽率な行動をとってしまい申し訳ございません。改めて、回答していただいた皆様に感謝いたします。
すみません、すっかり舞い上がってしまい見るのを忘れていました・・・
>あまりこういう事は言いたくないのですが、フォーラムルールにあります
>http://dixq.net/board/board.html
>「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
>に該当するかと思います。
>回答してくれた皆様への感謝をお願いします。
軽率な行動をとってしまい申し訳ございません。改めて、回答していただいた皆様に感謝いたします。
Re: DXライブラリのゲームで制限時間を追加したいです
失礼します。
書かれていることだけでなく、きちんと名も無い者さんの心の中を読んでsoftya(ソフト屋)さんが回答したのでしょうか?
名も無い者 さんが書きました:ありがとうございました!目から鱗どころか水晶体まで溶け落ちそうです
「ありがとうございました」と書くだけでは感謝したことにならないことがあるのでしょうか?softya(ソフト屋) さんが書きました:あまりこういう事は言いたくないのですが、フォーラムルールにあります
http://dixq.net/board/board.html
「円滑なコミュニケーションを心がけない行為」、「質問後、お礼を言わずにトピックを閉じる、または去る行為」
に該当するかと思います。
回答してくれた皆様への感謝をお願いします。
書かれていることだけでなく、きちんと名も無い者さんの心の中を読んでsoftya(ソフト屋)さんが回答したのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリのゲームで制限時間を追加したいです
すいません。うまく伝わったいなかったですね。
私が言いたかったのは「超絶右留斗羅天才プログラマーさん」だけに対してお礼を書いていることです。
誰かにだけに返答をするのは、円滑なコミュニケーションとは言えないと思った次第です。
私が言いたかったのは「超絶右留斗羅天才プログラマーさん」だけに対してお礼を書いていることです。
誰かにだけに返答をするのは、円滑なコミュニケーションとは言えないと思った次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリのゲームで制限時間を追加したいです
無視されたらそっと無視し返すというのも円滑なコミュニケーションかと思います。
超絶右留斗羅天才プログラマーさんがそうだというわけではありませんが、質問者さんは、自分が分かる範囲の知識のみを使った回答を優先して選択する傾向が強いので、虚しく感じることは多々ありますけど、だからと言ってお礼を強制するのは見苦しいかなとか。
超絶右留斗羅天才プログラマーさんがそうだというわけではありませんが、質問者さんは、自分が分かる範囲の知識のみを使った回答を優先して選択する傾向が強いので、虚しく感じることは多々ありますけど、だからと言ってお礼を強制するのは見苦しいかなとか。