難易度選択

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

難易度選択

#1

投稿記事 by SINA » 6年前

現在ゲームを作っておりタイトルとゲームの切り替えまではここのサイトを見ながら
なんとか作れましたがタイトルで「ゲームスタート」選択->難易度選択->ゲーム開始というように
したいのですが上手くいきません。過去の同じような質問も探してみたのですが解決に至りませんでした。
どうかよろしくお願いします。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 難易度選択

#2

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

難易度選択画面が作れないということでしょうか。
スタート画面と同じ要領で作れないのでしょうか?
C言語であれば

switch(シーン){
case スタート画面: 略; break;
case 難易度選択画面: 略; break;
case ゲーム画面: 略; break;
}

のように作ればよいのでは?

C++であれば各画面をシーンクラスから継承させて、シーンクラスをスタックに積んでおき、
一番上のシーンのみを動作させるように作ると画面遷移が楽ですよ。

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 6年前

Re: 難易度選択

#3

投稿記事 by 超絶右留斗羅天才プログラマー » 6年前

コンソール版での例を出します。
参考になれば幸いです(*´ω`*)

コード:

#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%

アバター
usao
記事: 1564
登録日時: 6年前

Re: 難易度選択

#4

投稿記事 by usao » 6年前

分岐先の種類が少ない場合はswitchで済ませた方が早いけど,
以下のような状況が今後起きることが想定されるならば,
(Cの範囲でやるなら)関数ポインタを使う方が扱いやすいかな?

・分岐先が今後多数になることが想定される場合
 例えばSRPGみたいなのを考えると
 {タイトル,難易度選択,ゲーム進行(MAP上でユニットを動かすあたり)}の他に,
 {コンフィグ,セーブロード画面,ユニットパラメタ表示画面,戦闘シーン,ステージ間のなにか}
 とかいろいろな区分が考えられる.
 実装が進んで新しいシーンが増えるたびに,「当該新シーンの処理内容コードの追加」とセットで,
 「switchで分岐している箇所の修正+シーンを表すためのマジックナンバーの増設」という雑務が発生.
 (これは↓とのコンボが発生すると一気に面倒になる可能性がある.)

・分岐処理が発生する箇所が複数になるかもしれないような場合
 例えばプログラムの流れが 処理A→処理B→処理C みたいな場所があり,
 各処理A,B,Cの中で,現在のシーン状態で処理を変えたい とかいうことになると,
 いろんなところにswitch文が散らばることになる.

SINA

Re: 難易度選択

#5

投稿記事 by SINA » 6年前

みなさんどうも有難うございます。返信が遅れた事をお詫び致します。
switch(シーン){
case スタート画面: 略; break;
case 難易度選択画面: 略; break;
case ゲーム画面: 略; break;
}
この要領で
取りあえず難易度選択画面にタイトル上で移行できるようにしその後
難易度選択を行えるようにしたいと思うのですが難易度選択画面で選択した難易度
をゲームに反映するには新・ゲームプログラミングの館の「メニュー画面の作り方.3」を例にあげるとすると
シーンマネージャーのソース内で難易度に関するポインタ変数を作り
ゲームの関数と難易度変更の関数に渡せばいいのでしょうか?その辺が混乱してしまい上手くイメージが
わきません。

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 6年前

Re: 難易度選択

#6

投稿記事 by 超絶右留斗羅天才プログラマー » 6年前

SceneMgr.cppのグローバル領域に難易度を表す変数

コード:

int g_nDifficult = 0;
を宣言し、

Game.cppのグローバル領域に

コード:

extern int g_nDifficult;
と宣言すれば、

SceneMgr.cpp内とGame.cpp内でなら、
g_nDifficultがどこでも扱えるようになります。

SceneMgr.cppで

コード:

g_nDifficult = 1;
とすれば、

Game.cppでもg_nDifficultの値が1になります。

「もっと別のやり方がいい!」という場合はまたご相談下さい。
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

びぎなぁ
記事: 6
登録日時: 6年前

Re: 難易度選択

#7

投稿記事 by びぎなぁ » 6年前

コード:

#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;
	}
}
超やっつけwwwwwww
難易度によって敵ステータスをスクリプトで引っ張ってきたりするので、実際にはグローバルで単体宣言するよりも、構造体やクラスで持ったほうがいいかもね

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 難易度選択

#8

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

ゲームプログラミングの館のコードに埋め込む形で紹介してみます。
まず、

コード:

#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で実体を作り、各モジュールにポインタを渡しています。

画像

設定画面で押されたキーに対応した難易度を格納するようにしています。

画像

ゲーム画面では変更されたコンフィグ情報を表示しています。

このようにすればグローバル変数を使う必要がありません。
いかがでしょうか。

SINA

Re: 難易度選択

#9

投稿記事 by SINA » 6年前

たくさんの助言有難うございます。グローバル関数はなにやらあまり安全な宣言ではないとの
記述を見かけましたのでもう少し理解を深めてから使いたいと思いますので管理人さんが
お勧めして頂いた方法をまずはためしてみたいとおもいます。
例のソースを貼っていただいたお二方も大いに参考にさせていただきます。
有難うございました。

閉鎖

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