HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0529
lemorRPGゲーム〜敵の出現4解決


lemor

リンク

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


これができないと、ゲームになりません><
どうか返答宜しくお願いします!



この記事に返信する


Ve

リンク

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



lemor

リンク

2010/5/29(Sat) 23:24:05|NO.32822

できました!
わかりやすい解答ありがとうございました!
これらを利用して、どんどん作っていきたいと思います。
今回は本当にありがとうございました^^



ONION software Copyright 1997-2023(c) All rights reserved.