マップデータにおける動く足場などのギミックの扱い

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

マップデータにおける動く足場などのギミックの扱い

#1

投稿記事 by イマダニ » 6年前

トップビューのRPGにおける地面、サイドビューのアクションにおけるブロック。
などのマップデータは以下の様なものをマップエディタで作ればOKでした。

コード:

/*1が地面で0がなんもない所*/
int MAP[MAX_SIZE]=
{
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	1,1,1,1,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,1,1,
	1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
マリオのブロックなども

コード:

struct Block{
	int type;//ギミックの種類
	int hp;  //ブロックの耐久値。0になったら砕ける。
};
こんな構造体を作ってブロック自体に属性を持たせれば再現はできます。基本は動かないので。

ですが、回転したり、上下移動したり、『動く』ギミックは上記のやり方では難しいです。

なのでひとまず、『動かない地面データ』と『動く床などのギミックデータ』に分けようと思ったんですが、
そのギミックデータをどういった形で作ればいいか、いまいちわかりません。
以下の様にひとまずは考えたのですが、動くギミックを作るのが初めてという事もあり、果たしてこれが正しいのかどうか不安なので、よければ確認お願いします。

①ギミック構造体を作り、それを二次元配列で宣言。
  そんな『ギミックデータ』と『地面データ』を作るマップエディタを作る。

コード:

/*ギミックの種類の列挙たい*/
enum{
	MOVE_FLOOR,     //動く床
	GURUGURU_FLOOR,//回転床
};
//ギミック構造体
struct Gimmick{
	int type;//ギミックの種類
	int point_status;//ギミックの配置データ

	/*他にも必要な各ギミックの共通要素の変数を書いたりするかも*/
};

Gimmick gim[MAX_SIZE];
②その『ギミックデータ』をゲーム本体に読み込み、
 ゲーム本体内に、ギミックの種類に合わせてそのギミックの動きを処理する関数を作る。

コード:

void Gimmick_Move(ギミックの種類){
	switch(ギミックの種類){
		case MOVE_FLOOR:
			break;
	}
};
③当たり判定はトップビュー、クォータビューの場合は、地面は新c言語の『いけない所を作る』と同じ、
 0はいけない所というシンプルな当たり判定でいいが、
 動くギミックは『動くので』キャラと同じような矩形の判定など、別の当たり判定を用いる必要がある?
 少なくとも同じ当たり判定では成り立たないので、ギミックと地面で、それぞれ違う当たり判定にしなければならない。

④結論として、『地面データ』『ギミックデータ』『地面の当たり判定データ』『ギミックの当たり判定データ』の四つのデータを作る
 マップエディタとそれらのデータを読み込み、処理する関数をゲーム本体に作らなければならない。

今手元にトップビューのマップエディタがあります。
それは地面をクリックで置き、その置かれた位置を二次元配列のデータとして、マップデータを作る、シンプルなマップエディタです。
とりあえずこれを上記の考えを元に改良していこうと思うのですが、

どうでしょう?

アドバイス、意見お願いします。
特に当たり判定関連が悩みなので(どんな当たり判定にするかなど)、みなさんならどうするか教えてください。

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

Re: マップデータにおける動く足場などのギミックの扱い

#2

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

ARPGかRPGかで話は変わります。
RPGならイベントで動くギミックを処理しているものも沢山あります。
なので、どうれば正解かは動くブロックの箇所の量と処理の複雑さのかねあいで決まります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 8年前

Re: マップデータにおける動く足場などのギミックの扱い

#3

投稿記事 by イマダニ » 6年前

ARPGです。アクションrpg。
ゼルダの伝説、せいけん伝説の様な感じです。

作りたいのはBastionの様なクォーターのアクションゲームですが、

ギミックを全く作った経験がない上で、いきなりクォーターはむずかしいかなと思い、ひとまずトップでやってみようといった感じです。

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

Re: マップデータにおける動く足場などのギミックの扱い

#4

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

とりあえず作るならプログラムで書けばよいでしょう。
ちゃんと作るなら調整しやすいのでスクリプトでのギミック制御を推薦します。
初期位置や結びつけるプログラム・スクリプトの情報はマップエディタで調整してはどうでしょうか。

当たり判定関連は、キャラクタだと思ったほうが良いでしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
せんちゃ
記事: 50
登録日時: 10年前
住所: 江別市東野幌町
連絡を取る:

Re: マップデータにおける動く足場などのギミックの扱い

#5

投稿記事 by せんちゃ » 6年前

アクションゲームですが、動く床ギミックを作成したことがあります。
そのときはコリジョンで対応しました。
コリジョンオブジェクトにタイプを持たせて動く床タイプであればコリジョンオブジェクトに振られたパラメータ分だけの移動を対象のオブジェクトに対して行う
といったものです。
ヽ(*゚д゚)ノ カイバー

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: マップデータにおける動く足場などのギミックの扱い

#6

投稿記事 by ISLe » 6年前

実装方法は既に説明されているので省略。

タイルに合わせて配置できるギミックなら、マップ画像として、回転するギミックなら円を描いた矢印のもの、上下移動するなら上下に矢印が向いたもの、という感じでマップを作成し、作成したマップデータからギミックデータに変換するツールを作って変換するというふうにすれば、トップビューのマップエディタを利用できます。

イマダニ
記事: 145
登録日時: 8年前

Re: マップデータにおける動く足場などのギミックの扱い

#7

投稿記事 by イマダニ » 6年前

softya さんが書きました: ちゃんと作るなら調整しやすいのでスクリプトでのギミック制御を推薦します。
ちゃんと作りたいのでスクリプトでやってみたいと思います。
スクリプトに関する知識は

テキストファイルに

IF(プレイヤーが奪い取るを選んだ場合)
Say(な、なにをするきさまらー);

などといった情報を書いて、それを読み込むものなんだなー程度の知識で、
1年前、まだプログラミングを始めたての頃に、いずれやるだろうと、
以下のサイトでノベル用のスクリプト言語を作ってみただけの程度の経験だからです。

「ゲーム作りで学ぶ! 実践的C言語プログラミング」
http://karetta.jp/book-cover/game-programming

先程調べた感じでは
ゲーム会社などでは自社開発のスクリプト言語、もしくはLuaやrubyなどの既存のスクリプト言語を使ってるそうですが、

初心者が『スクリプトでのギミック制御』を目指して学習する場合、
なにから手を出すのがお勧めでしょうか?

いきなりスクリプト言語作るよ!なんて無謀な事はせず、以下のような本を読むなどして、

「スクリプト言語による効率的ゲーム開発 新訂版 (LuaとC/C++連携プログラミング)」
http://www.amazon.co.jp/exec/obidos/ASI ... /ref11-22/

Luaなどで感じを掴む方がいいのでしょうか?
せんちゃ さんが書きました: そのときはコリジョンで対応しました。
アドバイス感謝です。
コリジョンという言葉は初めて聞きました。調べた所、当たり判定の様ですが……

「コリジョン」
http://www.critiqueofgames.net/data/ind ... 5%E7%A5%F3

当たり判定を持つオブジェクトという解釈でいいんですよね?
せんちゃ さんが書きました: コリジョンオブジェクトにタイプを持たせて動く床タイプであればコリジョンオブジェクトに振られたパラメータ分だけの移動を対象のオブジェクトに対して行う
つまり

コード:

//当たり判定を持つオブジェクト
struct colission{
    int type;//ギミックの種類
};

void Gimmick_Move(ギミックの種類){
    switch(ギミックの種類){
        case MOVE_FLOOR:
            x=movex; //床の座標に決められた移動量を
            break;
    }
};
考え方としてはこういった形ですかね?
もしこれでいいのなら、現段階の知識と経験でとりあえずこれで作れそうです。
スクリプトの学習と並行でやっていきたいです。

イマダニ
記事: 145
登録日時: 8年前

Re: マップデータにおける動く足場などのギミックの扱い

#8

投稿記事 by イマダニ » 6年前

ISLe さんが書きました: 作成したマップデータからギミックデータに変換するツールを作って
変換するというふうにすれば、トップビューのマップエディタを利用できます。
流れとしては

①お絵かきするなどしてマップ画像を作る。

②そのマップ画像をエディタで配置。

③エディタからその配置データ。マップデータを作る。

④そのマップデータをギミックデータに変換するツールを作り、
 変換後、ゲーム本体でそのデータを作る

って感じですね。
既存のマップエディタをギミックデータも作れるように改造し、一つにまとめるより、別々に作った方が楽そうですね。
新たな要素追加すると、いろいろバグが出たりして、場合によっては一から組みなおしたり大変ですし。

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

Re: マップデータにおける動く足場などのギミックの扱い

#9

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

Luaで良いと思います。Luaとゲーム本体とのインターフェイスをどう実装するかは、色々と試してみてください。
あと、ツールは趣味ですのでご自身が使いやすければ何でも良いのです。
私なら1つのツールで全部済ますでしょう。マップパーツの配置、ギミックの配置・パラメータ、イベントの配置、敵の配置などなど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: マップデータにおける動く足場などのギミックの扱い

#10

投稿記事 by ISLe » 6年前

既存のトップビューのマップエディタを改造せずに利用する方法を紹介したつもりでしたが。
タイルマップのデータはタイル画像のインデックスですが、その値をどのように使うかは自由です。
マップを作るときに決めておいた絵を出すだけでなく、敵が湧くポイントを指定したりとかいろいろ応用できます。

マップが表示された瞬間から動いているようなギミックならスクリプトは不要です。

softyaさんがスクリプト制御したほうが良いと言っているのは、例えば、特定のアイテムを持って特定のコマンドを入力すると開かずの扉が開く、とかそういう条件判定の部分だと思います。

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

Re: マップデータにおける動く足場などのギミックの扱い

#11

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

>softyaさんがスクリプト制御したほうが良いと言っているのは、例えば、特定のアイテムを持って特定のコマンドを入力すると開かずの扉が開く、とかそういう条件判定の部分だと思います。

乗ったら動くとか、そういう感じのつもりで書きました。
あとギミックの移動パラメータをツールで作るのか、スクリプトで指定するのかってのもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: マップデータにおける動く足場などのギミックの扱い

#12

投稿記事 by ISLe » 6年前

マップの描画に関しては、背景か背景でないかの2種類しかない。

ギミックはキャラと同じという話は既に出てますけど、壁を壊すと通路が現れるような背景を書き変えるギミックとか、入り口を入って次のマップでプレイヤーキャラが立っている位置を決めるギミックとか、見えるものだったり見えないものだったり、動くものだったり動かないものだったりしても、マップ上に存在するオブジェクトの単位は1種類しかない。

まずそういったあたりを押さえてからじゃないと、Luaとかでスクリプトを導入すると複雑さを増すだけではないかと思いました。

イマダニ
記事: 145
登録日時: 8年前

Re: マップデータにおける動く足場などのギミックの扱い

#13

投稿記事 by イマダニ » 6年前

softya さんが書きました: Luaで良いと思います。Luaとゲーム本体とのインターフェイスをどう実装するかは、色々と試してみてください。
早速、上のレスで書いた本を買い、触ってみました。(付属サンプルを本の通りにダウンロードできないので買う人は注意してね)

http://lua.mine.nu/w/LuaBookSupport←ここでdlできる

書き方がc言語に近くて使いやすく、台詞を書いて表示するのが楽しいです。
まだ触った程度なのと、タスクシステムの実装も考えていて、どう実装するかなかなか考えがまとまらず、
足踏みしてますが、

先にギミックの関数を作り、それを
if(なんかしたら)
kaiten();//回転する床を起動
こんなかんじでluaに書いて処理できるようにしたいです。まずはそれを目標に頑張ってみたいと思います。
ISLe さんが書きました:マップが表示された瞬間から動いているようなギミックならスクリプトは不要です
ロックマンで出てくるようなギミックとかですね。
意外とそれだけで動くもんなんですね。
特定のアイテムを持って特定のコマンドを入力すると開かずの扉が開く。
やっぱりスクリプトってRPG寄りなんですね。

以上の様な、それぞれのギミックをどう処理するのか、なにが必要か、必要でないかなどの具体的なアドバイスを頂けると
かなり助かります。どうプログラミングするか見えてくるので、ISLeさん今回もありがとうございます。

タスクシステム、スクリプト、ギミックと課題は三つもありますが頑張ります。

またなにかあったら質問しに来ます。というかタスクシステムのことで近いうちに質問すると思います、、、、(。。;)

その時はよろしくお願いします。今回もありがとうございました。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: マップデータにおける動く足場などのギミックの扱い

#14

投稿記事 by ISLe » 6年前

イマダニ さんが書きました:やっぱりスクリプトってRPG寄りなんですね。
念のためですが、トピックの主旨がマップということなので、それに関連した用途が話題に出ているというだけですよ。

AIとか、あらゆるジャンルで有効な使い方もたくさんあります。

閉鎖

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