> [やりたいこと]
> 敵が回復した際の数値の表示位置を変更したい
> 敵グラを縦幅いっぱいに表示しているのですが、例えば吸血鬼がプレイヤーを吸血した際に吸血鬼側で回復エフェクトと数字が表示される位置が足元になってしまいます
> そこでY座標をなんとか変更したい
>
> [やってみたこと]
> 敵がダメージや魔法などで攻撃を受けた際に表示されるエフェクトの位置、毒などでターン終了後にダメージを受けた際のダメージ表示の位置まではネットを調べながらなんとか出来ました。
>
> [やってみた結果、どううまくいかないか]
> 敵が回復した際の表示位置のみ、変更の仕方がどうしてもわからず
コモンイベント[165:X[戦]┗単体処理]に追加設定すると、敵キャラの回復時だけY位置を変える事ができますが、
例えば「Y−50」などの固定値で設定した場合は、敵キャラの画像によっては、上過ぎたり、下過ぎたりするかもしれません。
吸収する敵キャラの種類が複数いる場合は、
ユーザーDB[9:敵キャラ個体データ]に項目「Y補正」を新設して、敵キャラごとにY位置を補正した方が良いでしょう。
ユーザーDB[9:敵キャラ個体データ]の設定画面を開き、「タイプの内容」をクリックし、
未使用の項目に「数値」「項目名=Y補正」「初期値=0」で設定し、画面下のOKをクリック。
そしてY位置を補正したい敵キャラの項目「Y補正」に補正値を設定してください。
(マイナス値を設定すると、画面の上の方へ移動)
コモンイベント[165:X[戦]┗単体処理]の717行目の
▼ 正の効果なら回復
かある位置に以下のイベントを追加。
■条件分岐(数値): 【1】 CSelf2[対象スロット(単)] が 10 以上
-◇分岐: 【1】 [ CSelf2[対象スロット(単)] が 10 以上 ]の場合↓
|■DB読込(可変): CSelf10[一時変数A] = 可変DB[ 10:CSelf2[対象スロット(単)]:"キャラクタ番号[1万以上は敵]" ] (×┏ 戦闘一時ステータス[基]:-:17)
|■変数操作: CSelf10[一時変数A] %= 10000 + 0
|■DB読込(ユーザ): CSelf19[対象の座標Y] += ユーザDB[ 9:CSelf10[一時変数A]:"Y補正" ] (敵キャラ個体データ:-:26)
|■
◇分岐終了◇
WoditorEvCOMMAND_START
[111][4,0]<0>(1,1600002,10,1)()
[401][1,0]<0>(1)()
[250][5,4]<1>(10,1600002,0,266240,1600010)("","","","キャラクタ番号[1万以上は敵]")
[121][4,0]<1>(1600010,10000,0,1280)()
[250][5,4]<1>(9,1600010,26,266768,1600019)("","","","Y補正")
[0][0,0]<1>()()
[499][0,0]<0>()()
WoditorEvCOMMAND_END
954行目の
▼ 正の効果なら回復
かある位置に以下のイベントを追加。
■条件分岐(数値): 【1】 CSelf0[発動スロット] が 10 以上
-◇分岐: 【1】 [ CSelf0[発動スロット] が 10 以上 ]の場合↓
|■DB読込(可変): CSelf10[一時変数A] = 可変DB[ 10:CSelf0[発動スロット]:"キャラクタ番号[1万以上は敵]" ] (×┏ 戦闘一時ステータス[基]:-:17)
|■変数操作: CSelf10[一時変数A] %= 10000 + 0
|■DB読込(ユーザ): CSelf19[対象の座標Y] += ユーザDB[ 9:CSelf10[一時変数A]:"Y補正" ] (敵キャラ個体データ:-:26)
|■
◇分岐終了◇
WoditorEvCOMMAND_START
[111][4,0]<0>(1,1600000,10,1)()
[401][1,0]<0>(1)()
[250][5,4]<1>(10,1600000,17,266240,1600010)("","","","キャラクタ番号[1万以上は敵]")
[121][4,0]<1>(1600010,10000,0,1280)()
[250][5,4]<1>(9,1600010,26,266768,1600019)("","","","Y補正")
[0][0,0]<1>()()
[499][0,0]<0>()()
WoditorEvCOMMAND_END
▼補足
上記の項目「Y補正」の「Y」は、半角大文字になっています。
項目を新設する際、全角の「Y」や、小文字の「y」で設定した場合は、
上記のイベントコードでイベントコマンドを設定したあとに、正しい項目名に直す必要があります。
717行目の追加は、敵キャラが敵キャラに回復系技能を使った時のY位置の補正であり、
954行目の追加は、敵キャラが主人公に吸収の攻撃を行った時のY位置の補正になります。
吸収のみY位置を補正する場合は、717行目の追加設定は不要です。
ユーザーDB[9:敵キャラ個体データ]に項目[Y補正]を新設せず、「Y-50」などの固定値で設定する場合は、追加設定の
■条件分岐(数値): 【1】 CSelf2[対象スロット(単)] が 10 以上
-◇分岐: 【1】 [ CSelf2[対象スロット(単)] が 10 以上 ]の場合↓
|■DB読込(可変): CSelf10[一時変数A] = 可変DB[ 10:CSelf2[対象スロット(単)]:"キャラクタ番号[1万以上は敵]" ] (×┏ 戦闘一時ステータス[基]:-:17)
|■変数操作: CSelf10[一時変数A] %= 10000 + 0
|■DB読込(ユーザ): CSelf19[対象の座標Y] += ユーザDB[ 9:CSelf10[一時変数A]:"Y補正" ] (敵キャラ個体データ:-:26)
|■
◇分岐終了◇
の分岐内の設定を、以下のように設定してください。
■条件分岐(数値): 【1】 CSelf2[対象スロット(単)] が 10 以上
-◇分岐: 【1】 [ CSelf2[対象スロット(単)] が 10 以上 ]の場合↓
|■変数操作: CSelf19[対象の座標Y] -= 50 + 0
|■
◇分岐終了◇
STGの作りこみにはそこまで詳しくはないですが
私から出せるいくつかのアイデアとして
・条件分岐を回数付きループ+ループ中断などで処理できれば
多少軽くなるかもしれません。
・条件チェックを見栄え重視でまとめるのではなく
例えば、
1. X軸に必要な変数取得と計算処理
2a. X軸内だった時→Y軸に必要な取得と処理
2b. X軸外ならY軸計算は飛ばして次へ
※XとY、どっちが計算量が多いかはUIによって変わる
という感じに処理重視にして、ムダな式もなるべく省略して
全体の処理コードを減らす工夫も重要かと思います。
(この部分の改善案は画像とコードで投げておきます)
・無敵になってダメージ計算をそれ以上しなくてよいのなら
イベント処理中断やラベルジャンプでループ処理を終わらせることも検討してください。
・弾生成時のピクチャ番号が++1しているなら
最新生成地点から逆算(--1)していった方が
計算コストが下がるかもしれません。
参考としてはCi-enにある下記記事もどうぞ
『ウディタ3以降で開発するときに意識したい処理負荷解説』
ci-en.net/creator/16060/article/952289#0b6cd98896
■以下、改善案サンプルのイベントコード■
WoditorEvCOMMAND_START
[124][4,0]<0>(1600018,16384,101,0)()
[124][4,0]<0>(1600019,16384,101,1)()
[121][4,0]<0>(1600035,1600052,0,0)()
[121][4,0]<0>(1600039,1600053,1600052,4096)()
[121][4,0]<0>(1600039,1,0,256)()
[179][1,0]<0>(1600039)()
[124][4,0]<1>(1600038,16384,1600035,9)()
[179][1,0]<1>(1600038)()
[124][4,0]<2>(1600028,16384,1600035,0)()
[121][4,0]<2>(1600020,1600018,1600028,4096)()
[179][1,0]<2>(1600020)()
[121][4,0]<3>(1600020,1600028,1600048,0)()
[121][4,0]<3>(1600020,1600018,0,512)()
[179][1,0]<3>(1600020)()
[124][4,0]<4>(1600029,16384,1600035,1)()
[121][4,0]<4>(1600020,1600019,1600029,4096)()
[179][1,0]<4>(1600020)()
[121][4,0]<5>(1600020,1600029,1600049,0)()
[121][4,0]<5>(1600020,1600019,0,512)()
[179][1,0]<5>(1600020)()
[103][0,1]<6>()(" ")
[103][0,1]<6>()("ヒット結果やダメージ処理")
[103][0,1]<6>()(" ")
[171][0,0]<6>()()
[0][0,0]<6>()()
[498][0,0]<5>()()
[171][0,0]<5>()()
[0][0,0]<5>()()
[498][0,0]<4>()()
[171][0,0]<4>()()
[0][0,0]<4>()()
[498][0,0]<3>()()
[171][0,0]<3>()()
[0][0,0]<3>()()
[498][0,0]<2>()()
[171][0,0]<2>()()
[0][0,0]<2>()()
[498][0,0]<1>()()
[121][4,0]<1>(1600035,1,0,256)()
[0][0,0]<1>()()
[498][0,0]<0>()()
WoditorEvCOMMAND_END
以上になります。
> [やりたいこと]
> STGで大量弾幕でも処理を軽くしたい
> [やってみたこと]
> 敵弾や敵の画像サイズから始点と終点を設定して、その内側に自機や自弾が入ったら当たり判定を出しました。
> [やってみた結果、どううまくいかないか]
> 少数なら問題ないが、弾数が増えると処理が重くなり、カクついてしまいます。
> 使用していない画像はチェック判定を外すなどはしています。
>
> 画像の敵弾判定の範囲は150で、自弾や別のものを含めると500程当たり判定を行います。