こんにちは、DxライブラリでRPGのゲームを作ろうとしている者です。
http://dixq.net/g/26.html
このページの書き方を参考にして作ろうとしているんですが、
http://dixq.net/g/37.html
こちらのページのメイン関数の書き方を参考にこのシステムを組み込んで作っていきたいのですが、普通のRPGはダンジョン画面が移動したら行ける範囲を変えていかなきゃいけまんよね。でも、毎回行ける範囲を変更するにはどうすればいいんですか?
試しに知識が乏しいですが、自分でやってみたところ、
#include "DxLib.h"
int function_status=0,White;
char KeyBuf[ 256 ] ;
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[y/32-1][x/32]==1)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][x/32-1]==1)
return 1;
if(muki==2)//下向きなら
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][x/32+1]==1)
return 1;
return 0;//正常
}
void Opening(){
DrawString(100,100,"オープニング画面 (zをプッシュ)",White);
if(KeyBuf[KEY_INPUT_Z]==1)
function_status=1;
}
void Menu(){
DrawString(100,140,"メニュー画面 (xをプッシュ)",White);
if(KeyBuf[KEY_INPUT_X]==1)
function_status=2;
}
void Danjon(){
DrawString(100,180,"ダンジョン画面 (cをプッシュ)",White);
if(KeyBuf[KEY_INPUT_C]==1)
function_status=3;
}
void attack(){
DrawString(100,220,"戦闘画面 (vをプッシュ)",White);
if(KeyBuf[KEY_INPUT_V]==1)
function_status=4;
}
void Ending(){
DrawString(100,260,"エンディング画面 (bをプッシュ)",White);
if(KeyBuf[KEY_INPUT_B]==1)
function_status=5;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
White = GetColor( 255 , 255 , 255 ) ; //色の取得
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る
switch(function_status){
case 0:
Opening();
break;
case 1:
Menu();
break;
case 2:
Danjon();
break;
case 3:
attack();
break;
case 4:
Ending();
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}
if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了
ScreenFlip() ; // 裏画面データを表画面へ反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
コピペして作ったのですが、
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
ここの部分を毎回変えたいと思い、いろいろ試したのですがイマイチうまくいきません。
intを抜かして
hantei[15][20] = {
と書いて行くのは間違っているのですか?
caseの後に書いても、void Danjon(){ の後に書いてもダメでした。
素人ですみません。アドバイスよろしくお願いします。
メイン関数の書き方について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: メイン関数の書き方について
コードタグをご利用くださいね。その他利用規約も含めて確認をお願いします。
http://dixq.net/board/board.html
さて、実はここからRPGに本格的に組んでいくのは非常にプログラム的に難しく成ります。
なので、要素要素に分解して勉強しながらRPGを作る練習をすると位置づけてもらったほうが良いと思います。
つまり、RPGの部分部分のテストプログラムを作って練習する形です。
まず、機能を変えずに関数化を目指されてはどうでしょうか?
C言語の知識もまだ怪しい感じでしょうか?
※ RPGの作り方講座ってのも私が書いているのですが、プログラムを組んだ経験やC言語の知識がある程度ないと難しいので今回は紹介しないでおきます。
http://dixq.net/board/board.html
さて、実はここからRPGに本格的に組んでいくのは非常にプログラム的に難しく成ります。
なので、要素要素に分解して勉強しながらRPGを作る練習をすると位置づけてもらったほうが良いと思います。
つまり、RPGの部分部分のテストプログラムを作って練習する形です。
まず、機能を変えずに関数化を目指されてはどうでしょうか?
ココら辺は、C言語の文法レベルの問題ですね。intを抜かして
hantei[15][20] = {
と書いて行くのは間違っているのですか?
caseの後に書いても、void Danjon(){ の後に書いてもダメでした。
素人ですみません。アドバイスよろしくお願いします。
C言語の知識もまだ怪しい感じでしょうか?
※ RPGの作り方講座ってのも私が書いているのですが、プログラムを組んだ経験やC言語の知識がある程度ないと難しいので今回は紹介しないでおきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: メイン関数の書き方について
返信ありがとうございます。
コードタグも使わず、とても適当な質問ですみません。
イマイチ使い方がわかっていなかったです。
今度からはしっかり規約を読んで質問させていただきます。
Cの経験は今年の四月になって始めたばかりなのでほとんど手探りでやっている状態です。
文法もまだまだ意味不明なんです。すみません。
やはりそんな状態じゃまだまだできないのでしょうか?
とはいえ、関数化なるものを調べてみます。
アドバイスありがとうございました。
コードタグも使わず、とても適当な質問ですみません。
イマイチ使い方がわかっていなかったです。
今度からはしっかり規約を読んで質問させていただきます。
Cの経験は今年の四月になって始めたばかりなのでほとんど手探りでやっている状態です。
文法もまだまだ意味不明なんです。すみません。
やはりそんな状態じゃまだまだできないのでしょうか?
とはいえ、関数化なるものを調べてみます。
アドバイスありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: メイン関数の書き方について
関数化というと語弊がありますね。失礼しました。
ファイル分割でしょうか。その前にコード自体を理解できているかが問題になりますね。
【補足】
いや、それよりもマップだけのものを作ったほうが良いかもしれません。
どうしたいでしょうか? 丸投げで申し訳ないですが。
ファイル分割でしょうか。その前にコード自体を理解できているかが問題になりますね。
【補足】
いや、それよりもマップだけのものを作ったほうが良いかもしれません。
どうしたいでしょうか? 丸投げで申し訳ないですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: メイン関数の書き方について
ページの解説を読んだり、自分で調べたりしながらやっていますが大体のコードの意味はわかっているつもりです。
ですが、
この部分がちょっと理解できません。
もしよしければ、解説をよろしくお願いします。
>いや、それよりもマップだけのものを作ったほうが良いかもしれません。
確かにマップだけのものを作ったほうがいいかもしれませんね。
まだまだ戦闘などはできそうにないので、イメージとしてはということでRPGを例に挙げました。説明不足ですみません。
ですが、
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
もしよしければ、解説をよろしくお願いします。
>いや、それよりもマップだけのものを作ったほうが良いかもしれません。
確かにマップだけのものを作ったほうがいいかもしれませんね。
まだまだ戦闘などはできそうにないので、イメージとしてはということでRPGを例に挙げました。説明不足ですみません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: メイン関数の書き方について
もう少しわからないことを詳しく書いてもらえますか。
上はtypedefされた構造体で、下はint型の2次元配列です。
上はtypedefされた構造体で、下はint型の2次元配列です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: メイン関数の書き方について
typedefの方は今調べて理解できましたが、intの二次元配列というものがわかりません。
int hantei[15][20]は行数と文字の数を入れているのはわかりますが、わからないのはそのあとの部分なんです。”{”の使い方や”,”の使い方で
文を進めていった(マップが変わった)時に変更するにはどうすればいいのですか?
つまり、int hantei[15][20]~のいじり方がわかりません。
変更する際に、hantei[15][20] = {
と書いて行くのは間違っているのですか?さっきの質問と似たりよたったりですがよろしくお願いします。
int hantei[15][20]は行数と文字の数を入れているのはわかりますが、わからないのはそのあとの部分なんです。”{”の使い方や”,”の使い方で
文を進めていった(マップが変わった)時に変更するにはどうすればいいのですか?
つまり、int hantei[15][20]~のいじり方がわかりません。
変更する際に、hantei[15][20] = {
と書いて行くのは間違っているのですか?さっきの質問と似たりよたったりですがよろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: メイン関数の書き方について
> int hantei[15][20]は行数と文字の数を入れているのはわかりますが、わ
ここに勘違いを感じます。 文字の数はchar型ですね。int型だと数値データです。
行数と列数って考えたほうが良いと思います。Excelを思い浮かべてもらえばよいでしょか。
>変更する際に、hantei[15][20] = {
> と書いて行くのは間違っているのですか?さっきの質問と似たりよたったりですがよろしくお願いします。
代入したいんだと思いますが、{}で書くのは初期化のみに許された構文なので代入には使えません。
こういう切り替え時は、もうひとつの初期化したマップとポインタを使って切り替えます。あとマップはだいたいサイズが可変なのでもっと工夫が必要になります。
となると話は難しくなるので、まずポインタで2つのマップを切り替えるものを作ってみたらどうでしょうか?
ここに勘違いを感じます。 文字の数はchar型ですね。int型だと数値データです。
行数と列数って考えたほうが良いと思います。Excelを思い浮かべてもらえばよいでしょか。
>変更する際に、hantei[15][20] = {
> と書いて行くのは間違っているのですか?さっきの質問と似たりよたったりですがよろしくお願いします。
代入したいんだと思いますが、{}で書くのは初期化のみに許された構文なので代入には使えません。
こういう切り替え時は、もうひとつの初期化したマップとポインタを使って切り替えます。あとマップはだいたいサイズが可変なのでもっと工夫が必要になります。
となると話は難しくなるので、まずポインタで2つのマップを切り替えるものを作ってみたらどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。