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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0202
POWHGIMG3での誘導弾の実装について4解決


POW

リンク

2022/2/2(Wed) 02:01:05|NO.95289

こんばんは、先日質問させていただきました。
またまた苦戦しており質問させていただきます。

結構順調に出来てきているゲーム開発は現在、機銃、ミサイルの直線的な発射、
当たり判定の実装などできたのですが、今回ミサイルなどの自機から発射して
敵に誘導させる場合に、OBJAIMなどで実装できるのかなと思っていたのですが
なかなか上手く行きません。

OBJAIMは、そもそも敵にミサイルを誘導する場合には向かないのでしょうか?

ちなみに、機銃や、ミサイルの発射は、この前質問した際に作っていただいた

プログラムを組み込みましたので、作ってもらった射撃のプログラムを少しだけ変えて載せときます。
敵のモデル(箱)を追加しただけの状態です。


#include "hgimg3.as"
hgini

setpos HGOBJ_CAMERA , 20 , 10 , 30 ; カメラ
setang HGOBJ_CAMERA , deg2rad(45) , 0 , deg2rad(45)

setcolor 255 , 255 , 255 ; 自機
addbox MDL_PLAYER , 2 , 2
regobj OBJ_PLAYER , MDL_PLAYER

setcolor 0 , 220 , 220 ; 敵機
addbox MDL_ENEMY , 2 , 2
regobj OBJ_ENEMY , MDL_ENEMY
setpos OBJ_ENEMY,6,-43,-4

setcolor 0 , 255 , 255 ; ショット
addbox MDL_SHOT , 1 , 1
SHOT_MAX = 10 ; 最大数
dim OBJ_SHOT , SHOT_MAX ; オブジェクト用
dim SHOT , SHOT_MAX ; 状態
SHOT_COUNT = 0 ; 発射間隔カウント

*MAIN

getkey SPC_KEY , ' ' ; スペースキー
if SPC_KEY { ; 押された
if SHOT_COUNT = 0 { ; カウントが0ならば発射
repeat SHOT_MAX
if SHOT(cnt) = 0 { ; 未使用か
SHOT(cnt) = 1 ; 発射状態に
regobj OBJ_SHOT(cnt) , MDL_SHOT ; オブジェクト作成
break ; ループから抜ける
}
loop
}
SHOT_COUNT ++ ; 発射カウント+1
}
if SPC_KEY = 0 or SHOT_COUNT > 3 { ; スペースが押されていないかカウントが最大
SHOT_COUNT = 0 ; カウントリセット
}

repeat SHOT_MAX
if SHOT(cnt) = 1 { ; 発射状態ならば
addpos OBJ_SHOT(cnt) , 0 , -2 , 0 ; 移動
addwork OBJ_SHOT(cnt) , 1 , 0 , 0 ; 移動カウント
getwork OBJ_SHOT(cnt) , A , B , C
if A > 20 { ; 一定回数移動したら
SHOT(cnt) = 0 ; 未使用状態に
delobj OBJ_SHOT(cnt) ; オブジェクト削除
}
}
loop

hgdraw
hgsync 30

getkey ESC_KEY , 27 ; ESC キー
if ESC_KEY { end } ; 押されたら終了

goto *MAIN



この記事に返信する


Makoto

リンク

2022/2/2(Wed) 19:16:53|NO.95292

objaim は使ったことはないですが、試しに作ってみました。
一応、目標へ移動することはできますが、
いわゆる誘導弾という動きにはほど遠いですね。
これで簡単にというわけには行かないようです。

#include "hgimg3.as" hgini setpos HGOBJ_CAMERA , 0 , 0 , 100 ; カメラ setcolor 255 , 255 , 255 ; 自機 addbox MDL_PLAYER , 2 , 2 regobj OBJ_PLAYER , MDL_PLAYER PLAYER_X = 0 ; X 座標 setcolor 0 , 255 , 255 ; ショット addbox MDL_SHOT , 1 , 1 SHOT_MAX = 10 ; 最大数 dim OBJ_SHOT , SHOT_MAX ; オブジェクト用 dim SHOT , SHOT_MAX ; 状態 SHOT_COUNT = 0 ; 発射間隔カウント setcolor 255 , 0 , 0 ; 敵 addbox MDL_ENEMY , 2 , 2 regobj OBJ_ENEMY , MDL_ENEMY ENEMY_X = 0.0 ; X 座標 ENEMY_MOVE = 0 ; 移動カウント *MAIN stick STK , 1 + 4 + 16 ; 操作キー if STK & 1 { PLAYER_X -- } ; 自機移動 if STK & 4 { PLAYER_X ++ } PLAYER_X = limit(PLAYER_X , -50 , 50) setpos OBJ_PLAYER , PLAYER_X , 30 ,0 setease -50 , 50 , ease_quad_inout + ease_loop ; 敵移動 ENEMY_X = geteasef(ENEMY_MOVE , 200) setpos OBJ_ENEMY , ENEMY_X , -30 , 0 ENEMY_MOVE ++ if STK & 16 { ; スペースキーが押された if SHOT_COUNT = 0 { ; カウントが0ならば発射 repeat SHOT_MAX if SHOT(cnt) = 0 { ; 未使用か SHOT(cnt) = 1 ; 発射状態に regobj OBJ_SHOT(cnt) , MDL_SHOT ; オブジェクト作成 setpos OBJ_SHOT(cnt) , PLAYER_X ,30 , 0 break ; ループから抜ける } loop } SHOT_COUNT ++ ; 発射カウント+1 } if (STK & 16) = 0 or SHOT_COUNT > 3 { ; スペースが押されていないかカウントが最大 SHOT_COUNT = 0 ; カウントリセット } repeat SHOT_MAX if SHOT(cnt) = 1 { ; 発射状態ならば setwork OBJ_SHOT(cnt) , ENEMY_X , -30 ,0; 目標の座標 objaim OBJ_SHOT(cnt) , 0 , 4 , 0 , 0 , 0; 目標へ向ける(表示角度) objaim OBJ_SHOT(cnt) , 0 , 0 , 1 , 1 , 1; 目標へ移動 if refdval < 1 { ; 一定距離に近づいたら SHOT(cnt) = 0 ; 未使用状態に delobj OBJ_SHOT(cnt) ; オブジェクト削除 } } loop hgdraw hgsync 30 if STK & 128 { end } ; ESC キーが押されたら終了 goto *MAIN



Makoto

リンク

2022/2/2(Wed) 19:17:52|NO.95293

そこで、今までコンテスト作品に使ってきた方法でサンプルを作ってみました。
一つの方法として良ければ参考にしてみてください。

・ちょっと解説
追尾性能は、じょじょに上げることによって
始めはまっすぐ進んでそれから敵の方へ曲がっていくという動きにしています。
変化方法や下限上限、あるいは固定値にする、
また、移動速度も変化させたりすると
違った動きになってきますのでいろいろと試してみると面白いですよ。

#include "hgimg3.as" hgini setpos HGOBJ_CAMERA , 0 , 0 , 100 ; カメラ setcolor 255 , 255 , 255 ; 自機 addbox MDL_PLAYER , 2 , 2 regobj OBJ_PLAYER , MDL_PLAYER PLAYER_X = 0 ; X 座標 setcolor 0 , 255 , 255 ; ショット addbox MDL_SHOT , 1 , 1 SHOT_MAX = 10 ; 最大数 dim OBJ_SHOT , SHOT_MAX ; オブジェクト用 dim SHOT , SHOT_MAX ; 状態 SHOT_COUNT = 0 ; 発射間隔カウント setcolor 255 , 0 , 0 ; 敵 addbox MDL_ENEMY , 2 , 2 regobj OBJ_ENEMY , MDL_ENEMY ENEMY_X = 0.0 ; 座標 ENEMY_Y = - 30.0 ENEMY_MOVE = 0 ; 移動カウント *MAIN stick STK , 1 + 4 + 16 ; 操作キー if STK & 1 { PLAYER_X -- } ; 自機移動 if STK & 4 { PLAYER_X ++ } PLAYER_X = limit(PLAYER_X , -50 , 50) setpos OBJ_PLAYER , PLAYER_X , 30 ,0 setease -50 , 50 , ease_quad_inout + ease_loop ; 敵移動 ENEMY_X = geteasef(ENEMY_MOVE , 200) setpos OBJ_ENEMY , ENEMY_X , ENEMY_Y , 0 ENEMY_MOVE ++ if STK & 16 { ; スペースキーが押された if SHOT_COUNT = 0 { ; カウントが0ならば発射 repeat SHOT_MAX if SHOT(cnt) = 0 { ; 未使用か SHOT(cnt) = 1 ; 発射状態に regobj OBJ_SHOT(cnt) , MDL_SHOT ; オブジェクト作成 setpos OBJ_SHOT(cnt) , PLAYER_X , 30 , 0 setdir OBJ_SHOT(cnt) , rnd(8) * 45 , 0 ; 発射角度,追尾性能 break ; ループから抜ける } loop } SHOT_COUNT ++ ; 発射カウント+1 } if (STK & 16) = 0 or SHOT_COUNT > 3 { ; スペースが押されていないかカウントが最大 SHOT_COUNT = 0 ; カウントリセット } repeat SHOT_MAX if SHOT(cnt) = 1 { ; 発射状態ならば getpos OBJ_SHOT(cnt) , X , Y , Z ; ショットの座標 getdir OBJ_SHOT(cnt) , A , B , C ; A:現在の角度 B:追尾性能 T = rad2deg(atan(ENEMY_X - X, ENEMY_Y - Y)) ; 目標への角度 S = T - A ; 目標と現在の角度との差 S = S \ 360.0 ; 0 〜 359 の範囲に修正 if S < 0 { S += 360.0 } if S > 180 { S -= 360.0 } ; ±180 に修正 B = limitf(B + 0.003 , 0 , 1) ; 追尾性能を上げる A += S * B ; 目標方向へ回転 fvset FV , 0 , 0 , deg2rad(A) ; 移動量 fvdir FV , 0 , 1 , 0 ; 1 = 移動速度 X += FV(0) ; 移動 Y += FV(1) setpos OBJ_SHOT(cnt) , X , Y , Z ; ショットの座標 setdir OBJ_SHOT(cnt) , A , B , C ; A:現在の角度 B:追尾性能 setang OBJ_SHOT(cnt) , 0 , 0 , deg2rad(A) ; 表示角度 X -= ENEMY_X ; 目標までの距離 Y -= ENEMY_Y D = sqrt(X * X + Y * Y) if D < 1 { ; 一定距離に近づいたら SHOT(cnt) = 0 ; 未使用状態に delobj OBJ_SHOT(cnt) ; オブジェクト削除 } } loop hgdraw hgsync 30 if STK & 128 { end } ; ESC キーが押されたら終了 goto *MAIN



リンク

2022/2/2(Wed) 21:46:32|NO.95294

ごめんなさい、分かりません



POW

リンク

2022/2/2(Wed) 23:28:51|NO.95296

Makoto様
またまた助けていただき、ありがとうございます!!
無事に組み込み完了しました。
勉強になります、必ず完成させますね。^^

ず様
解決しました、ありがとうございます。^^



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