ページ 11

メニューとかについて。

Posted: 2009年5月29日(金) 17:04
by 零崎虚識
メニュー画面やリザルト、ランキングはどうやって付ければ良いんでしょうか?

Re:メニューとかについて。

Posted: 2009年5月29日(金) 22:52
by lbfuvab
どんなゲームでしょうか?

Re:メニューとかについて。

Posted: 2009年5月30日(土) 15:06
by ((零崎虚識))
アイテムが落ちてきてそれを制限時間内に決まった数キャッチできればステージクリアとなるタイプのゲームです。

(管理人による補足:このコメントは成りすましのようです)

Re:メニューとかについて。

Posted: 2009年5月30日(土) 20:29
by チルチル
付けるというのは構造の話でしょうか?

関数の中で関数を呼び、その関数の中でさらに関数を呼ぶ
という処理を繰り返して作ればいいんじゃないでしょうか?

それともメニューやリザルトを表示する処理の中身ですか?

ちょっと長いですが私のコードでよければ提供しますけど・・

Re:メニューとかについて。

Posted: 2009年5月31日(日) 22:43
by conio
シーケンス遷移であれば、自分は以下のようにswitch文で分けたりしました。
-----------------------------------------------------------
StateID{ 
 STATE_TITLE, 
 STATE_MENU, 
 STATE_PLAY, 
 STATE_RANK 
}; 


StateID GameState = STATE_TITLE; 

void Title(void) 
{ 
 if(//エンターが押されたら) 
  GameState = STATE_MENU; 
} 

void Menu(void) 
{ 
 //様々な処理 
} 

//****************************** 
//その他、Play(),Rank()なども作る 
//****************************** 

void GameMain(HWND hWnd) 
{ 
 clock_t end = 0; 
 while(1){ 
  end = clock() + 16; 
  switch(GameState) 
  { 
   case STATE_TITLE: Title(); 
             break; 
   case STATE_MENU: Menu(); 
            break; 
   case STATE_PLAY: Play(); 
            break; 
   case STATE_RANK: Rank(); 
            break; 
   default:break; 
  } 
  InvalidateRect(hWnd, NULL, FALSE); 
  while(clock() < end_time)Sleep(1); 
 } 
} 
-----------------------------------------------------------

Re:メニューとかについて。

Posted: 2009年6月04日(木) 16:34
by 零崎虚識
No:34209のコメントは自分じゃないんですが……
なりすましのようです。

自分が作ってるのは「東方風弾幕シューティング」で。。。

Re:メニューとかについて。

Posted: 2009年6月04日(木) 16:44
by 零崎虚識
えーと、あと質問したい内容は処理の中身ですね。
龍神録プログラミングの館ではゲームスタートの瞬間に始まって終了するための処理も書かれていませんでしたので…

Re:メニューとかについて。

Posted: 2009年6月04日(木) 16:55
by 零崎虚識
何回もに分けてスミマセン;;
自分が弾を食らっても残機が減らないのですが…

Re:メニューとかについて。

Posted: 2009年6月04日(木) 17:31
by ひよこ
龍神録の改造なら
弾を食らった瞬間にch.num-=1;をすればいいです。

Re:メニューとかについて。

Posted: 2009年6月04日(木) 17:59
by 零崎虚識
残機解決しました!
ありがとうございます。

むぅ…

Posted: 2009年6月08日(月) 16:06
by 零崎虚識
conioさんのもよくわからないです……orz

Re:むぅ…

Posted: 2009年6月08日(月) 17:14
by やそ
メニュー画面
リザルト
ランキング

などについては
現在のゲームの状態を表すステータスを変数で用意しておく。
ゲーム開始(プログラム起動時)は0
メニュー(タイトル)画面=1
ゲーム画面2
リザルト3
ランキング4

などと決めておきます。(もちろん値は自由)
conioさんのように文字で置き換えておくと見やすくてよいでしょう。
あとはそのステータスをみてswitch文やif文などでそれぞれの処理(関数)へ飛ばしてあげればいいでしょう。
そのswitch文を書く場所は・・・まあ主にゲームのメイン関数になるでしょうか。

最初は0だからメニュー画面へ

メニュー画面ではゲーム開始が選ばれたらステータスを2に変更して戻る。

ランキングが選ばれたらステータスを4に変更して戻る。
などステータスの変更に留めておく。

メニュー画面処理が終わったらメイン関数に戻るので、きちんとループしていれば
改めてステータスにしたがってゲーム開始なり、ランキング画面になり飛ばせるでしょう。

というのがconioさんが書かれたプログラムの説明になります。

Re:むぅ…

Posted: 2009年6月10日(水) 17:15
by 零崎虚識
………(´д`;)
ごめんなさい、分からないですorz

残機0で一時停止して「はじめから」表示するプログラム教えていただけますか?
コンテニューでなく。

Re:むぅ…

Posted: 2009年6月10日(水) 22:49
by conio
---------------------------------------------------------------------------
#include "DxLib.h"
char Key[256];
enum StateID{
	STATE_TITLE,
	STATE_MENU,
	STATE_PLAY,
	STATE_PAUSE,
	STATE_RANK,
};
StateID GameState = STATE_TITLE;
int Color;

void Title(void)
{
	DrawString( 0 , 0 , "タイトル画面" , Color );
	DrawString( 0 , 50 , "Enterでメニュー画面に行きます。" , Color );

	if(CheckHitKey(KEY_INPUT_RETURN))
	{
		GameState = STATE_MENU;
	}
}

void Menu(void)
{
	DrawString( 20 , 0 , "メニュー画面(はじめから)" , Color );
	DrawString( 20 , 50 , " P でプレイ画面に行きます。" , Color );

	if(CheckHitKey(KEY_INPUT_P))
	{
		GameState = STATE_PLAY;
	}
}

void Play(void)
{
	static int zanki = 250;

	DrawFormatString( 0, 0, Color, "残機:%d ", zanki);
	if((zanki -= 1) <= 0){
		zanki = 250;
		GameState = STATE_PAUSE;
	}
}

void Pause(void)
{
	static int temp = 200;
	DrawString( 20 , 0 , "残機が0になりました。" , Color );
	DrawString( 20 , 40 , "しばらくするとメニュー画面に戻ります。" , Color );

	if((temp -= 1) <= 0){
		temp = 200;
		GameState = STATE_MENU;
	}
}

void Rank(void)
{


}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
  ChangeWindowMode( TRUE ) ;              // ウィンドウモードに変更
    if( DxLib_Init() == -1 ) return -1 ;    // DXライブラリ初期化処理
    SetDrawScreen( DX_SCREEN_BACK ) ;           // 描画先を裏画面に設定
	Color = GetColor(255,255,255);

  while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
  {
    ClearDrawScreen();           // 裏画面のデータを全て削除

    switch(GameState) 
    { 
     case STATE_TITLE: Title(); 
               break; 
     case STATE_MENU: Menu(); 
              break; 
     case STATE_PLAY: Play(); 
              break;
     case STATE_PAUSE:Pause();
              break;
     case STATE_RANK: Rank(); 
              break; 
     default:break; 
    } 
      ScreenFlip();
  }
    DxLib_End() ;   // DXライブラリ使用の終了処理
    return 0 ;      // ソフトの終了
}
---------------------------------------------------------------------------
多分、これで動くはずです。(DXライブラリver)
残機が0になる処理は、適当にデクリメントしてます。

"動くプログラムそのもの"なので、これで「分からない」と言われると、アドバイスしようがないです。

Re:むぅ…

Posted: 2009年6月11日(木) 16:04
by 零崎虚識
main.ccpをいじれば良いのでしょうか…?
うまくいかないです……orz

Re:むぅ…

Posted: 2009年6月11日(木) 21:47
by conio
>>うまくいかないです……orz
どううまくいかないのかがわからないです。
●エラーが出た
●思い通りの挙動をしない
●その他の問題が発生した
等など。
なので、何も言えないです。


>>main.ccpをいじれば良いのでしょうか…?
DXライブラリを使っているのならば、
上記のプログラムをmain.cppにコピーペーストするだけで充分です。

Re:むぅ…

Posted: 2009年6月12日(金) 09:12
by 零崎虚識
コピペ結果↓
(66) : error C3872:'0x3000': この文字を識別子で使用することはできません
(66) : error C3861:' ChangeWindowMode': 識別子が見つかりませんでした
(71) : error C3872:'0x3000': 構文エラー : ';'が、識別子' 'の前に必要です。
(70) : error C3872:'0x3000': ' while': 識別子が見つかりませんでした
(71) : error C3872:'0x3000': ' ': 定義されていない識別子です

等102個のエラーが…orz

Re:むぅ…

Posted: 2009年6月12日(金) 09:30
by conio
>>(66) : error C3872:'0x3000': この文字を識別子で使用することはできません
これは全角の空白を使った事によるエラーです。
以前は全角の空白が入っていたので、修正しておきました。

もう一度コピーペーストすれば、このエラーは出ないはずです。

Re:むぅ…

Posted: 2009年6月12日(金) 09:44
by 零崎虚識
エラー増えました(泣

effect.obj : error LNK2001: 外部シンボル ""int * img_eff_bom" (?img_eff_bom@@3PAHA)" は未解決です。
load.obj : error LNK2001: 外部シンボル ""int * img_eff_bom" (?img_eff_bom@@3PAHA)" は未解決です。
key.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
graph.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
cshot.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
boss_shotH.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
calc.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
char.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
effect.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。
ini.obj : error LNK2001: 外部シンボル ""struct configpad_t configpad" (?configpad@@3Uconfigpad_t@@A)" は未解決です。

等150個超のエラーorz

Re:むぅ…

Posted: 2009年6月12日(金) 10:18
by conio
main.cppひとつなら何も問題ないはずなのですが・・・。
恐らく複数のソースファイルがあるのでは?

複数のファイルがあって、main.cppに 必要なグローバル変数やらヘッダファイルやらあった場合、
それを削除して、上記のプログラムを丸ごとコピーペーストしたら当然"未解決"になりますよ。

簡単に「状態遷移の作り方」を書いてみただけなので、それぞれ作っているゲームなどのソースに
合うように修正しないとエラーになると思います。

Re:むぅ…

Posted: 2009年6月12日(金) 10:31
by 零崎虚識
main.ccpは龍神録50章のままですね…


あとこのスレとは関係ないんですが、ボスの各弾幕においての体力設定が分かりませんorz

Re:むぅ…

Posted: 2009年6月12日(金) 10:40
by ねこ
ひとまず無理にゲーム作ろうとせず、それぞれの処理が何をしているのか少しずつ理解していったほうが良いんじゃないですか?

それぞれのスレ・レスを見てるとC言語の基本が分かっていればどうとでもなる内容が多いと思います。
何かを作ってるのかもしれませんが、詰まっては聞きを繰り返すよりはよっぽど効率的に製作出来ると思いますよ。

Re:むぅ…

Posted: 2009年6月12日(金) 10:47
by 零崎虚識
すみません。
ですが、こちらの都合で早急に必要なんです。
少なくとも今日中にカタチをなんとかしないといけないので…。

Re:むぅ…

Posted: 2009年6月12日(金) 11:02
by 零崎虚識
エラーはなくなりましたが、残機0になっても俺つえー状態が解消されませんorz

Re:むぅ…

Posted: 2009年6月12日(金) 11:09
by conio
提出課題か何かですかね。

それはともかく、
プログラムの挙動は把握せずに、コピーペーストなどで動いた・動かなかったを
繰り返しているように見受けられます。
この状況ですと、制作を進めるのは難しいかもしれません。


>>残機0になっても俺つえー状態
この表現では何がなんだか分からないです。

Re:むぅ…

Posted: 2009年6月12日(金) 11:16
by やそ
>エラーはなくなりましたが、残機0になっても俺つえー状態が解消されませんorz
意味が分からないです。俺つえー状態って??
急いでいるのは分かりますが、もう少し分かりやすい表現をして下さい。
「今日中にカタチを~」というのもそちらの都合というだけで、善意で回答してくださっているということを忘れないで下さい。回答者に義務はありません。提供したコードについても完全にフォローしなければいけないということではありません。もちろんコードが間違っていれば、提供した側も気持ちがいいものではありませんので、ある程度のフォローはあるでしょうが。

全体的に、質問の意図(正確な状況、実現したいこと、問題点)が分かりにくい文章のようです。
ご自分が分かっていることでも画面の向こう側にいる人がおなじ思考回路を持っているわけではありませんので、そのあたりを踏まえてご質問願います。

Re:むぅ…

Posted: 2009年6月12日(金) 15:37
by 零崎虚識
残機0からピチュっても画面が変わらないです。
そのまま復活しますorz

Re:むぅ…

Posted: 2009年6月12日(金) 15:45
by conio
残機が0で やられた時は、
ゲームオーバーの画面でも出すようにすれば良いと思いますよ。

Re:むぅ…

Posted: 2009年6月12日(金) 16:12
by ねこ
いやだから何が分からないのかが不明瞭なんですよ。

1.自分で作ったソースは見せられないのですか?
零崎虚識さんは自作している部分を全く提示してないから閲覧者は問題点が見えません、分かりません

2.conioさんの提示したソースはどのように活用したのですか?
コピペしただけ?
コピペして自作部分を追加?
参考にして自作部分に追加?
ソースが出てるのにそれをどう使ったのか分からないと現状を把握出来ません。

3.最終的に何がしたいのか?
おそらく龍神録のソースを元に改変してるんだと思いますが
どういう改変をして零崎虚識さんの言う「ある程度のカタチ」なのか
何が出来ていて何が出来ていないのか。日本語で良いので示してください。

4.C言語の理解度を教えてください
教える側も質問者の理解度に応じて詳細に書いたり簡易に書いたりします。
例えば「No:34921」のconioさんの言ってる内容をソースでどこを変えれば良いとのか分かるか等
極端に言えば龍神録を通じてC言語覚えたいと思います、現在は基本もほとんど分かっていません。
でも良いと思います。

Re:むぅ…

Posted: 2009年6月12日(金) 16:36
by やそ
>残機0からピチュっても画面が変わらないです。
>そのまま復活しますorz

うーん、質問の仕方についてアドバイスしたつもりでしたが、
無視されましたか。
ま、いいです。へこたれません(笑)

で、ピチュって何?(笑)

>そのまま復活しますorz
だから結局どうなってほしいのでしょうか?

conioさんの言われるとおり、残機を判定して0ならゲームオーバー画面にでも遷移すればよいだけだと
私も思います。

このままだとconioさんも心折れる日も近いぞ(^^;)

Re:むぅ…

Posted: 2009年6月12日(金) 17:07
by 零崎虚識
なんとか死亡後に停止させることはできました。
ありがとうございました。

しかしボスのスペカの体力設定が未だに……

Re:むぅ…

Posted: 2009年6月12日(金) 17:24
by ひよこ
龍神録の改造なら
int boss_hp[DANMAKU_MAX]という関数があります。

Re:むぅ…

Posted: 2009年6月12日(金) 20:24
by conio
>>やそさん
敵の弾などに当たってやられる事を"ピチュる"と表現したりするようです。
確か"東方"というシューティングゲームが元だったと思います。
(本題と離れていきそうだったので、あえて再三の指摘はしませんでしたが)


>>しかしボスのスペカの体力設定が未だに……
残念ながらゲームの仕様や内部構造や用語は分からないので、どうしようもないです。
ひとり言なのか、質問なのかも曖昧です。


あと、何で今日中に形にしないといけないのかは知りませんが、どうにも無理があるように見受けられます。
-----------------------------------
①就職活動で企業に提出する
②学校の課題で出さなければならない
③友人などに、遊ばせる約束をした
-----------------------------------
色んな理由が考えられますが、明らかにゲームを制作するだけの経験が不足しています。
"残機の減らし方が分からない"(普通の引き算)という質問もありました。

どれくらいの能力を要求されているのかは分かりませんが、
「単純にゲームとして遊べるものを提出する」
という事であれば、コンソールアプリケーションのものでも良いのでは無いでしょうか。

どうしても、画像なども使ったゲームを作らなければならないと言うのであれば、
今回は、プログラムの把握・理解は後回しにして、やっつけ作業をせざるを得ないですね。
(好ましくは無いのですが)

Re:むぅ…

Posted: 2009年6月13日(土) 11:37
by すずめ
conioさん、こんにちは。
ちょうど私もメニュー画面を作ろうと思っていたので、
参考にさせていただきました。ありがとうございます。

私は STATE_EXIT を追加しました。
キーを押すとExit()を呼び出します。Exet()を
void Exit(){
	DxLib_End();
}
としたところ、見事にウインドウが消えましたが、
これでいいのでしょうか?

やそさんへ
お気持ち察します。

Re:むぅ…

Posted: 2009年6月13日(土) 16:35
by conio
>>すずめさん
こんにちは
それで、問題ないと思います。
ウィンドウの×を押した時と同じように消えると思います。

あと補足なのですが、同じキーで複数の状態遷移を通過するときは、
上記のプログラムでは、不都合があると思います。



【タイトル】 (Enter)⇒ 【メニュー】 (Enter)⇒ 【ステージ選択】 (Enter)⇒ 【ゲーム開始】

このように遷移するようにしている場合、Enterを押すと一瞬でゲームが始まります。
(何度もループが実行されているため)

なので、この場合は時間を計ったり、ループが何回か実行されたらキー入力を受け付ける
というような処理にする必要があります。

Re:むぅ…

Posted: 2009年6月13日(土) 19:06
by すずめ
私の場合、メニューの画像を縦に並べ、その脇に
カーソルのような画像を上下に移動させ(上下キー)、それが
止まったところをENTERで決定、という感じです。

conioさんが仰るとうり、いまは上下キーを押すと
すごいスピードでカーソルが移動しています。

処理を一定時間ループさせる方法はこのサイトにも
解説されているので、工夫すればできると思います。

いろいろありがとうございました。

零崎虚識さんも私にとってタイムリーな質問をしていただいて
感謝しています。

Re:むぅ…

Posted: 2009年6月17日(水) 04:52
by 通りすがり
「残機0になっても俺つえー状態が解消されない」というのは
キャラに弾が当たってパワーアップアイテムが放出してるのにもかかわらず
パワーの数字が減らなくて困ってるってことなんじゃないですか?

Re:むぅ…

Posted: 2009年6月18日(木) 15:24
by やそ
>「残機0になっても俺つえー状態が解消されない」というのは
>キャラに弾が当たってパワーアップアイテムが放出してるのにもかかわらず
>パワーの数字が減らなくて困ってるってことなんじゃないですか?

「困ってる」ことは分かるんですが、一体全体どういう状況で、どうなって欲しくて、
どういうエラーが出ているのかいないのか。
質問の文章からではちんぷんかんぷんでございます(笑)

通りすがりさんの解釈も間違っていないと思います。
そういう状況なのかなーとも思うんですけど・・・

「残機0になっても俺つえー状態が解消されない」
とか「ピチュ」とかでは
相手に正確な状況、意図が伝わらないんじゃないかと思ってます。
私は「東方~」はやったことありませんので、そのへんの方言はよく分かりません^^;
(なんとなくニュアンスで分かりそうですが)

Re:むぅ…

Posted: 2009年6月18日(木) 17:34
by ひよこ
龍神録の改造なら今の瞬間死んだらのところに
ch.power-=190;if(ch.power<0)ch.power=0;
を追加するといいと思います。

Re:むぅ…

Posted: 2009年6月18日(木) 21:49
by DX
内容が全く理解できていないのにメニューを付けようとしている辺り、
そしてどこかに提出しようとしている辺り、
完全に龍神録の館のコードをそのまま提出しようとしているように見受けられますが、
許可は取ったんですか?

意味不明な言葉ばかり並べて、質問内容も全くわからない。
質問者が全く誠意が無いのに、必死になって回答者が助けようとしているこの場が、なんというか見ていられません・・。

Re:むぅ…

Posted: 2009年6月18日(木) 22:02
by Dixq (管理人)
俺つえー状態・・・。なんという個性的な説明^^;

そうですね~龍神録プログラミングの館は色々と中途ハンパですからねぇ(汗
実は本家龍神録とコード違いますし^^;
一から解説するのに元のコードをバラバラにする方がややこしかったので、
いっそのことわかりやすそうなコードで一から作りました。
そのせいで、微妙にところどころ違うんですが・・。

>このように遷移するようにしている場合、Enterを押すと一瞬でゲームが始まります。

ご存知かとは思いますが、一応このような関数を作れば実装出来ること、コメ残しておきます。
http://dixq.net/g/#40

~から、~まで

Posted: 2009年6月28日(日) 12:17
by ICE
はじめまして。最近C言語を習い始めたばかりの初心者ですがお願いします。

今、学校でゲームを作っているのですが「~から、~まで」の効率良い作り方がわかりません。
10から15の値を出したいのです。
自分がやった感じは
 int r;
 r = rand()%15;
 printf("ランダム=%d\n",r)
これだと15までの値しかでません。
そこで
 int r;
 r = rand()15;*
 if(r >= 10){
  printf("ランダム=%d\n",r);
 }
という風にif文でやってみました。
こういう風でも良いのですが、*の所で「~から」というの制御できませんでしょうか?

Re:~から、~まで

Posted: 2009年6月28日(日) 12:27
by MNS
int r;
r = rand() % 5 + 10;
で良いのでは?

Re:~から、~まで

Posted: 2009年6月28日(日) 12:29
by チルチル
よくわかりませんが

10から15までの乱数を出したいなら

0から5までの乱数を出して10を足せば良いんじゃないでしょうか?

あ、被ってしまいましたね・・

Re:~から、~まで

Posted: 2009年6月28日(日) 12:40
by pooka
私も皆さんの方法でやると思いますが、一応参考に
ttp://homepage3.nifty.com/mmgames/c_guide/21-02.html#S3

Re:~から、~まで

Posted: 2009年6月28日(日) 16:13
by conio
----------------------------------
 int r;
 r = rand()%15;
 printf("ランダム=%d\n",r)

これだと15までの値しかでません。
----------------------------------

いや、15の値は出ないですよ。
出るのは、0~14までの値です。


---------------------
int r;
r = 10 + rand() % 6;
---------------------
10~15までの値を出したいのであれば、
こうすれば良いと思います。

「10 + 0~5のどれか」 と考えれば分かりやすいのではないかな、と。

Re:~から、~まで

Posted: 2009年6月28日(日) 23:53
by ICE
MNSさん、チルチルさん、pookaさん、conioさんありがとうございます!
こうすれば良かったのですね。ありがとうございます。

<conioさん
すみません。勘違いをしていました。