メニューとかについて。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
零崎虚識

メニューとかについて。

#1

投稿記事 by 零崎虚識 » 16年前

メニュー画面やリザルト、ランキングはどうやって付ければ良いんでしょうか?

lbfuvab

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

#2

投稿記事 by lbfuvab » 16年前

どんなゲームでしょうか?

((零崎虚識))

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

#3

投稿記事 by ((零崎虚識)) » 16年前

アイテムが落ちてきてそれを制限時間内に決まった数キャッチできればステージクリアとなるタイプのゲームです。

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

チルチル

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

#4

投稿記事 by チルチル » 16年前

付けるというのは構造の話でしょうか?

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

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

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

conio

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

#5

投稿記事 by conio » 16年前

シーケンス遷移であれば、自分は以下のように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:メニューとかについて。

#6

投稿記事 by 零崎虚識 » 16年前

No:34209のコメントは自分じゃないんですが……
なりすましのようです。

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

零崎虚識

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

#7

投稿記事 by 零崎虚識 » 16年前

えーと、あと質問したい内容は処理の中身ですね。
龍神録プログラミングの館ではゲームスタートの瞬間に始まって終了するための処理も書かれていませんでしたので…

零崎虚識

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

#8

投稿記事 by 零崎虚識 » 16年前

何回もに分けてスミマセン;;
自分が弾を食らっても残機が減らないのですが…

ひよこ

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

#9

投稿記事 by ひよこ » 16年前

龍神録の改造なら
弾を食らった瞬間にch.num-=1;をすればいいです。

零崎虚識

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

#10

投稿記事 by 零崎虚識 » 16年前

残機解決しました!
ありがとうございます。

零崎虚識

むぅ…

#11

投稿記事 by 零崎虚識 » 16年前

conioさんのもよくわからないです……orz

やそ

Re:むぅ…

#12

投稿記事 by やそ » 16年前

メニュー画面
リザルト
ランキング

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

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

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

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

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

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

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

零崎虚識

Re:むぅ…

#13

投稿記事 by 零崎虚識 » 16年前

………(´д`;)
ごめんなさい、分からないですorz

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

conio

Re:むぅ…

#14

投稿記事 by conio » 16年前

---------------------------------------------------------------------------
#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:むぅ…

#15

投稿記事 by 零崎虚識 » 16年前

main.ccpをいじれば良いのでしょうか…?
うまくいかないです……orz

conio

Re:むぅ…

#16

投稿記事 by conio » 16年前

>>うまくいかないです……orz
どううまくいかないのかがわからないです。
●エラーが出た
●思い通りの挙動をしない
●その他の問題が発生した
等など。
なので、何も言えないです。


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

零崎虚識

Re:むぅ…

#17

投稿記事 by 零崎虚識 » 16年前

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

等102個のエラーが…orz

conio

Re:むぅ…

#18

投稿記事 by conio » 16年前

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

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

零崎虚識

Re:むぅ…

#19

投稿記事 by 零崎虚識 » 16年前

エラー増えました(泣

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

conio

Re:むぅ…

#20

投稿記事 by conio » 16年前

main.cppひとつなら何も問題ないはずなのですが・・・。
恐らく複数のソースファイルがあるのでは?

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

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

零崎虚識

Re:むぅ…

#21

投稿記事 by 零崎虚識 » 16年前

main.ccpは龍神録50章のままですね…


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

ねこ

Re:むぅ…

#22

投稿記事 by ねこ » 16年前

ひとまず無理にゲーム作ろうとせず、それぞれの処理が何をしているのか少しずつ理解していったほうが良いんじゃないですか?

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

零崎虚識

Re:むぅ…

#23

投稿記事 by 零崎虚識 » 16年前

すみません。
ですが、こちらの都合で早急に必要なんです。
少なくとも今日中にカタチをなんとかしないといけないので…。

零崎虚識

Re:むぅ…

#24

投稿記事 by 零崎虚識 » 16年前

エラーはなくなりましたが、残機0になっても俺つえー状態が解消されませんorz

conio

Re:むぅ…

#25

投稿記事 by conio » 16年前

提出課題か何かですかね。

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


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

やそ

Re:むぅ…

#26

投稿記事 by やそ » 16年前

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

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

零崎虚識

Re:むぅ…

#27

投稿記事 by 零崎虚識 » 16年前

残機0からピチュっても画面が変わらないです。
そのまま復活しますorz

conio

Re:むぅ…

#28

投稿記事 by conio » 16年前

残機が0で やられた時は、
ゲームオーバーの画面でも出すようにすれば良いと思いますよ。

ねこ

Re:むぅ…

#29

投稿記事 by ねこ » 16年前

いやだから何が分からないのかが不明瞭なんですよ。

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

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

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

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

やそ

Re:むぅ…

#30

投稿記事 by やそ » 16年前

>残機0からピチュっても画面が変わらないです。
>そのまま復活しますorz

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

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

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

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

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

零崎虚識

Re:むぅ…

#31

投稿記事 by 零崎虚識 » 16年前

なんとか死亡後に停止させることはできました。
ありがとうございました。

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

ひよこ

Re:むぅ…

#32

投稿記事 by ひよこ » 16年前

龍神録の改造なら
int boss_hp[DANMAKU_MAX]という関数があります。

conio

Re:むぅ…

#33

投稿記事 by conio » 16年前

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


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


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

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

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

すずめ

Re:むぅ…

#34

投稿記事 by すずめ » 16年前

conioさん、こんにちは。
ちょうど私もメニュー画面を作ろうと思っていたので、
参考にさせていただきました。ありがとうございます。

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

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

conio

Re:むぅ…

#35

投稿記事 by conio » 16年前

>>すずめさん
こんにちは
それで、問題ないと思います。
ウィンドウの×を押した時と同じように消えると思います。

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



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

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

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

すずめ

Re:むぅ…

#36

投稿記事 by すずめ » 16年前

私の場合、メニューの画像を縦に並べ、その脇に
カーソルのような画像を上下に移動させ(上下キー)、それが
止まったところをENTERで決定、という感じです。

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

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

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

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

通りすがり

Re:むぅ…

#37

投稿記事 by 通りすがり » 16年前

「残機0になっても俺つえー状態が解消されない」というのは
キャラに弾が当たってパワーアップアイテムが放出してるのにもかかわらず
パワーの数字が減らなくて困ってるってことなんじゃないですか?

やそ

Re:むぅ…

#38

投稿記事 by やそ » 16年前

>「残機0になっても俺つえー状態が解消されない」というのは
>キャラに弾が当たってパワーアップアイテムが放出してるのにもかかわらず
>パワーの数字が減らなくて困ってるってことなんじゃないですか?

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

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

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

ひよこ

Re:むぅ…

#39

投稿記事 by ひよこ » 16年前

龍神録の改造なら今の瞬間死んだらのところに
ch.power-=190;if(ch.power<0)ch.power=0;
を追加するといいと思います。

DX

Re:むぅ…

#40

投稿記事 by DX » 16年前

内容が全く理解できていないのにメニューを付けようとしている辺り、
そしてどこかに提出しようとしている辺り、
完全に龍神録の館のコードをそのまま提出しようとしているように見受けられますが、
許可は取ったんですか?

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

Dixq (管理人)

Re:むぅ…

#41

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

俺つえー状態・・・。なんという個性的な説明^^;

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

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

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

ICE

~から、~まで

#42

投稿記事 by ICE » 16年前

はじめまして。最近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文でやってみました。
こういう風でも良いのですが、*の所で「~から」というの制御できませんでしょうか?

MNS

Re:~から、~まで

#43

投稿記事 by MNS » 16年前

int r;
r = rand() % 5 + 10;
で良いのでは?

チルチル

Re:~から、~まで

#44

投稿記事 by チルチル » 16年前

よくわかりませんが

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

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

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

pooka

Re:~から、~まで

#45

投稿記事 by pooka » 16年前

私も皆さんの方法でやると思いますが、一応参考に
ttp://homepage3.nifty.com/mmgames/c_guide/21-02.html#S3

conio

Re:~から、~まで

#46

投稿記事 by conio » 16年前

----------------------------------
 int r;
 r = rand()%15;
 printf("ランダム=%d\n",r)

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

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


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

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

ICE

Re:~から、~まで

#47

投稿記事 by ICE » 16年前

MNSさん、チルチルさん、pookaさん、conioさんありがとうございます!
こうすれば良かったのですね。ありがとうございます。

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

閉鎖

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