|
|
|
2010/5/29(Sat) 18:38:36|NO.32814
HSPでRPGゲームを作っています
現在、マップを用意し(壁や移動できる部分も完成)
キャラもキーボードで動作できるようになったのですが
やはり、RPGなので、敵を出現させたいと思い
やっていたのですが、どうもうまくできません。
自分がやりたいことは
・キャラをある特定の位置に移動させた場合に
敵が出現するようにする。
敵との戦闘シーンに変更するには、gotoでやりたいと思っています
randomize
screen 0, 257, 188
title "rpg"
buffer 1
picload "画像/kyara.bmp"
buffer 2
picload "画像/sutege1.bmp"
buffer 3
picload "画像/allkyara.bmp"
画像/allkyara.bmp=キャラ
buffer 4
picload "画像/kusa.bmp"
gsel 0
font "", 20
x = 5 // X座標
y = 5 // Y座標
c_node = 0// キャラクターの向いている方向を保持する変数
// 配列変数[ マップ ]を用意する
dim map, 10, 10
map(0, 0) = 3,1,1,1,1,1,1,1,1,1
map(0, 1) = 1,1,1,0,0,0,0,0,1,1
map(0, 2) = 1,1,1,0,0,0,4,4,1,1
map(0, 3) = 1,0,0,0,0,0,4,4,1,1
map(0, 4) = 1,0,0,0,0,0,4,4,1,1
map(0, 5) = 1,0,0,0,0,0,1,1,1,1
map(0, 6) = 1,0,0,0,0,0,1,1,1,1
map(0, 7) = 1,1,1,1,1,1,1,1,1,1
map(0, 8) = 1,1,1,1,1,1,1,1,1,1
map(0, 9) = 1,1,1,1,1,1,1,1,1,1
// メインルーチン
*main
redraw 0
wait 30
// 背景を塗りつぶし
color 255, 255, 255
boxf
color 0, 0, 0
gosub *draw_map
gosub *draw_chr
gosub *check_key
redraw 1
goto *main
// マップを描写
*draw_map
mx = 0 // X座標を保持するための変数
my = 0 // Y座標を保持するための変数
repeat length(map)
repeat length2(map)
// マップデータが0の場合移動可能を描写
if map(mx, my) = 0 {
color 200, 200, 200
pos mx*20, my*20
gmode 2
gcopy 1, 16,21, 16,13
}
// マップデータが1の場合壁を描写
if map(mx, my) = 1 {
color 200, 200, 200
pos mx*20, my*20
gmode 2
gcopy 1, 53,21, 16,13
}
// マップデータが3の場合全体マップを描写
if map(mx, my) = 3 {
color 200, 200, 200
pos mx*20, my*20
gcopy 2, 0,0, 257,188
}
// マップデータが4の場合草を描写
if map(mx, my) = 4 {
color 200, 200, 200
pos mx*20, my*20
gmode 2
gcopy 4, 0,0, 15,13
}
mx += 1
loop
my += 1 : mx = 0
loop
return
// キャラクター描写
*draw_chr
gmode 2
color 0, 0, 0
pos x*20, y*20
gcopy 3, 24*c_node, 0*(anime/4), 24,24
return
// キー入力チェック
*check_key
stick key, 15
gosub *check_map
// [ move ]フラグが0の時だけ移動可能
if move = 0 {
// [ key ]という変数の状態を比較
switch key
// 左方向に進みたい時
case 1
x -= 1
c_node = 0// キャラクターの向きを変える
if x < 0 : x = 0
swbreak
// 上方向に進みたい時
case 2
y -= 1
c_node = 1// キャラクターの向きを変える
if y < 0 : y = 0
swbreak
// 右方向に進みたい時
case 4
x += 1
c_node = 2// キャラクターの向きを変える
if x >= 20 : x = 19
swbreak
// 下方向に進みたい時
case 8
y += 1
c_node = 3// キャラクターの向きを変える
if y >= 20 : y = 19
swbreak
swend
}
return
// 壁があるか調べる
*check_map
move = 0 // 動けるか判断するフラグ
switch key
case 1 : a = x - 1 : b = y : swbreak// 左方向
case 2 : a = x : b = y - 1 : swbreak// 上方向
case 4 : a = x + 1 : b = y : swbreak// 右方向
case 8 : a = x : b = y + 1 : swbreak// 下方向
default : a = cx : b = cy : swbreak// その他のキー
swend
// 移動したい座標に壁がある場合は[ move ]に1を代入
if map(a, b) = 1 : move = 1
return
これができないと、ゲームになりません><
どうか返答宜しくお願いします!
| |
|
2010/5/29(Sat) 20:50:13|NO.32815
RPGツ●ール風にいうと戦闘イベントですか?
マップ移動の処理の中に
キャラクター座標とイベント座標を調べる処理を挟んで、一致した時、gotoを使って戦闘ですかね。
自分がRPG作った時は
イベントごとに番号を作り、条件フラグ、イベント種類(NPCや床イベント)、イベント座標、実行内容等のデータに纏めました。
マップ移動の処理の中にさらにイベント番号の数だけループを作り、
条件を満たしているか調べ、満たしていたらイベントの種類によって実行方法を分けました。
|
|
2010/5/29(Sat) 21:12:39|NO.32816
さまざまな方法が有ると思います。
自分の方法は。
通常のマップの配列変数とは別に、eventのマップの配列変数をldim (ラベル型)で作成する
その配列の中のeventを発生させる座標に、
イベントが発生した際にジャンプするラベルを代入する。
|
|
2010/5/29(Sat) 21:46:33|NO.32817
一応、スクリプトも置いておきます。
もっと改変すべきところも有りますが参考にしていただけたら嬉しいです。
それと、マップの描画は一度だけにして、
他のバッファーにストックして置くべきだと思います。
screen 0, 257, 188
title "rpg"
screen 1
picload "画像/kyara.bmp"
screen 2
picload "画像/sutege1.bmp"
screen 3
picload "画像/allkyara.bmp"
// 画像/allkyara.bmp=キャラ
screen 4
picload "画像/kusa.bmp"
gsel 0
font "", 20
x = 5 // X座標
y = 5 // Y座標
c_node = 0// キャラクターの向いている方向を保持する変数
// 配列変数[ マップ ]を用意する
dim map, 10, 10
map(0, 0) = 3,1,1,1,1,1,1,1,1,1
map(0, 1) = 1,1,1,0,0,0,0,0,1,1
map(0, 2) = 1,1,1,0,0,0,4,4,1,1
map(0, 3) = 1,0,0,0,0,0,4,4,1,1
map(0, 4) = 1,0,0,0,0,0,4,4,1,1
map(0, 5) = 1,0,0,0,0,0,1,1,1,1
map(0, 6) = 1,0,0,0,0,0,1,1,1,1
map(0, 7) = 1,1,1,1,1,1,1,1,1,1
map(0, 8) = 1,1,1,1,1,1,1,1,1,1
map(0, 9) = 1,1,1,1,1,1,1,1,1,1
// イベントを定義する。
ldim emap , 10 , 10
emap(2,4) = *event_敵が出現_ヤマネコ
// メインルーチン
*main
redraw 0
wait 30
// 背景を塗りつぶし
color 255, 255, 255
boxf
color 0, 0, 0
gosub *draw_map
gosub *draw_chr
gosub *check_key
gosub *check_event
redraw 1
goto *main
// マップを描写
*draw_map
mx = 0 // X座標を保持するための変数
my = 0 // Y座標を保持するための変数
repeat length(map)
repeat length2(map)
// マップデータが0の場合移動可能を描写
if map(mx, my) = 0 {
color 200, 200, 200
pos mx*20, my*20
gmode 2
gcopy 1, 16,21, 16,13
}
// マップデータが1の場合壁を描写
if map(mx, my) = 1 {
color 200, 200, 200
pos mx*20, my*20
gmode 2
gcopy 1, 53,21 , 16,13
}
// マップデータが3の場合全体マップを描写
if map(mx, my) = 3 {
color 200, 200, 200
pos mx*20, my*20
gcopy 2, 0,0, 257,188
}
// マップデータが4の場合草を描写
if map(mx, my) = 4 {
color 200, 200, 200
pos mx*20, my*20
gmode 2
gcopy 4, 0,0, 15,13
}
mx += 1
loop
my += 1 : mx = 0
loop
return
// キャラクター描写
*draw_chr
gmode 2
color 0, 0, 0
pos x*20, y*20
gcopy 3, 24*c_node, 0*(anime/4), 24,24
return
// キー入力チェック
*check_key
stick key, 15
gosub *check_map
// [ move ]フラグが0の時だけ移動可能
if move = 0 {
// [ key ]という変数の状態を比較
switch key
// 左方向に進みたい時
case 1
x -= 1
c_node = 0// キャラクターの向きを変える
if x < 0 : x = 0
swbreak
// 上方向に進みたい時
case 2
y -= 1
c_node = 1// キャラクターの向きを変える
if y < 0 : y = 0
swbreak
// 右方向に進みたい時
case 4
x += 1
c_node = 2// キャラクターの向きを変える
if x >= 20 : x = 19
swbreak
// 下方向に進みたい時
case 8
y += 1
c_node = 3// キャラクターの向きを変える
if y >= 20 : y = 19
swbreak
swend
}
return
// 壁があるか調べる
*check_map
move = 0 // 動けるか判断するフラグ
switch key
case 1 : a = x - 1 : b = y : swbreak// 左方向
case 2 : a = x : b = y - 1 : swbreak// 上方向
case 4 : a = x + 1 : b = y : swbreak// 右方向
case 8 : a = x : b = y + 1 : swbreak// 下方向
default : a = cx : b = cy : swbreak// その他のキー
swend
// 移動したい座標に壁がある場合は[ move ]に1を代入
if map(a, b) = 1 : move = 1
return
// イベントが定義されているか調べる
*check_event
// イベントが有効になっているかを調べる。
; 変数の実態を無理やり調べて。ソレが 0 でない限り。
; 定義されているラベルへジャンプ
if lpeek( emap( x, y ) ) {
gosub emap( x , y )
}
return
; イベント1
*event_敵が出現_ヤマネコ
// 敵が出現した
dialog strf("ヤマネコ現れた!")
dialog strf("ヤマネコは倒れた!\nもうここにはヤマネコは出現しないようだ。")
// イベントを削除
lpoke emap( x , y ) , 0 , 0 // 代入されているラベルの情報を無理やり0にする。
return
| |
|
2010/5/29(Sat) 23:24:05|NO.32822
できました!
わかりやすい解答ありがとうございました!
これらを利用して、どんどん作っていきたいと思います。
今回は本当にありがとうございました^^
|
|