RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 026回
拠点マップを作る1 マップチップを配置


kouza026 jarファイル



[拠点マップを作る]
このマップがゲームスタート地点になる。
デバッグ用のマップに戻れるようにしてあるが、本来はここは塞がれている。
将来的に外マップに通じるようにする予定。
いままで草原だけだったが、こういう風にマップも作れる。
禁じ手のようなやらない方がいい方法…
ソースコードに直書きしてチップを配置しているが、
マップ3枚しか使わないので手抜きでいい。
結果がすぐ欲しいのでエディタなんぞ作ってる余裕はねぇ! ということ。

本来はエディタでマップを作り、プロパティーなどに書き込み、
それをロードしてマップを読み込む。
ではどうやってこのマップを作ったかネタばらししていく。
あ、そのまえに、ロードの時のデータ読み込みにミスがあったので修正しました。

data[0]=1;
data[1]=0;
data[2]=gData.mapNumber[0];//←ここと下の行。2と3にマップナンバーとフロアナンバーを入れないといけないのに
data[3]=gData.mapNumber[1];//1にマップナンバーを入れていた。これではちゃんと読み込まない…。
data[4]=pxy[0]/32; //実座標で入っているので、32区切りに変換する。
data[5]=pxy[1]/32;

それと、存在しないデータを読みこむとキャラが消えます。
その状態でセーブしないこと。
このバグ対策はいずれやる。
脱線したが、マップデータセットをどうやったか見ていく。

[GameDataクラス]
public void maptipKariSet(int mnum,int fnum) {
中略

※古いバージョンを持っている方に警告。(居ないと思うけど…)
※チップの配置を変更したので、マップチップの配置も変更しました。
※そうでない方は普通にこのままつかってください。


if (mnum==2) { //ここから正規マップ。町だな、まずは。データ量が多くなるので、専用のクラスから引っ張った方がいい。
String tnum[][]= { //00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 , 22 , 23 , 24 {"3b","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","2b"},//0 {"1b","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","0b"},//1 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//2 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//3 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//4 {"1b","20","20","20","51","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//5 {"1b","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","4b"},//6 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","6a"},//7 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20"},//8 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20"},//9 {"1b","20","20","20","51","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","4a"},//10 {"1b","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//11 {"1b","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//12 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//14 {"1b","20","20","20","41","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//13 {"1b","20","20","20","51","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","20","0b"},//15 {"3a","0a","0a","0a","0a","0a","0a","0a","0a","0a","0a","5a","20","20","4a","0a","0a","0a","0a","0a","0a","0a","0a","0a","2a"},//16 {"1a","1a","1a","1a","1a","1a","1a","1a","1a","1a","2b","1b","20","20","0b","3b","1a","1a","1a","1a","1a","1a","1a","1a","1a"},//17 {"8a","8a","8a","8a","8a","8a","8a","8a","8a","8a","0b","1b","20","20","0b","1b","8a","8a","8a","8a","8a","8a","8a","8a","8a"}//18 }; for (int x=0;x<=24;x++) {
for (int y=0;y<=18;y++) {
maptipNumber[x][y]=tnum[y][x];
}
}

setMapSize(25,18);
}



まずはマップチップのビジュアル面をセットしていく。
こっちは当たり判定がないので、ほんとうに見た目だけのデータ。
ゲーム的に重要なのは下のブロック配置処理。
で、3aだの20だの訳分かんねーよ! と思うだろうけど、法則がある。

1桁目がx座標を表し、2桁目がy座標に対応する。
20というと、xの左から2番目、y座標は0番目の「石の床タイル」の事を指す。
0aならx0、yが10桁目の「天井のタイルの一部」に対応する。
0123456789と来て、abcdefg...と続いている。
大文字も使えるので、zまで使い切ってもABCとまた続けられるが、
小文字だけでも膨大なチップを表現できる。

setMapSize(25,18);
というのはマップサイズを最小限に固定している処理。
これにより、マップがスクロールせずにキャラだけ動き回ることになる。
狭いマップを作りたい時、最小限しかチップを配置しない今回のようなケースには、
見える範囲を限定する処理が重要になる。それがこのsetMapSize。


中略

if (mnum==2) { //町。
int tnum[][]= {
//0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4
{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
{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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//2
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//3
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//4
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//5
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//6
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//7
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//8
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//9
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//10
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//11
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//12
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//13
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//14
{1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//15
{1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1},//16
{1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1},//17
{1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1}//18
};
for (int x=0;x<=24;x++) {
for (int y=0;y<=18;y++) {
kariBlock[x][y]=tnum[y][x];
}
}
}



上記のマップを見ながら通れるところ"0"、通れない所"1"を決めていく。
マップエディタを作ったら、そのマップに重ねるように通行可不可のセットも出来るようにする。
マップ配置+ブロック配置をビジュアル的に解決できるようにする予定。
このテストゲーム作ったら真っ先にマップエディタを作る予定だ。
新作する部分は少ないので、あとはマップ作る、ブロック配置、イベント配置の繰り返し。
しいて言えば新しい敵のデータと戦闘シーンの背景をダンジョン用のを作ってないな…。
拠点作ったらそこら辺を解決せねばならない。

マップの手動配置はこういう感じ。
本当はテキストファイルなど外部で作った方がいいんだけど、
手っ取り早くテストできる方法で済ませた。
テストゲームは全てのマップをこの手抜き法で作る。
せめて別クラスで変数を作ったほうが美しいのだが、作業効率を優先した。

次回は店を配置して、買い物を出来るようにする。
デバッグマップでやってる処理なので問題はないだろう。
拠点の制作その2、になる。

右側の通路はダンジョンへつながる通路になる。
ここから2つのマップを経由してボス的な者を倒してゲームクリア、
というシンプルなゲームにする予定。
イベント配置や敵の配置は後でできるので、まずは全てのマップを先に作る。
拠点が出来たらダンジョン1F、ダンジョン2Fのマップを作っていく。


・トップページへ戻る
inserted by FC2 system