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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0506
HBK敵の配置を事前に設定する方法2解決


HBK

リンク

2019/5/6(Mon) 11:42:25|NO.87261

HSP初心者です。
現在避けゲー(のようなもの)を作りたいと思っています。
通常の避けゲーだと敵がランダムに配置されることが多いと思うのですが、私は事前に敵の配置を設定したいと思っています。
サンプルから上手く改造できないかなと色々な避けゲーやシューティングゲームのスクリプトを見たのですが、どれも敵の配置がランダムになっており、一から自分で作ってみることにしました。
以下のスクリプトだと上から降ってくる敵一つ一つに初期座標を与えて下に落ちるようにしています。


screen 0,300,700 ///降ってくる赤い四角 cube_px = 0 // 箱1 左上座標X cube_py = 0 // 箱1 左上座標Y cube_px2 = 50 // 箱2 左上座標X cube_py2 = 0 // 箱2 左上座標Y cube_px3 = 100 // 箱3 左上座標X cube_py3 = 0 // 箱3 左上座標Y cube_length = 10 // 縦の長さ cube_width = 50 // 横の長さ cube_my = 1  // 移動量 cube_speed = 5 // 移動速度 ///下部で動く青い四角 x = 0  // 初期座標X y = 650 // 初期座標Y p = 50 // 移動量 *one redraw 0 // 描画開始 color 0,0,0 //赤い四角描画 boxf color 255,0,0 line 50,0,50,700 line 100,0,100,700 line 150,0,150,700 line 200,0,200,700 line 250,0,250,700 line 0,650,300,650 boxf cube_px, cube_py, cube_px + cube_width, cube_py + cube_length color 0,0,255 //青い四角描画 boxf x,y,x+50,y+50  stick key if key&4 : x = x + p if key&1 : x = x - p if x < 0 : x = 0 if x > 250 : x = 250 redraw 1 //描画終了 gosub *cube_move // 箱の移動処理 await 15 // 応答なし防止 gosub *one // 箱の移動処理 *cube_move cube_py += cube_my * cube_speed // 箱の表示位置を更新する処理 if cube_py >=660 : goto *two // 次の箱を出す return //////////////////////////////////////////////////////////////////////////////// *two redraw 0 color 0,0,0 boxf color 255,0,0 line 50,0,50,700 line 100,0,100,700 line 150,0,150,700 line 200,0,200,700 line 250,0,250,700 line 0,650,300,650 boxf cube_px2, cube_py2, cube_px2 + cube_width, cube_py2 + cube_length color 0,0,255 boxf x,y,x+50,y+50  stick key if key&4 : x = x + p if key&1 : x = x - p if x < 0 : x = 0 if x > 250 : x = 250 redraw 1 gosub *cube_move2 // 箱の移動処理 await 15 // 応答なし防止 goto *two // 箱の移動処理 *cube_move2 cube_py2 += cube_my * cube_speed // 箱の表示位置を更新する処理 if cube_py2 >=660 : goto *three //次の箱を出す return //////////////////////////////////////////////////////////////////////////// *three redraw 0 color 0,0,0 boxf color 255,0,0 line 50,0,50,700 line 100,0,100,700 line 150,0,150,700 line 200,0,200,700 line 250,0,250,700 line 0,650,300,650 boxf cube_px3, cube_py3, cube_px3 + cube_width, cube_py3 + cube_length; color 0,0,255 boxf x,y,x+50,y+50  stick key if key&4 : x = x + p if key&1 : x = x - p if x < 0 : x = 0 if x > 250 : x = 250 redraw 1 gosub *cube_move3 // 箱の移動処理 await 15 // 応答なし防止 goto *three // 箱の移動処理 *cube_move3 cube_py3 += cube_my * cube_speed // 箱の表示位置を更新する処理 if cube_py3 >=660 : end  //終了(実際はさらに続く) return

上のスクリプトでは、左から1列目、2列目、3列目に順番に赤い四角が落ちるようになっています。
3個目の四角が落ちたら終了するようになっていますが、実際は2分ぐらい続くステージを想定しています。
下の青い四角は可動です。

お尋ねしたいことは2つです。

①上から降る赤い四角の配置を事前に設定する方法
(可能であればステージ制にしたいので音ゲー譜面のように各配置を保存したい)
②赤い四角落下の密度を上げる方法
(今の状況だと前の四角が消えるまで次の四角が現れないので、並行作業的にどんどん四角が降るようにしたい)

GW中にかなり調べてみましたが何も分からなかったので掲示板にて質問させて頂きました。
宜しくお願いします。

※「避けゲーやシューティングゲームのスクリプトを上手く弄ればできる」という事であれば、私が書いた上のスクリプトは無視してもらって構いません。



この記事に返信する


リンク

2019/5/6(Mon) 20:42:33|NO.87269

基本は繰り返しと条件分岐の組み合わせで、なるべく楽しようという気持ちが大事です。
こんな命令あればいいのにって思った時にはF1でマニュアルを見ましょう。
例えばこんな感じ(問題あり、実はバグもあり、青四角は省略しました)

#module ////////////////////////////////////// モジュール #deffunc cube_init // キューブ初期設定 max=100 // 表示最大数 cube_SPEED=5 // 落下スピード cube_SIZEX=50 // 横サイズ cube_SIZEY=10 // 縦サイズ dim cube_Flg,max // 存在フラグ dim cube_X,max // 横位置 dim cube_Y,max // 縦座標 return #defcfunc cube_new // 新しいキューブの番号取得 ans=-1 repeat max if cube_Flg.cnt==0:ans=cnt:break     // 未使用キューブがあればその番号を返す loop return ans #deffunc cube_set int id, int _retu     // キューブセット cube_Flg.id=1 // キューブを作る cube_X.id=_retu*cube_SIZEX // 横座標セット cube_Y.id=0 // 縦座標セット return #deffunc cube_move // キューブ移動と消去 repeat max if cube_Flg.cnt==0:continue // 未使用キューブは無視 if cube_Y.cnt>=650:cube_Flg.cnt=0:color 255,255,0:boxf cube_X.cnt,0,cube_X.cnt+cube_SIZEX,700 // ↑画面下に来たキューブを消す、ついでに光る color 255,0,0:boxf cube_X.cnt,cube_Y.cnt,cube_X.cnt+cube_SIZEX,cube_Y.cnt+cube_SIZEY // ↑キューブ描画 cube_Y.cnt+=cube_SPEED // 存在しているキューブの座標を下げる loop return #global ////////////////////////////////////////////// 初期設定 screen 0,300,700 cube_init // キューブモジュール初期設定 dim note,1000 // 譜面データ 0~63の数字の羅列 note=1,2,4,8,16,32,1,2,3,4,5,6,7,8,0,0,11,12,13,14,15,16,0,0,35,0,0,0,60,42,0,22,19,59,18,8,0,0,8,8,16,12,63,62,60,56,48,32,0 ////////////////////////////////////////////// メインループ repeat redraw 0:color:boxf gosub *waku gosub *cube_make cube_move redraw 1 await 17-(cnt\3==0) loop ////////////////////////////////////////////// サブ *waku // 枠線表示 color 255,0,0 line 0,650,300,650 repeat 5,1 line cnt*50,0,cnt*50,700 loop return *cube_make // キューブ設置 if cnt\10:return // 実行頻度を10フレームに1回にする noteEX=note.COUNT repeat 6 if (noteEX&&1)==0:noteEX>>1:continue// 1行ごとにどの列にキューブがあるか判定 id=cube_new() if a==-1:break cube_set id,cnt // キューブセット noteEX>>1 // 説明しづらい loop COUNT++ return



HBK

リンク

2019/5/8(Wed) 15:15:55|NO.87281

撃さん、ありがとうございます。
自分が期待していたもの以上のものが来てびっくりしてます。
ヘルプを見ながら少しずつ解読していきます。
またどうしても分からない部分が出てきたらまたお願いします。



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