まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
以前、自機にレーザーを撃たせようとしたのですが、表示方法がわからずに後回しにしていました。
何がわからなかったのかと言うと、自機が移動していない時は良いのですが、自機が移動している時に
レーザーを発射すると↓のような状態に・・・
これは、レーザー自体を短い画像を繋げて表現しているからなのですが、これを自機が動いている時は全てのレーザーを移動させようとして
やり方がわかりませんでした。
hspdxfixのスプライト機能はとても優秀で、一度移動方向を指定すれば後は指示を書かなくても勝手に移動して画面から消えると勝手に消えてくれます。
非常に便利なのですが、この勝手に動いてくれるおかげで、動かした後に別の方向に移動させるにはどうすれば???となってしまったんです。
で、簡単なレーザー表示スクリプトを作って考えてみました。
*************************************
*start
#include "hspdxfix.as"
#include "CK_JOYFORCE.AS"
;■ DirectX 初期化&チェック
dialog "fullscreenで起動しますか?「はい」を選択した場合、画面解像度を640×480に変更します。",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode=1
es_ini 1124,1124,360;スプライト最大数1124,キャラクタ最大数1124,角度360度
es_screen 640,480,16,0,screenmode,1;directX使用時の解像度640*480
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2
goto *setup
*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end
*setup
;■ バッファへ画像の読みこみ
buffer 2,640,480,0 ;バッファ作成
pos 0,0 : picload "laser.jpg",1 ;バッファへ読み込み
es_buffer 0,0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3
;自機,0
es_size 48,48,20,0
es_pat 0,0,0
;自機レーザー,1
es_size 48,48,80,0
es_pat 1,48,0,0
;■スプライト登録
es_window 0,0,412,480 ;スプライト描写範囲設定
es_area -128,-145,413,481 ;スプライト有効範囲設定
es_set 701,px,py,0 ;自機スプライト登録(0)
es_type 701,1 ;自機Type値設定(1)
gsel 0
es_cls
es_sync
wait 100
*gamesetup
px=192:py=432 ;自機の初期位置
move=2 ;自機速度
;■ メインルーチン
*main
es_cls;画面クリア
gosub *jikimove
gosub *jikitama1
es_draw;スプライト描画
gosub *kabehyouji
gosub *fpshyouji
await 0
es_sync 16,2;ウェイト
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
goto *main
*jikimove;自機移動処理
ck_joystick ky,15;キーボードのチェック,非トリガータイプ設定
xv=(ky>>2&1)-(ky&1);x軸移動処理
yv=(ky>>3&1)-(ky>>1&1);y軸移動処理
px=xv*move+px : py=yv*move+py;自機移動処理
;画面からはみ出さない為の処理
if px<0 :px=0
if px>368 :px=368
if py<0 :py=0
if py>432 :py=432
es_pos 701,px,py;スプライト表示(バッファ画面)
return
*jikitama1;自機弾移動処理
shottime--;連射時間をマイナス
ck_joystick ky,2048
if ky&2048:if shottime<0 : shot=1;Zキーのチェック
if shot=1 {
es_exnew jikitama,900,999
if jikitama=-1 : return
es_set jikitama,px,py,1 ;自機弾スプライト設置(キャラクタ番号1)
es_type jikitama,4 ;自機弾type値(4)
shottime=1 ;連射制御
shot=0
}
;レーザー処理
jikitama=0
repeat
es_find jikitama,4,jikitama
if jikitama=-1 : break
es_apos jikitama,0,-10,150 ;レーザー表示
es_get jikitamax,jikitama,3 ;x座標取得
es_get jikitamay,jikitama,5 ;Y座標取得
if ky&1:es_pos jikitama,jikitamax-2,jikitamay;レーザー移動処理
if ky&4:es_pos jikitama,jikitamax+2,jikitamay;レーザー移動処理
if px=0 : es_pos jikitama,jikitamax,jikitamay;レーザー移動処理
if px=368 : es_pos jikitama,jikitamax,jikitamay;レーザー移動処理
jikitama++
loop
return
*kabehyouji
gmode 0,228,480
es_fill 416,0,50;画面右をを塗り潰す
return
*fpshyouji
;fps表示
es_getfps fps
color 255,255,255
pos 416,440
es_fmes"ky"+ky+""
pos 416,460
es_fmes"fps"+fps+""
return
*************************************
HSP3.0使用 hspdxfix使用 CK_JOYFORCE使用 画像は↓を使用
具体的にどうするのかと言うと、まずZボタンを押した時にレーザーを表示させます。
で、その表示されたレーザー全てを検索して、例えば右に動いている時は上に移動している移動量+右に動いている移動量をプラスして
表示するようにすれば、レーザーっぽく見えるようになりました^^
今までは、レーザーの移動にes_adir jikitama,180,1000と言うような書き方をしていたので、右に動いた時は移動方向はどうすれば?
となってしまっていたのですが、es_adirではなくes_aposを使って、es_getでレーザーのX軸座標とY軸座標を調べて
自機の移動速度をレーザーのX座標にプラスすれば、上手く出来ました^^
こんな感じで(といっても画像じゃわかりませんが^^;)自機が移動しても、レーザーはちゃんと真っ直ぐに表示されるようになりました^^
何がわからなかったのかと言うと、自機が移動していない時は良いのですが、自機が移動している時に
レーザーを発射すると↓のような状態に・・・
これは、レーザー自体を短い画像を繋げて表現しているからなのですが、これを自機が動いている時は全てのレーザーを移動させようとして
やり方がわかりませんでした。
hspdxfixのスプライト機能はとても優秀で、一度移動方向を指定すれば後は指示を書かなくても勝手に移動して画面から消えると勝手に消えてくれます。
非常に便利なのですが、この勝手に動いてくれるおかげで、動かした後に別の方向に移動させるにはどうすれば???となってしまったんです。
で、簡単なレーザー表示スクリプトを作って考えてみました。
*************************************
*start
#include "hspdxfix.as"
#include "CK_JOYFORCE.AS"
;■ DirectX 初期化&チェック
dialog "fullscreenで起動しますか?「はい」を選択した場合、画面解像度を640×480に変更します。",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode=1
es_ini 1124,1124,360;スプライト最大数1124,キャラクタ最大数1124,角度360度
es_screen 640,480,16,0,screenmode,1;directX使用時の解像度640*480
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2
goto *setup
*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end
*setup
;■ バッファへ画像の読みこみ
buffer 2,640,480,0 ;バッファ作成
pos 0,0 : picload "laser.jpg",1 ;バッファへ読み込み
es_buffer 0,0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3
;自機,0
es_size 48,48,20,0
es_pat 0,0,0
;自機レーザー,1
es_size 48,48,80,0
es_pat 1,48,0,0
;■スプライト登録
es_window 0,0,412,480 ;スプライト描写範囲設定
es_area -128,-145,413,481 ;スプライト有効範囲設定
es_set 701,px,py,0 ;自機スプライト登録(0)
es_type 701,1 ;自機Type値設定(1)
gsel 0
es_cls
es_sync
wait 100
*gamesetup
px=192:py=432 ;自機の初期位置
move=2 ;自機速度
;■ メインルーチン
*main
es_cls;画面クリア
gosub *jikimove
gosub *jikitama1
es_draw;スプライト描画
gosub *kabehyouji
gosub *fpshyouji
await 0
es_sync 16,2;ウェイト
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
goto *main
*jikimove;自機移動処理
ck_joystick ky,15;キーボードのチェック,非トリガータイプ設定
xv=(ky>>2&1)-(ky&1);x軸移動処理
yv=(ky>>3&1)-(ky>>1&1);y軸移動処理
px=xv*move+px : py=yv*move+py;自機移動処理
;画面からはみ出さない為の処理
if px<0 :px=0
if px>368 :px=368
if py<0 :py=0
if py>432 :py=432
es_pos 701,px,py;スプライト表示(バッファ画面)
return
*jikitama1;自機弾移動処理
shottime--;連射時間をマイナス
ck_joystick ky,2048
if ky&2048:if shottime<0 : shot=1;Zキーのチェック
if shot=1 {
es_exnew jikitama,900,999
if jikitama=-1 : return
es_set jikitama,px,py,1 ;自機弾スプライト設置(キャラクタ番号1)
es_type jikitama,4 ;自機弾type値(4)
shottime=1 ;連射制御
shot=0
}
;レーザー処理
jikitama=0
repeat
es_find jikitama,4,jikitama
if jikitama=-1 : break
es_apos jikitama,0,-10,150 ;レーザー表示
es_get jikitamax,jikitama,3 ;x座標取得
es_get jikitamay,jikitama,5 ;Y座標取得
if ky&1:es_pos jikitama,jikitamax-2,jikitamay;レーザー移動処理
if ky&4:es_pos jikitama,jikitamax+2,jikitamay;レーザー移動処理
if px=0 : es_pos jikitama,jikitamax,jikitamay;レーザー移動処理
if px=368 : es_pos jikitama,jikitamax,jikitamay;レーザー移動処理
jikitama++
loop
return
*kabehyouji
gmode 0,228,480
es_fill 416,0,50;画面右をを塗り潰す
return
*fpshyouji
;fps表示
es_getfps fps
color 255,255,255
pos 416,440
es_fmes"ky"+ky+""
pos 416,460
es_fmes"fps"+fps+""
return
*************************************
HSP3.0使用 hspdxfix使用 CK_JOYFORCE使用 画像は↓を使用
具体的にどうするのかと言うと、まずZボタンを押した時にレーザーを表示させます。
で、その表示されたレーザー全てを検索して、例えば右に動いている時は上に移動している移動量+右に動いている移動量をプラスして
表示するようにすれば、レーザーっぽく見えるようになりました^^
今までは、レーザーの移動にes_adir jikitama,180,1000と言うような書き方をしていたので、右に動いた時は移動方向はどうすれば?
となってしまっていたのですが、es_adirではなくes_aposを使って、es_getでレーザーのX軸座標とY軸座標を調べて
自機の移動速度をレーザーのX座標にプラスすれば、上手く出来ました^^
こんな感じで(といっても画像じゃわかりませんが^^;)自機が移動しても、レーザーはちゃんと真っ直ぐに表示されるようになりました^^
PR
この記事にコメントする
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
リンク
カテゴリー
最新記事
(04/04)
(12/26)
(12/25)
(11/17)
(10/11)
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
最古記事