現在ゲームを作っておりタイトルとゲームの切り替えまではここのサイトを見ながら
なんとか作れましたがタイトルで「ゲームスタート」選択->難易度選択->ゲーム開始というように
したいのですが上手くいきません。過去の同じような質問も探してみたのですが解決に至りませんでした。
どうかよろしくお願いします。
難易度選択
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 難易度選択
難易度選択画面が作れないということでしょうか。
スタート画面と同じ要領で作れないのでしょうか?
C言語であれば
switch(シーン){
case スタート画面: 略; break;
case 難易度選択画面: 略; break;
case ゲーム画面: 略; break;
}
のように作ればよいのでは?
C++であれば各画面をシーンクラスから継承させて、シーンクラスをスタックに積んでおき、
一番上のシーンのみを動作させるように作ると画面遷移が楽ですよ。
スタート画面と同じ要領で作れないのでしょうか?
C言語であれば
switch(シーン){
case スタート画面: 略; break;
case 難易度選択画面: 略; break;
case ゲーム画面: 略; break;
}
のように作ればよいのでは?
C++であれば各画面をシーンクラスから継承させて、シーンクラスをスタックに積んでおき、
一番上のシーンのみを動作させるように作ると画面遷移が楽ですよ。
-
- 記事: 44
- 登録日時: 11年前
Re: 難易度選択
コンソール版での例を出します。
参考になれば幸いです(*´ω`*)
参考になれば幸いです(*´ω`*)
#include <stdio.h>
int g_scene = 0; // 今どの関数を実行するか
int g_difficult=0; // 難易度
void Title(); // タイトル関数
void Select(); // 難易度選択関数
void Game(); // ゲーム実行関数
// ここから始まります
void main(void){
while(g_scene!=-1){
switch(g_scene){
case 0:Title();break;
case 1:Select();break;
case 2:Game();break;
}
}
printf("ゲームを終了しました\n");
rewind(stdin);
getchar();
}
void Title(){
printf("①タイトルです。Enterで難易度選択へ。\n");
rewind(stdin);
getchar();
g_scene = 1;
}
void Select(){
printf("②難易度選択です。数字を入力すると難易度を設定します\n");
scanf("%d",&g_difficult);
g_scene = 2;
}
void Game(){
printf("\n③ゲーム実行中です。\n難易度は%dです\n",g_difficult);
printf("Enterでゲームを終了します。\n");
rewind(stdin);
getchar();
g_scene = -1;
}
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: 難易度選択
分岐先の種類が少ない場合はswitchで済ませた方が早いけど,
以下のような状況が今後起きることが想定されるならば,
(Cの範囲でやるなら)関数ポインタを使う方が扱いやすいかな?
・分岐先が今後多数になることが想定される場合
例えばSRPGみたいなのを考えると
{タイトル,難易度選択,ゲーム進行(MAP上でユニットを動かすあたり)}の他に,
{コンフィグ,セーブロード画面,ユニットパラメタ表示画面,戦闘シーン,ステージ間のなにか}
とかいろいろな区分が考えられる.
実装が進んで新しいシーンが増えるたびに,「当該新シーンの処理内容コードの追加」とセットで,
「switchで分岐している箇所の修正+シーンを表すためのマジックナンバーの増設」という雑務が発生.
(これは↓とのコンボが発生すると一気に面倒になる可能性がある.)
・分岐処理が発生する箇所が複数になるかもしれないような場合
例えばプログラムの流れが 処理A→処理B→処理C みたいな場所があり,
各処理A,B,Cの中で,現在のシーン状態で処理を変えたい とかいうことになると,
いろんなところにswitch文が散らばることになる.
以下のような状況が今後起きることが想定されるならば,
(Cの範囲でやるなら)関数ポインタを使う方が扱いやすいかな?
・分岐先が今後多数になることが想定される場合
例えばSRPGみたいなのを考えると
{タイトル,難易度選択,ゲーム進行(MAP上でユニットを動かすあたり)}の他に,
{コンフィグ,セーブロード画面,ユニットパラメタ表示画面,戦闘シーン,ステージ間のなにか}
とかいろいろな区分が考えられる.
実装が進んで新しいシーンが増えるたびに,「当該新シーンの処理内容コードの追加」とセットで,
「switchで分岐している箇所の修正+シーンを表すためのマジックナンバーの増設」という雑務が発生.
(これは↓とのコンボが発生すると一気に面倒になる可能性がある.)
・分岐処理が発生する箇所が複数になるかもしれないような場合
例えばプログラムの流れが 処理A→処理B→処理C みたいな場所があり,
各処理A,B,Cの中で,現在のシーン状態で処理を変えたい とかいうことになると,
いろんなところにswitch文が散らばることになる.
Re: 難易度選択
みなさんどうも有難うございます。返信が遅れた事をお詫び致します。
switch(シーン){
case スタート画面: 略; break;
case 難易度選択画面: 略; break;
case ゲーム画面: 略; break;
}
この要領で
取りあえず難易度選択画面にタイトル上で移行できるようにしその後
難易度選択を行えるようにしたいと思うのですが難易度選択画面で選択した難易度
をゲームに反映するには新・ゲームプログラミングの館の「メニュー画面の作り方.3」を例にあげるとすると
シーンマネージャーのソース内で難易度に関するポインタ変数を作り
ゲームの関数と難易度変更の関数に渡せばいいのでしょうか?その辺が混乱してしまい上手くイメージが
わきません。
switch(シーン){
case スタート画面: 略; break;
case 難易度選択画面: 略; break;
case ゲーム画面: 略; break;
}
この要領で
取りあえず難易度選択画面にタイトル上で移行できるようにしその後
難易度選択を行えるようにしたいと思うのですが難易度選択画面で選択した難易度
をゲームに反映するには新・ゲームプログラミングの館の「メニュー画面の作り方.3」を例にあげるとすると
シーンマネージャーのソース内で難易度に関するポインタ変数を作り
ゲームの関数と難易度変更の関数に渡せばいいのでしょうか?その辺が混乱してしまい上手くイメージが
わきません。
-
- 記事: 44
- 登録日時: 11年前
Re: 難易度選択
SceneMgr.cppのグローバル領域に難易度を表す変数
を宣言し、
Game.cppのグローバル領域に と宣言すれば、
SceneMgr.cpp内とGame.cpp内でなら、
g_nDifficultがどこでも扱えるようになります。
SceneMgr.cppで とすれば、
Game.cppでもg_nDifficultの値が1になります。
「もっと別のやり方がいい!」という場合はまたご相談下さい。
Game.cppのグローバル領域に と宣言すれば、
SceneMgr.cpp内とGame.cpp内でなら、
g_nDifficultがどこでも扱えるようになります。
SceneMgr.cppで とすれば、
Game.cppでもg_nDifficultの値が1になります。
「もっと別のやり方がいい!」という場合はまたご相談下さい。
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: 難易度選択
#include <stdio.h>
#include <conio.h>
#include <windows.h>
enum{
TITLE,
D_SELECT,
GAME,
GAMEOVER
};
void game(int dif);
int difficulty;
int main(void){
int gamef = TITLE, endf = 0;
while(!endf){
system("cls");
switch(gamef){
case TITLE:
printf("タイトルです\n");
rewind(stdin);
if(getch())
gamef = D_SELECT;
break;
case D_SELECT:
printf("難易度を選択してください\n1.easy\t2.normal 3.hard\t4.very hard\t0.戻る\n->");
rewind(stdin);
scanf("%d", &difficulty);
if(difficulty == 0)
gamef = TITLE;
else
gamef = GAME;
break;
case GAME:
game(difficulty);
rewind(stdin);
if(getch())
gamef = GAMEOVER;
break;
case GAMEOVER:
printf("ゲームを終了します\n");
if(getch())
endf = 1;
break;
}
}
return 0;
}
void game(int dif){
switch(dif){
case 1:
printf("現在の難易度はeasyです\n");
break;
case 2:
printf("現在の難易度はnormalです\n");
break;
case 3:
printf("現在の難易度はhardです\n");
break;
case 4:
printf("現在の難易度はvery hardです\n");
break;
}
}
難易度によって敵ステータスをスクリプトで引っ張ってきたりするので、実際にはグローバルで単体宣言するよりも、構造体やクラスで持ったほうがいいかもね
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 難易度選択
ゲームプログラミングの館のコードに埋め込む形で紹介してみます。
まず、
ゲーム全体の設定にかかわるデータを格納する構造体を作ります。
もし設定画面でショットパターンなどを選択したいならDConfig_tに追加していってください。
これを使ってSceneMgrで実体を作り、各モジュールにポインタを渡してやります。
プロジェクトは以下のようになりました。
http://dixq.net/BBS/img/config/MenuTest3_2.zip
※確認の仕方
Cキーで設定画面に行き、0か1か2を押してください(画面にリアクションはありません)
Escキーで戻り、続いてGキーでゲーム画面に進んでください。
さっき設定画面で押したキーがゲーム画面に表示されます。
差分はWinMergeで確認してください。
WinMergeはソースコードの変更点を確認できるソフトです。
こちらに使い方を書いています。
http://dixq.net/rp/winmerge.html
一部ここでも差分をお見せします。
SneceMgrで実体を作り、各モジュールにポインタを渡しています。
設定画面で押されたキーに対応した難易度を格納するようにしています。
ゲーム画面では変更されたコンフィグ情報を表示しています。
このようにすればグローバル変数を使う必要がありません。
いかがでしょうか。
まず、
#pragma once
//難易度
enum eDifficultyLv_t {
eDifficultyLv_Easy, //イージー
eDifficultyLv_Normal, //ノーマル
eDifficultyLv_Hard, //ハード
};
typedef struct {
eDifficultyLv_t difficultyLv; //難易度
} DConfig_t; //設定
もし設定画面でショットパターンなどを選択したいならDConfig_tに追加していってください。
これを使ってSceneMgrで実体を作り、各モジュールにポインタを渡してやります。
プロジェクトは以下のようになりました。
http://dixq.net/BBS/img/config/MenuTest3_2.zip
※確認の仕方
Cキーで設定画面に行き、0か1か2を押してください(画面にリアクションはありません)
Escキーで戻り、続いてGキーでゲーム画面に進んでください。
さっき設定画面で押したキーがゲーム画面に表示されます。
差分はWinMergeで確認してください。
WinMergeはソースコードの変更点を確認できるソフトです。
こちらに使い方を書いています。
http://dixq.net/rp/winmerge.html
一部ここでも差分をお見せします。
SneceMgrで実体を作り、各モジュールにポインタを渡しています。
設定画面で押されたキーに対応した難易度を格納するようにしています。
ゲーム画面では変更されたコンフィグ情報を表示しています。
このようにすればグローバル変数を使う必要がありません。
いかがでしょうか。