短期間での投稿お許しください。
1ステージ20秒ほどの時間制限をつけようと思いGetNowCount関数を使ってみたのですが
ぜんぜん作動してくれませんでしたorz
とりあえず6秒たったらfunction_statesでcase2のクラスに飛びたいのに
うまくいきません。
あともう一つお伺いします。
先ほど弾丸がうてるようにはなったのですが、弾の速度が速すぎるのです。
多分ch.xを多用しているからとは思いますが、
どこのch.xをとっても今度は弾がキャラからでなくなってしまうのです。
どうかご指導ご鞭撻のほど、よろしくお願いします!
時間制限がつけられない?
Re:時間制限がつけられない?
>とりあえず6秒たったらfunction_statesでcase2のクラスに飛びたいのにうまくいきません。
どのように上手く行かないのか、詳細を教えてもらえますか?
>弾の速度が速すぎるのです。
この部分の、「100」の実数値を減らすと弾速が遅くなると思います。
そしておそらく、ch.xは加算する必要ないと思います。
どのように上手く行かないのか、詳細を教えてもらえますか?
>弾の速度が速すぎるのです。
if(tama.flag==1){ //発射している玉なら tama.x+=ch.x+100; //xをキャラ位置分増やす DrawGraph( tama.x , tama.y , image2 , TRUE );//玉を描画 if(tama.x < -32){ //もし画面外まで来たら tama.x=ch.x; //初期値に戻し、 tama.flag=0; //発射フラグを戻す } }
この部分の、「100」の実数値を減らすと弾速が遅くなると思います。
そしておそらく、ch.xは加算する必要ないと思います。
Re:時間制限がつけられない?
回答ありがとうございます!
>どのように上手く行かないのか、詳細を教えてもらえますか?
上手くいかないというか、作動してくれないんです。
6秒たってもmain関数内の処理のままなんです。
>そしておそらく、ch.xは加算する必要ないと思います。
確かにch.xを加算しないと弾速度は遅くなりました。
しかしキャラから弾の描画が外れてしまうのですorz
>どのように上手く行かないのか、詳細を教えてもらえますか?
上手くいかないというか、作動してくれないんです。
6秒たってもmain関数内の処理のままなんです。
>そしておそらく、ch.xは加算する必要ないと思います。
確かにch.xを加算しないと弾速度は遅くなりました。
しかしキャラから弾の描画が外れてしまうのですorz
Re:時間制限がつけられない?
Main関数を呼ぶとして
if((GetNowCount() - StartTime) > 6000){ //1ステージの制限時間は6秒
function_status=2;
}
はwhile外なので呼ばれません。
他にもプログラムの構造的にも良くないので、
ゲームプログラミングの館を読んだほうがいいと思います。
if((GetNowCount() - StartTime) > 6000){ //1ステージの制限時間は6秒
function_status=2;
}
はwhile外なので呼ばれません。
他にもプログラムの構造的にも良くないので、
ゲームプログラミングの館を読んだほうがいいと思います。
Re:時間制限がつけられない?
if((GetNowCount() - StartTime) > 6000){ //1ステージの制限時間は6秒 function_status=2; }この部分をメインループの中に入れてやって下さい。
>しかしキャラから弾の描画が外れてしまうのですorz
私がゲームを普段しない人間なので、どのような動作を期待しているのかちょっとわからないですが、
とりあえず実数値を減らせば弾速は調整できませんか?
そして弾を発射する時のみ、tama.xにch.xを代入してはどうでしょう。
if(tama.flag==0){ //発射していない玉を探し、 tama.flag=1; //発射フラグを立てる tama.x = ch.x;//発射初期位置は自機の場所 break; }
改行を修正しました。
……あれ、修正できない?

Re:時間制限がつけられない?
>>ひよこさん
読んではいますが、なにぶん初心者なので…というより初見なものばかりで中々難しいのです。
のっぴきならない事情があり、どんなコードでもいいのでとりあえずゲーム(のようなもの)を
製作しないといけないので(@A@;){時間制限もあるので厳しいですが、何卒ご指導くださいorz
>>迷彩吹雪さん
おおおおおお!!!!!!
これです! この動作が欲しかった!!
弾の発射初期位置がキチンとキャラクターについてくれる。
ありがとうございます!
あとは時間制限がなんとかなれば。
while文の中にいれてみたものの作動する気配なしですorz
読んではいますが、なにぶん初心者なので…というより初見なものばかりで中々難しいのです。
のっぴきならない事情があり、どんなコードでもいいのでとりあえずゲーム(のようなもの)を
製作しないといけないので(@A@;){時間制限もあるので厳しいですが、何卒ご指導くださいorz
>>迷彩吹雪さん
おおおおおお!!!!!!
これです! この動作が欲しかった!!
弾の発射初期位置がキチンとキャラクターについてくれる。
ありがとうございます!
あとは時間制限がなんとかなれば。
while文の中にいれてみたものの作動する気配なしですorz
Re:時間制限がつけられない?
動作しませんでしたか……。
念のため、もう一度Main()関数の内容をアップしてもらえますか?
こちらの言葉が上手く伝わらなかったかも知れないので。
念のため、もう一度Main()関数の内容をアップしてもらえますか?
こちらの言葉が上手く伝わらなかったかも知れないので。
Re:時間制限がつけられない?
function_status=2;って書いてあっても
whileループ内にif(function_status==2)とかないから何も状況は変わりません。
whileループ内にif(function_status==2)とかないから何も状況は変わりません。
Re:時間制限がつけられない?
私が見たところでは、間違いないようですね。
function_statusはMain()関数外で使用する変数だと思いますが、他の場所で値を書き変えていないか確認してみて下さい。
例えば
[訂正]
私の勘違いでした。
ひよこさんの仰る通り、function_statusの値を利用(評価)する場所がループ内に存在しないが原因です。
function_statusはMain()関数外で使用する変数だと思いますが、他の場所で値を書き変えていないか確認してみて下さい。
例えば
if(function_status = 1){ Main(); } else if(function_status == 2){ //何か別の処理 }などとしていませんか?
[訂正]
私の勘違いでした。
ひよこさんの仰る通り、function_statusの値を利用(評価)する場所がループ内に存在しないが原因です。

Re:時間制限がつけられない?
マグロ丼さんへ 少し時間がたったのでソースを作りました。
解決できない場合見てください。
マグロ丼さんのイメージ通りに実行できると思います。
掲示板の同じ悩みの人のためにも置きます。
自分なりに書き直してます、ソースを少し解説をしました、これであっていると思います。
弾関係のソース内容
最初のwhileループ前はflagの初期化以外、特に意味はありません。
Enterキーで使っていない弾(flag==0)があったら
弾のflagを立てて(flag==1)弾のX座標にch.xを弾のY座標にch.y/2を入れています。
フラグが立っている弾を探してそれがあったら弾のX座標に100足し描画します。
弾が画面外ならフラグを下します。
whileループなどについて
whileループは1ループでメッセージ処理・キー取得などを行って
画像は1回ロードするだけで十分。(void Main()と書いてあるから)
解決できない場合見てください。
マグロ丼さんのイメージ通りに実行できると思います。
掲示板の同じ悩みの人のためにも置きます。
自分なりに書き直してます、ソースを少し解説をしました、これであっていると思います。
弾関係のソース内容
最初のwhileループ前はflagの初期化以外、特に意味はありません。
Enterキーで使っていない弾(flag==0)があったら
弾のflagを立てて(flag==1)弾のX座標にch.xを弾のY座標にch.y/2を入れています。
フラグが立っている弾を探してそれがあったら弾のX座標に100足し描画します。
弾が画面外ならフラグを下します。
whileループなどについて
whileループは1ループでメッセージ処理・キー取得などを行って
画像は1回ロードするだけで十分。(void Main()と書いてあるから)
#include "DxLib.h" char Key[256] ; //場面処理用 int function_status; //キャラクターシート int image[12]; //弾画像 int image_tama; //背景画像 int image_stage; //発射してからのカウントをする変数。 int counter=0; //始まった時間 int StartTime; struct shot{ int x,y; int flag; }; typedef struct{ int x,y,img,muki,walking_flag,attack_flag; }ch_t; ch_t ch;//キャラクターの位置 struct shot tama[50]; void calc0(){ int i; if((GetNowCount() - StartTime) > 6000){ //1ステージの制限時間は6秒 function_status=2; } DrawGraph( 0 , 0 ,image_stage, TRUE) ;//背景を描写 if(ch.x%30==0){ //座標が30で割り切れたら入力可能 ch.walking_flag=1;//歩くフラグを立てる。 if( Key[ KEY_INPUT_RIGHT ] == 1 ) //→ボタンが押されたら ch.muki=1; //右向きフラグを立てる else //何のボタンも押されてなかったら ch.walking_flag=0; //歩かないフラグを立てる if( Key[ KEY_INPUT_SPACE ] == 1 ) ch.attack_flag=1;//攻撃フラグをタテル。 } if(ch.walking_flag==1){ //歩くフラグが立っていたら if(ch.muki==1) //→向きならch.x座標を増やす ch.x++; ch.img=image[(ch.x%30)/5+6]; } if(ch.walking_flag==0){ ch.img=image[(ch.x%30)/5+0]; } if(ch.attack_flag==1){ ch.img=image[(ch.x%30)/5+2]; ch.attack_flag=0; } if(counter<5) //前にエンターを押してから5カウント未満なら counter++; //カウントアップ else if( Key[ KEY_INPUT_SPACE] == 1 ){//5カウント以上たっていたら counter=0;//カウンターを戻す for(i=0;i<50;i++){ if(tama.flag==0){ //発射していない玉を探し、 tama.x=ch.x; tama.y=ch.y/2; tama.flag=1; //発射フラグを立てる break; } } } for(i=0;i<50;i++){ if(tama.flag==1){ //発射している玉なら tama.x+=100; //xをキャラ位置分増やす DrawGraph( tama.x , tama.y , image_tama , TRUE );//玉を描画 if(tama.x < -32 || tama.x > 672){ //もし画面外まで来たら tama[i].flag=0; //発射フラグを戻す } } } DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画 //Xキーが押されてたら if(Key[KEY_INPUT_X]==1) function_status=2; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(TRUE);//ウィンドウモード if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 function_status=0; image_tama = LoadGraph("tama.png"); LoadDivGraph( "chara_sheet.png" , 12 , 3 , 4 , 250 , 250 , image );//画像を分割してimage配列に保存 image_stage = LoadGraph( "stage.png" ) ;//背景の読み込み ch.x =0; ch.y =240; ch.muki=3; ch.attack_flag; ch.walking_flag=0; int i; for(i=0;i<50;i++){ //初期化処理 tama[i].x=640/2; tama[i].y=480; //座標代入 tama[i].flag=0; //飛んでいない事を示すフラグ=0 } StartTime = GetNowCount(); while(ProcessMessage()==0 && ClearDrawScreen()==0 && !GetHitKeyStateAll(Key) && Key[KEY_INPUT_ESCAPE]==0){ //↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない switch(function_status){ case 0: calc0(); break; case 1: break; case 2: break; default: DxLib_End() ; // DXライブラリ使用の終了処理 return 0; break; } ScreenFlip(); } DxLib_End(); return 0; }
Re:時間制限がつけられない?
>>迷彩吹雪さん
ヒントを与えてくださりありがとうございました!
またよろしくお願いしますヽ(゜∀゜)ノ!
>>ひよこさん
……感動に打ち震えております。
ここまでわかりやすい、というよりまさか解答をパパっと書き上げてしまうとは……
感謝いたします。これでなんとか次の段階に進めそうです。
今日のこのコードを復習して明日以降に活かしていこうと思います!
本当にありがとうございました!
ヒントを与えてくださりありがとうございました!
またよろしくお願いしますヽ(゜∀゜)ノ!
>>ひよこさん
……感動に打ち震えております。
ここまでわかりやすい、というよりまさか解答をパパっと書き上げてしまうとは……
感謝いたします。これでなんとか次の段階に進めそうです。
今日のこのコードを復習して明日以降に活かしていこうと思います!
本当にありがとうございました!