ページ 1 / 1
シューティングゲームのタイトル画面について
Posted: 2008年1月24日(木) 22:16
by ф魔理沙ф
えっとC言語歴2年(真面目やり始めて2ヶ月)のいつもサイト拝見させてもらってる者です。
今、サイトを参考にしつつシューティングゲームを制作させてもらってるのですが、
館のプログラムだとタイトル画面からGameStartを押すとゲーム開始みたいなことが
乗っていなかったので(見落としかもしれませんが^^;
ちょっと聞きたいんですが、どのようにしたらそんな感じにできるのでしょうか?
自分的にはmain.cppの方で全てのゲームの流れをやりたいのですが・・・
とりあえずサイトの方は一通りやってみました。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月24日(木) 23:42
by はね
はじめまして。
私はいつも列挙型で下のように書いています。
enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
int State= TITLE;
メインループ{
switch(State){
case TITLE:
タイトルで処理する関数
break;
case RUN:
プレイ画面(?)で処理する関数
break;
case GAMEOVER:
ゲームオーバーで処理する関数
break;
case CLEAR:
クリア画面で処理する関数
break;
}
}
のようなことを書いています。
int型変数を用いて、1ならタイトル、2ならクリアー。のように書いても良いと思いますが
パッと見でわかりやすいので列挙型を使っています。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 00:23
by ф魔理沙ф
返信ありがとうございます"(*^^)/。・:*:・゜★,。・:*:・゜☆
何となく感覚的にわかるんですが・・・[壁]-T)
えっと、メインループのところで
switch(State){
case TITLE:
タイトルで処理する関数
break;
case RUN:
プレイ画面(?)で処理する関数
break;
case GAMEOVER:
ゲームオーバーで処理する関数
break;
case CLEAR:
クリア画面で処理する関数
break;
}
}
のコードの「タイトルで処理する関数」とかありますが、
その処理をほかのcppファイル丸ごと引っ張ってくるにはどうすればいいのでしょう?
一個一個の関数をグローバルで引っ張って来た方がいいのでしょうか?
すいません初心者で[壁]-T)授業中寝てばっかりなので・・・(‐‐).。oO
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 01:02
by はね
呼び出したい関数をプロトタイプ宣言すれば大丈夫ですよ。
======Title.cpp=====================================
void Title(){
処理云々
}
====================================================
=======main.cpp=====================================
//プロトタイプ宣言
void Title();
メインループ{
Title();
}
====================================================
でいけます。
ちなみに、
プロトタイプ宣言はそのcppファイルがインクルードしているヘッダーファイルで行うのが一般的です。
詳しくは「ヘッダーファイル」や「プロトタイプ宣言」で調べてみてください。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 02:04
by ф魔理沙ф
やり方はわかりました。ありがとうございます(≧∇≦)/
それで早速やってみたのですが、
int START = title;
の宣言のことで
error C2628: '<unnamed-tag>' の後に 'int' を続けて記述できません(セミコロン ';' で区切ってあるか確認してください)。
と出てはじかれてしまいます。何ででしょうか?
何度も質問ばっかりですいません(ノ_<。)
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 02:30
by ф魔理沙ф
すいません。↑の問題は自己解決できました^_^;
しかし次は処理のことでわからないのですが、
当然の事ながらcase文で囲ってある以上、値を変化させないといけないですよね?
それで、はねさんの言うとおり
======Title.cpp=====================================
void Title(){
処理云々
state = RUN
}
====================================================
=======main.cpp=====================================
//プロトタイプ宣言
void Title();
メインループ{
case title:
Title();
case RUN:
ゲーム処理
}
====================================================
という形でプログラムを組んでみたのですが、
なぜか宣言の段階ではじかれてるみたいでうまくいきません。
ちなみにtitle.cppのほうではじかれています。
またしてもご教授お願いいたします(ノ_<。)
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 02:40
by はね
int START = title;
は間違っていないですし、
それだけでは憶測でしか言えないのですが、
エラーを見るかぎり、「;」が抜けているかもしれないです。
今回の処理で間違いやすい点としてはenumに;を忘れることが多いです。
enum{
title,
};←
最後に;がありますでしょうか?
もし解決しなければ、よろしければソースを見せてください。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 02:46
by はね
おっと、入れ違いになってしまいましたね^^;
上のソースを見る限り、
state = RUN に;が無いのですがどうでしょう?
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 02:57
by ф魔理沙ф
あ、すいません(ノ_<。)
そこの部分は手打ちしたので抜けていました。
プログラムの方はしっかりと入っています。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 03:05
by はね
>プログラムの方はしっかりと入っています。
そうでしたか。
だと、現状の情報ではわからないので
エラーと、もしよければソースを見せていただけないでしょうか?
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 03:13
by ф魔理沙ф
あ、すいません^^;
えっと長いですけどのせてみます。
=======main.cpp=====================================
#include "DxLib.h"
#include "GlobalVariable.h"
enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
int State = TITLE;
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
extern void img_sound_load();
extern void initialization();
extern void SetColor();
extern void Background();
extern void PlayerShotCalc();
extern void PlayerShotDisp();
extern void PlayerControl();
extern void EnemyControl();
extern void EnemyCalcDisp();
extern void EnemyShotControl();
extern void EnemyShotCalcDisp();
extern void CollisionDetection();
extern void Background2();
extern void FpsTimeFanction();
extern void title();
int RefreshTime=0;
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。
img_sound_load();
initialization();
SetColor();
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
switch(State){
case TITLE:
title();
break;
if(Key[KEY_INPUT_ESCAPE]==1)
break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
case RUN:
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除
Background();
PlayerShotCalc();
PlayerShotDisp();
PlayerControl();
EnemyControl();
EnemyCalcDisp();
EnemyShotControl();
EnemyShotCalcDisp();
CollisionDetection();
Background2();
FpsTimeFanction();
ScreenFlip() ; //裏画面データを表画面へ反映
counter++;
break;
if(Key[KEY_INPUT_ESCAPE]==1)
break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
case GAMEOVER:
break;
case CLEAR:
break;
}
}
DxLib_End();
return 0;
}
====================================================
=======title.cpp=====================================
#include "DxLib.h"
#include "ExternGV.h"
void title(){
DrawGraph(0,0,img_background[2],FALSE);
if(CheckHitKeyAll()==1)
State = RUN;
}
====================================================
とこんな感じになっています。どうでしょうか?
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 03:22
by はね
enum と int State がローカルになっているので
Title.cppでは見つけられません。
たぶんエラー内容は「State がみつかりません」とかなっているのではないでしょうか?
enum と int State をグローバルにしてください。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 03:43
by ф魔理沙ф
ご教授の通りグローバルで宣言してみました。
そうしたら今度は再定義のエラーがでてしまいました。
何ででしょう?(ノ_<。)
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 04:02
by ф魔理沙ф
すいません。↑の奴の修正です。
グローバルで
extern enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
extern int State;
と宣言したら、一応エラーは無くなって動くことはできたのですが、
これだとStateに何も入っていないので動かしても真っ黒なままです。
なのでextern int State=TITLEとしたいのですが、これだと再定義が出るようです。
どうしたらいいでしょうか?
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 04:26
by はね
GlobalVariable.hに
enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
int State=TITLE;
と書いていますか?
externはどこかにその変数や関数がある。という意味ですので(私の勝手な概念の解釈ですが^^;)
どこかで定義しないと意味ないです。
つまり、
=========GlobalVariable.h============
enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
int State=TITLE;
=============================
===========ExternGV.h=============
enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
extern int State;
=============================
と書いてみてください。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 04:52
by ф魔理沙ф
なんとか無事にタイトル画面→ゲームができました(-^〇^-)
長いことありがとうございました。☆⌒(*^∇゜)v
あといろいろすいませんでした。(×_×;)
いろいろ勉強になりました、またご教授お願いします♪
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月25日(金) 14:03
by 管理人
今、家からネットに繋がらないので、夜は返信が出来ず、すみません(_ _||)
いちいち
=========GlobalVariable.h============
の中身も
===========ExternGV.h=============
の中身もかえるのめんどくさいですよね。
こちら、変更が一度で済む方法があるので、よければご参考下さい。
まず、main関数のあるファイルの一番最初に
#define _GLOBAL_INSTANCE_
と書き、他のファイルにはこれを書きません。
そしてGlobalVariable.h内で、
#ifdef _GLOBAL_INSTANCE_
#define GLOBAL
#else
#define GLOBAL extern
#endif
と書きます。
この意味は
「
main関数のあるファイルからこのヘッダファイルが呼ばれたときは、
「GLOBAL」という文字列は「空白」に置き換えて、
他のファイルからこのヘッダファイルが呼ばれたときは、
「GLOBAL」という文字列は「extern」という文字列に置き換えてね
」
という意味になります。
だから、これからは、全てのファイルからGlobalVariable.hを呼び、
ExternGV.hは使わないので削除してOKです。
今までGlobalVariable.hで
int func_state;
などと宣言していた部分は
GLOBAL int func_state;
に置き換えてください。オートで必要に応じてexternにしてくれる仕様になり便利です。
こうすると、宣言と同時に値代入が出来なくなるので注意してください。
GLOBAL int func_state=2;
などと書くとエラーになります。これは
extern int func_state=2;
が出来ないのと同じ理由です。
定義で、
#define GLOBAL_VAL(v) =(v)
などを用いれば出来ることは出来るのですが、
値の初期化は初期化関数を作って行ったほうがいいので、
自然と宣言と同時に値格納は使わなくてもよくなると思いますので・・。
ご参考までに。
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月26日(土) 03:09
by ф魔理沙ф
なるほど~そういう方法もあるわけですねぇ~
さすがは管理人様です(≧∇≦)/
とっても勉強になります。(-^〇^-)
早速試してみますね♪
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月26日(土) 04:02
by 管理人
最初はややこし~な~と思ったり、普段のでいいよ、と思ったりするかもしれませんが、
覚えたらずっとこっちの方が楽なのでおススメです。
後、ご存知だと思いますが、沢山のものを一気に置換する時は
エディタの「置換」という機能を使えば便利です。
今回の場合ですと、GlobalVariable.hのファイル内で
int
を
GLOBAL int
で置換すればいいでしょう。double,char等がある場合はそちらも。
VS2005などのコンパイラなら、単語単位で置換とか、オプション色々ありますので、必要に応じてご利用下さい。
VSならCtrl + Hで置換ウィンドウがでてきます。
今日は質問が色々あったので、大学まで出てきましたが、もう遅いので、そろそろ帰ります。
何かわからないことがあれば、またノコノコ出てきますので、遠慮なくどうぞm(_ _)m
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月30日(水) 12:39
by シー
私も上を参考に作らせてもらったのですが、「error C2018: 文字 '0x81' は認識できません。」と出るのですが、どうしたらいいですか?
Re:シューティングゲームのタイトル画面について
Posted: 2008年1月30日(水) 13:06
by バグ
どこかに全角スペースがあるのだと思います。それを削除するか、半角スペースに書き換えればいけると思いますよ。
Re:シューティングゲームのタイトル画面について
Posted: 2008年2月05日(火) 18:42
by シー
返信遅れました。
バグさん、ありがとうございました。おかげさまで、エラーが取れました。