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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1018
アイドル【hspdxfix.as】画像でHPゲージを減少させたい4解決


アイドル

リンク

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

あやらさん、再度返答ありがとうございます!

なんかずれているような、されていないないようなって思ったら逆にしたほうがよかったんですね><
たびたびすいません><
補足ありがとうございます!



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