|
|
|
2020/10/18(Sun) 23:16:23|NO.91655
hspdxfix.asプラグインで作ったSTGゲームになります。
HPゲージを画像で描画して、自機弾ヒットと連動してHPゲージを減少したいのですが、
特にアイディアもなにもない状態のため、どうすればいいのかわかりません・・・・
(HPゲージは円形にするつもりですが、難しそうなら横に長い棒にします)
基準命令では「boxf」でやってましたが、
hspdxfix.asプラグインでは一部基準命令が使えないので困っております。
ほんの少しのアドバイスでもあれば助かります!
HPゲージは画像あったほうがいいかもなので、必要であればDLしてください。
「画像」
https://ux.getuploader.com/UGI_55/download/55
パス:hsp
■仕様
・自機弾がヒットするたびにHPゲージは右から減少する
・最大HPの数値(プログラム)を変更しても、HP0になったらゲージも0になる
-できればHPゲージは円形-
・時計回りにゲージが減少していく
#include "hspogg.as";音のために入れる
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 3100,3100,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window -13,-43, 640,480 ;スプライト表示エリア設定
es_area -36,-430, 600,498 ;スプライト有効エリア設定
buffer 2
picload "G_sisu_質問用.bmp" ;ゲーム中のシステム画像
es_buffer 2,,$00ff00,,1
;---HPバー---
/*
;横棒の場合
es_size 329,4
es_pat 8, 0,0
es_set 8, 50,20 ,8
*/
;円形の場合
/*
es_size 330,225 ,8
es_pat 8, 4,5
es_set 8,110,10 ,8
*/
;---------
buffer 4
; picload "jiki.bmp" ;自機
es_buffer 4,,$00ff00,,1
;---自機---
es_size 28,42, 100
es_pat 2000, 0, 0
JIKI_x = 206 : JIKI_y = 390
;---自機弾---
es_size 11,11, 150
es_pat 51, 1,43
;---ー---
buffer 6
; picload "BSmu.bmp"
es_buffer 6,,$00ff00,,1
;---ボス---
es_size 27,59, 100
es_pat 1100, 66, 61
gsel 0,1
;HPバー
BS_HPmax = 100
BS_HP = BS_HPmax
;************メインループ***************
*メイン
es_cls
es_draw
;*************カウンター****************
pos 450,0 : es_mes "BS_HPmax " + BS_HPmax
pos 450,20 : es_mes "BS_HP " + BS_HP
pos 450,40 : es_mes "BS_hen " +BS_hen
;*****************ゲーム枠外***************
es_set 2000, JIKI_x,JIKI_y, 2000 ;自機
;************gosub************
gosub *自機弾移動
gosub *HPバー
gosub *ボスの処理
es_sync ;画面更新
await 16
goto *メイン
;*************自機弾移動*************
*自機弾移動
getkey keyZ,90 ;Zキー
JK_TAMA_G_kazu = 0
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
if JK_TAMA_c >= 1 {
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
}
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, 51
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA,2 ;自機弾type値(2)
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔
;---画面外判定---
JK_TAMA_no = 10 ;自機弾の検索開始ナンバー
repeat
es_find JK_TAM_D, 2, JK_TAMA_no,30, 1
if JK_TAM_D < 0 : break
es_get JK_TAM_D_y,JK_TAM_D,5 ;自機弾Y
if JK_TAM_D_y < 0 : es_kill JK_TAM_D ;自機弾【削除】
JK_TAMA_no++ ;自機弾の検索開始ナンバー
loop
return
;****************HPバー*************
*HPバー
/*
;基準命令
BS_per = (BS_HP / BS_HPmax) * 300
color 255,255,255 : boxf 45,17,45 + BS_per, 19 ;HPバー
BS_HP = limit(BS_HP + BS_hen, 0, BS_HPmax) ;一定範囲内の整数を返す
BS_hen = 0 ;どんどんマイナスにされるのでリセットする
*/
return
;****************ボスの処理*************
*ボスの処理
if BSMU_sk_f = 0 {
BSMU_sk_f = 1
BSMU_x = 208 : BSMU_y = 70
es_set 1100, BSMU_x,BSMU_y, 1100
es_type 1100,4096
}
;---当たり判定---
if BS_HP = 0 : BS_GEKIH_f = 1;撃破フラグ
if BS_GEKIH_f = 0 { ;撃破していないときに【実行】
es_find TEKI_D, 4096, 1100,84
es_check TEKI_VS_TAMA ,TEKI_D,2
if TEKI_VS_TAMA != -1 {
es_kill TEKI_VS_TAMA;自機弾【削除】
BS_hen -= 1 ;HPバー
}
}
return
| |
|
2020/10/19(Mon) 16:52:16|NO.91659
HPゲージは横棒タイプなら簡単です。
HPをスプライトで表示しようとした形跡がありますが、
スプライトの大きさを変えるには
HPゲージのキャラクタを大量に用意しないといけない気がするので
(HPゼロ〜最大値までの全ての画像)これは面倒かと。。。
es_effectでも出来るかもしれませんが、
これは拡大縮小表示するだけっぽいので
HPゲージにグラデ―ジョンなどのデザインを付けると
縮小したときに期待とは異なる結果になる可能性があります。
これらの理由から、スプライトではなくes_copyなどで画像コピーした方が
良いと思います。
>・自機弾がヒットするたびにHPゲージは右から減少する
画像コピーならば
・コピー先の座標
・コピー元の左上座標
・コピーするYサイズ
これらはHPの状況に関わらず常に一定なので
pos コピー先左上X, コピー先左上Y
es_copy バッファ, コピー元左上X, コピー元左上Y, Xサイズ(可変), Yサイズ
このようにコピーするXサイズ(可変)だけを計算すれば良い事になります。
そして求めるXサイズは、単純な割合の計算なので
Xサイズ = 現在のHP * HPバーの最大幅 / 最大HP
これだけです。
毎フレームこの計算とHPバーを表示する行を追加するだけで
とりあえず横棒形式のHPバーは表示できると思います。
円形タイプの場合は割合の計算だけは同じですが
格段に難易度が上がります。
厳密にやりたいならばAPIなどを利用して
HSPの標準バッファに扇形(円弧)を描画し、
それをes_bufferなどでVRAMコピーし
それを画面にes_copyで表示。
という方法で可能だと思いますが……
毎フレームHSPバッファに描画しVRAMコピーするというのは
効率が悪そうだというデメリットがあります。
もう一つの方法は、適当な角度の円弧画像を用意しておき
それを連続で回転コピーして円状に並べれば疑似的に綺麗な円を描画できます。
こちらは画像の用意とソースが少々面倒になるというデメリットがありますが、
先の手法よりは処理速度は上がるかと。
最後に横棒・円形の両方に使える手法ですが
最初に否定した、あらかじめ全てのHPバー画像を用意しておくという力技な方法もあります。
円をどのくらいの精度で分割するかにもよりますが
仮に1%で分割するとしたらHP0〜100%までの101通りの画像を用意しておけば
それなりに精度が高く、処理速度も安定すると思います。
デメリットは事前準備の大変さと完成後のソフトの容量が大きくなることでしょうか。
| |
|
2020/10/20(Tue) 23:51:26|NO.91666
あやらさん、いつもありがとうございます。
なるほど、es_copyを使って割合で計算すればよかったんですね。
円形はやはり難しい感じですよね・・・・
絶対っていうほどではないので、自分のレベルが上ったら挑戦してみようかと思います。
#include "hspogg.as";音のために入れる
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 3100,3100,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window -13,-43, 640,480 ;スプライト表示エリア設定
es_area -36,-430, 600,498 ;スプライト有効エリア設定
buffer 2
picload "G_sisu_質問用.bmp" ;ゲーム中のシステム画像
es_buffer 2,,$00ff00,,1
;---------
buffer 4
; picload "jiki.bmp" ;自機
es_buffer 4,,$00ff00,,1
;---自機---
es_size 28,42, 100
es_pat 2000, 0, 0
JIKI_x = 206 : JIKI_y = 390
;---自機弾---
es_size 11,11, 150
es_pat 51, 1,43
;---ー---
buffer 6
; picload "reimu.bmp"
es_buffer 6,,$00ff00,,1
;---ボス---
es_size 27,59, 100
es_pat 1100, 66, 61
gsel 0,1
;HPバー
BS_HPmax = 100 ;最大HP
BS_HP_BA = 329 ;HPバーの最大値
BS_GENZA = BS_HPmax ;現在のHP
;************メインループ***************
*メイン
es_cls
es_draw
;*************カウンター****************
pos 450,40 : es_mes "BS_es_HP " + BS_es_HP
pos 450,60 : es_mes "BS_GENZA " + BS_GENZA
;*****************ゲーム枠外***************
es_set 2000, JIKI_x,JIKI_y, 2000 ;自機
;************gosub************
gosub *自機弾移動
gosub *HPバー
gosub *ボスの処理
es_sync ;画面更新
await 16
goto *メイン
;*************自機弾移動*************
*自機弾移動
getkey keyZ,90 ;Zキー
JK_TAMA_G_kazu = 0
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
if JK_TAMA_c >= 1 {
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
}
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, 51
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA,2 ;自機弾type値(2)
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔
;---画面外判定---
JK_TAMA_no = 10 ;自機弾の検索開始ナンバー
repeat
es_find JK_TAM_D, 2, JK_TAMA_no,30, 1
if JK_TAM_D < 0 : break
es_get JK_TAM_D_y,JK_TAM_D,5 ;自機弾Y
if JK_TAM_D_y < 0 : es_kill JK_TAM_D ;自機弾【削除】
JK_TAMA_no++ ;自機弾の検索開始ナンバー
loop
return
;****************HPバー*************
*HPバー
pos 50,20
es_copy 2, 0,0, BS_es_HP,4
BS_es_HP = BS_GENZA * BS_HP_BA / BS_HPmax
return
;****************ボスの処理*************
*ボスの処理
if BSMU_sk_f = 0 {
BSMU_sk_f = 1
BSMU_x = 208 : BSMU_y = 70
es_set 1100, BSMU_x,BSMU_y, 1100
es_type 1100,4096
}
;---当たり判定---
if BS_es_HP = 0 : BS_GEKIH_f = 1;HPが0になったら撃破フラグを【立てる】
if BS_GEKIH_f = 0 { ;撃破していないときに【実行】
es_find TEKI_D, 4096, 1100,84
es_check TEKI_VS_TAMA ,TEKI_D,2
if TEKI_VS_TAMA != -1 {
es_kill TEKI_VS_TAMA;自機弾【削除】
BS_GENZA -= 1 ;HPバー(自機弾の火力)
}
}
return
| |
|
2020/10/21(Wed) 15:49:22|NO.91667
すみません、説明の仕方が悪かったですね。
> es_copy 2, 0,0, BS_es_HP,4
> BS_es_HP = BS_GENZA * BS_HP_BA / BS_HPmax
1フレームと言うごく短い時間ですが、
実際のHPとバーの表示がズレてしまいますので
この2行は順番を入れ替えた方が良いかと思います。
|
|
2020/10/21(Wed) 19:41:41|NO.91668
あやらさん、再度返答ありがとうございます!
なんかずれているような、されていないないようなって思ったら逆にしたほうがよかったんですね><
たびたびすいません><
補足ありがとうございます!
|
|