rpgで家に入る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
heyman
記事: 99
登録日時: 7年前

rpgで家に入る

#1

投稿記事 by heyman » 6年前

dxライブらリでrpgを作ってるんですが、またわからないところが出てきたので、
質問させていただきます。
というのも、家をフィールドに書いたまではいいのですが、
家に入るプログラムをどうやってプログラムを組めばいいかわかりません。
後、今の場所はスクロールで、キャラが常に画面の真ん中にいるのですが、
家の中は狭いので、スクロールじゃなくて、普通に歩き回れるようにしたいです。
ヒントでもいいのでおしえてください。
よろしくお願いします。

ホヅミ
記事: 110
登録日時: 9年前

Re: rpgで家に入る

#2

投稿記事 by ホヅミ » 6年前

フィールドの書き方にもよりますが、
配列でマップを作っているならば入口用の番号を振ってみてはいかがでしょうか?

二つ目の質問の回答はマップをスクロールするのではなくキャラクターをスクロール(キャラクターに関してはスクロールとは言わない?)します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#3

投稿記事 by softya(ソフト屋) » 6年前

>家に入るプログラムをどうやってプログラムを組めばいいかわかりません。

家の入り口でマップイベントで家のマップへジャンプします。
マップイベントは言うなれば歩くときに衝突する見えない地形です。
どこまで汎用的にするかは設計の問題ですが、シナリオの新たな展開が巻き起こることも考えてイベント系のシステムは作ったほうが良いです。
シナリオは通常スクリプトを使います。※Luaでも可。
【補足】
シナリオを呼び出すイベントとマップ切り替えだけのイベント。

> 家の中は狭いので、スクロールじゃなくて、普通に歩き回れるようにしたいです。

マップスクロール止めればよいだけです。マップのサイズで判定してはどうでしょうか?

難しいと言われたので読んでないと思いますが、一応説明してあります。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2&start=40
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#4

投稿記事 by heyman » 6年前

ホヅミさんsoftyaさん 回答ありがとうございます

つまり入口用の見えない画像を作ってその画像と当たり判定をして、
当たったら部屋の中に移動すということですね?

あと部屋の画像とフィールドの画像の切り替えはどのようにしたらいいですか?
普通にswitch関数などを使うのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#5

投稿記事 by softya(ソフト屋) » 6年前

heyman さんが書きました:ホヅミさんsoftyaさん 回答ありがとうございます

つまり入口用の見えない画像を作ってその画像と当たり判定をして、
当たったら部屋の中に移動すということですね?
ちゃんと作るならイベントレイヤを用意して下さい。
その場合は画像は不要です。
heyman さんが書きました: あと部屋の画像とフィールドの画像の切り替えはどのようにしたらいいですか?
普通にswitch関数などを使うのですか?
ちゃんと作るならロードから設計しないといけません。
画像ハンドルを取り替えて(前のマップ画像は破棄、新しいマップ画像をロード)、今どのマップに居るか意識しなくても画像が切り替わるように作ります。

とりあえずのプロトタイプなら、switch文で良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#6

投稿記事 by heyman » 6年前

softya(ソフト屋) さんが書きました:ちゃんと作るならロードから設計しないといけません。
画像ハンドルを取り替えて(前のマップ画像は破棄、新しいマップ画像をロード)、今どのマップに居るか意識しなくても画像が切り替わるように作ります。
ロードというのは、現在のマップ => 現在のマップの画像の削除 => 新しいマップの読み込み => 新しいマップの描画
という事ですか? 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#7

投稿記事 by softya(ソフト屋) » 6年前

マップロードは、マップ画像やマップの全レイヤデータ(現在配列定義されていもの)、マップに結びついたNPCキャラ画像、ENEMYキャラ画像、マップ固有のシナリオなどなどの読み込みです。

現在のマップ => フェードアウト => 現在のマップデータの破棄 => 新しいマップの読み込み => 新しいマップに関連した初期化 => フェードイン/描画開始 => 主人公の移動可能。

と言ったRPG特有の流れです。この他にシナリオが絡んだります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1574
登録日時: 7年前

Re: rpgで家に入る

#8

投稿記事 by usao » 6年前

オフトピック
>あと部屋の画像とフィールドの画像の切り替えはどのようにしたらいいですか?
>普通にswitch関数などを使うのですか?

何かをしたい→さぁどうすればいいのですか? といきなり質問するよりも
まず自分で思った方法でやってみてはどうでしょう.

switchでいけそうだと思う&他の方法が思いつかない ならとりあえずswitchで実装してみる
→その結果,「実現できなかった」とかこの方法だと「○○という面で良くない」
→じゃあどうすればよくなるか? (質問するのは少なくともこの段階)

…というように話を進めていく感じ,というか.
(あるいは,最低限,
 switchしか思いつかないけど「それだと実装するまでもなく○○という面で良くない:いけそうではない」
 →じゃあどうすればよくなるか? (質問するのは少なくともこの段階)
 みたいな話.)

「」の中身が無いと,自分の創作活動なのに他人のいいなりの作業になってしまいそう,とか思ったり…

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#9

投稿記事 by heyman » 6年前

マップロードの関数を使った具体的な流れは、

現在のマップデーター
maphandle[] マップチップを入れとく配列
map[][] マップチップの配置
mapi[][] マップ上のイベント

あたらしいマップデータ
newmaphandle[] 新しいマップチップを入れとく配列
newmap[][] 新しいマップチップの配置
newmapi[][] 新しいマップ上のイベント

でするときどういう流れになりますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#10

投稿記事 by softya(ソフト屋) » 6年前

いまのに上書きするので、newの名前のついた変数はいらないです。
※ 同時存在する必要が無いため。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#11

投稿記事 by heyman » 6年前

maphandle[] マップチップを入れとく配列
map[][] マップチップの配置
mapi[][] マップ上のイベント
を使いまわすということですか?
たとえば、maphandle[]のもともとはいってた画像を消して新しい画像を入れる
他のも、map[][]の中身やmapi[][]の中身も新しいマップのデーターに置き換えるということですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#12

投稿記事 by softya(ソフト屋) » 6年前

そうですね。試してもらったほうが早いと思います。
早くても半年以上制作にかかるRPGですので、ここでじっくりチャレンジして知識を増やしてもらった方が良さそうです。
細かく書くと色々とワナがありますが、失敗しないと覚えませんので。

【補足】
必要なヒントは既に提示してあります。
やった上で問題が出て分からなければ、また聞いて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#13

投稿記事 by heyman » 6年前

さっそくつまずいてしまってきました。
家とフィールドの往復はできたのですが、
マップ移動の際、前のマップ座標が残ってしまい、
中途半端な場所から始まってしまいます。
どうしたらよいでしょうか?

自機の移動処理を乗せておきます

コード:

	int key;
	key=CheckHitKeyAll();
	pl.movex=pl.mx;
	pl.movey=pl.my;
	mp.mscrx=mp.scrx;
	mp.mscry=mp.scry;
	pl.mwalkx=3;
	pl.mwalky=3;
	if(CheckHitKey(KEY_INPUT_UP)==1)pl.mwalky=0, pl.yflag=1;//上に移動
	if(CheckHitKey(KEY_INPUT_DOWN)==1)pl.mwalky=1, pl.yflag=1;//下に移動
	if(CheckHitKey(KEY_INPUT_LEFT)==1)pl.mwalkx=0, pl.xflag=1;//左に移動
	if(CheckHitKey(KEY_INPUT_RIGHT)==1)pl.mwalkx=1, pl.xflag=1;//右に移動

	if( key != 0)
	{
		if(pl.yflag==1)
		{
			if(pl.mwalky==0)pl.movey-=pl.sp,mp.mscry += pl.sp ;//上に移動
			if(pl.mwalky==1)pl.movey+=pl.sp,mp.mscry -= pl.sp ;//下に移動
			pl.yflag=0;
		}

		if(pl.xflag==1)
		{
			if(pl.mwalkx==0)pl.movex-=pl.sp,mp.mscrx += pl.sp ;//左に移動
			if(pl.mwalkx==1)pl.movex+=pl.sp,mp.mscrx -= pl.sp ;//右に移動
			pl.xflag=0;
		}
	}



	if(pl.mflag==0 && mapc[(pl.movey)/32][(pl.movex)/32]==0 && mapc[(pl.movey+32-1)/32][(pl.movex)/32]==0 
					&& mapc[(pl.movey+32-1)/32][(pl.movex+25-1)/32]==0 && mapc[(pl.movey)/32][(pl.movex+25-1)/32]==0
					&& ataru==0)
	{
	mp.scrx=mp.mscrx;
	mp.scry=mp.mscry;
	pl.mx=pl.movex; //x座標の更新
	pl.my=pl.movey; //y座標の更新
	
	
	}
	
    pl.vx=pl.mx+mp.scrx;
	pl.vy=pl.my+mp.scry;
	

	pl.mcount++;
	if(pl.mwalky==1)
	{
		pl.img=8+(pl.mcount%24)/6;
	}
	if(pl.mwalky==0)
	{
		pl.img=(pl.mcount%24)/6;
	}
	if(pl.mwalkx==1)
	{
		pl.img=4+(pl.mcount%24)/6;
	}
	if(pl.mwalkx==0)
	{
		pl.img=12+(pl.mcount%24)/6;
	}

	
	//DrawGraph(t1.tx+mp.scrx,t1.ty+mp.scry,t1.thandle[1],TRUE);
	DrawGraph(pl.vx,pl.vy,pl.handle[pl.img],TRUE);
	return 0;
}


heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#14

投稿記事 by heyman » 6年前

↑に書いた質問ですが、
分かりにくいと思ったので、
簡単に書きます。
pl.mx,pl.myは、マップ全体から見た座標です。
mp.scrx,mp.scryは、スクロールさせるための変数です。
pl.vx,pl.vyは、画面上での自機の座標です。

pl.vx,pl.vyの求め方は、それぞれ

pl.vx=pl.mx+mp.scrx;
pl.vy=pl.my+mp.scry;
です。別マップに移動したときに、スタートする座標をそのマップ内のイベント配列内で設定して、
それをもとに計算して、スタート座標を決めたいのですが
うまくいきません。どうすればいいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#15

投稿記事 by softya(ソフト屋) » 6年前

> うまくいきません。どうすればいいでしょうか?
どう、うまく行かなのでしょうか? 曖昧な部分は排除して数値などで説明して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#16

投稿記事 by heyman » 6年前

softya(ソフト屋) さんが書きました:> うまくいきません。どうすればいいでしょうか?
どう、うまく行かなのでしょうか? 曖昧な部分は排除して数値などで説明して下さい。
指摘ありがとうござます

いい座標の計算の方法がわかないです。
もしかして、新しいマップに入ったら、自機の座標も
一回リセットした方がいいんでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: rpgで家に入る

#17

投稿記事 by softya(ソフト屋) » 6年前

自機は出現先のマップ座標にしないと矛盾します。
mp.scrx;などはマップに合わせて再設定します。そんなに難しい計算ではないので考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

heyman
記事: 99
登録日時: 7年前

Re: rpgで家に入る

#18

投稿記事 by heyman » 6年前

よく考えてみたらわかりました。ありがとうございました

閉鎖

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