RPGを作るとなるとかなりめんどくさいですよ。結構いろいろな技術が必要になってくるのでやるならそれなりに覚悟しましょう。
私は昔作ってみたけど、途中で挫折しました。まあ超ミニRPGぐらいなら作れますが、大きいのは作る気にならないですね。
今回はカーソルキーでマップ内を移動するのだけをやります。
一般的なRPGならば、移動方法はシューティングと違ってマスを使った移動になります。よって、キーを一回押すだけで複数回自分が動くようになります。
;マップ内を移動する
#const tipsize 20 ;マップチップのサイズ
#const movefreq tipsize/4 ;移動時に何ループで行くか(サイズを割りきれるように)
#const movelong tipsize/movefreq;一歩の長さ
#const tipmax 20 ;マップチップの個数
screen 0,tipsize*tipmax,tipsize*tipmax
jpx=10 ;自分のマップチップのマスで数えたx座標
jpy=10 ;自分のマップチップのマスで数えたy座標
jx=jpx*tipsize ;自分の位置の絶対座標x
jy=jpy*tipsize ;自分の位置の絶対座標y
*mainloop ;メインループ
redraw 0
gosub *drawmap
gosub *checkkey
gosub *drawown
redraw
await 1
goto *mainloop
*drawmap ;マップ描画ルーチン(今回は全体が緑)
color ,255 : boxf
return
*checkkey ;キー判定ルーチン
if moveflg=0 {
stick key,15,1
if key=1 {
if jpx!0 { ;画面端でなければ
jmovex=-movelong ;一回の移動量x
jmovey=0 ;一回の移動量y
moveflg=1 ;移動フラグ
counter=movefreq ;移動する回数
jpx-- ;マップの座標を変更
}
}
if key=2 {
if jpy!0 {
jmovex=0
jmovey=-movelong
moveflg=1
counter=movefreq
jpy--
}
}
if key=4 {
if jpx!(tipmax-1) {
jmovex=movelong
jmovey=0
moveflg=1
counter=movefreq
jpx++
}
}
if key=8 {
if jpy!(tipmax-1) {
jmovex=0
jmovey=movelong
moveflg=1
counter=movefreq
jpy++
}
}
}
if moveflg=1 {
jx+jmovex
jy+jmovey
counter-- : if counter=0 : moveflg=0
}
return
*drawown ;自分描画ルーチン
font "",tipsize : color 255 : pos jx,jy : mes "●"
return
|
全体緑じゃちゃんと移動してるかわかりづらいですね。大丈夫、ちゃんと出来てます(オイ)。
各変数が何を表しているかはコメントを見れば大体わかるでしょう。
移動だけならもっといろいろ方法はあります。この方法はとっさに思いついたものだったのであまりいい方法とはいえないです。
特に高速化も考えずに作ったもので…。
昔はもっと違う方法を使っていたけれど覚えてないんですよ。
キー判定のifはswitchマクロを使えば少しは記述が楽になるかもしれませんが、速度も変わらないのでとりあえずifで。
次で、移動できる場所と移動できない場所を判定させます。