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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0903
莉琉自作格闘ゲーム_プログラムの記述量の上限はあるのか?3解決


莉琉

リンク

2022/9/3(Sat) 21:41:31|NO.97058

お世話になっております。
現在、HSP3.6(HGIMG4)にて格闘ゲームを作成しているのですが、
今現在よりキャラの技を追加しようとすると、何もエラーが出ずに強制終了してしまいます。

https://1drv.ms/u/s!AgwxYczAkKj8iWBgCE6nQ4NhV5pj?e=K31pj4

Sz.hspよりゲームを実行できます。
(この時点ではエラー落ちしない)

キャラの個別の技のデータは
Chara/09_Mei/State.hspに存在します。

例えば、1100行〜1159行目をコピーして、1160行目にコピーしただけで、
プログラム的には問題無いはずですが強制終了してしまいます。
( [ State_210 ジャンプ崩撃 ] )

もしかしたら、HSPにはプログラムの記述できる最大の量などが設定されているのでしょうか?
私個人が不勉強ながらに書いたプログラムですが、何卒ご教授願います。



この記事に返信する


GENKI

リンク

2022/9/4(Sun) 00:59:35|NO.97059

プログラムは見ていませんが、これから(または今現在)検証してくれる方々のためにHSP3の制限値まとめ。
見てるだけの方々も、こういうのはたまに思い出した方がいいので集めてみました。

プログラミング・マニュアル 5.19.HSPシステムの許容範囲
https://www.onionsoft.net/hsp/v37/doclib/hspprog.htm#TOLERANCE_LEVEL
> システムリソースの許容範囲 一覧
> ソースファイル(.AS)の最大サイズ 無制限
> オブジェクトファイル(.AX)の最大サイズ 無制限
> 宣言できるラベルの最大数 無制限
> 宣言できる変数の最大数 無制限
> 識別されるラベル・変数の最大文字数 59文字(半角)
> 命令内で使用できる文字列の最大 無制限
> 変数に保持できる文字列の最大 無制限(メモリが許す限り)
> 変数に保持できる配列の最大 無制限(ただし4次元まで)
> 定義可能なプラグインの最大数 合計8192タイプまで
> プラグインで拡張可能な命令最大数 1タイプあたり65536まで
> 定義可能なモジュールの最大数 無制限
> モジュール内のユーザー定義命令最大数 無制限
> oncmd命令で定義可能な割り込み最大数 無制限
> ウィンドウIDの最大数 無制限
> 1画面内のオブジェクト数 16384個(1024個で警告あり)
> 表示できるウィンドウの最大サイズ 無制限(メモリが許す限り)
> 表示できる画像の最大サイズ 無制限

その他にも

> ファイルのパックでは、無制限に複数のファイルを指定することができます。 「\」または「/」で区切ることで階層を表現することができます。 ファイル名は、フォルダ名と拡張子も含めて259文字までが識別対象になります。

> Windows版のDPMファイルは、1ファイルで最大2GB、全体で4GBまでのサイズをサポートしています。

> 変数が管理するメモリバッファのサイズは可変長で、、Windowsが許す限りの メモリを扱うことができ、上限はありません。

hgimg4関連だと

HGIMG4プログラミングガイド 9.HGIMG4ランタイムの制限
https://www.onionsoft.net/hsp/v37/doclib/hgimg4.html

HGIMG4プログラミングガイド 25.3Dモデルデータの表示
https://www.onionsoft.net/hsp/v37/doclib/hgimg4.html#3DMODEL
> マテリアル名に日本語など英文字以外を含む場合、正しく認識されないことがあります。


昔はもっと制限があった気がする。
気を付けないといけないのは、今はパスの長さとUnicode関連、hgimg4のマテリアル名日本語あたりか。



m

リンク

2022/9/4(Sun) 01:04:06|NO.97060

昔遭遇した不具合に似てる症状だなぁと思って少し試したところ、サブルーチン化(もしくは関数化)でエラー回避できたので参考にどうぞ。

修正例:
2350行あたり
if ( Obj_StateID(cnt) == 109 ) {
#include "Chara/09_Mei/State.hsp"
}

以下に置き換えて
if ( Obj_StateID(cnt) == 109 ) {
gosub *CHARA_09_STATE
}

適当な所(2399行目あたりなどのifブロック範囲外)に以下を追加する
*CHARA_09_STATE
#include "Chara/09_Mei/State.hsp"
return

もしくは State.hsp の先頭に *CHARA_09_STATE、最後に return を追加し、Sz.hsp の最後等邪魔にならない所に #include "Chara/09_Mei/State.hsp" を置く。
サブルーチン化が嫌ならば関数化でもOK。

詳しく調べていないので詳細はわかりませんが if のブロック内コードサイズ?には恐らく限界があり、それを超過すると強制終了や関係ない部分でエラーが発生したりします。(今回の例ではコピペ1〜3回で強制終了、4回でAnim.hspのエラー)
通常その限界にぶち当たる事はほぼ無いのですが、include は見た目が1行であるためにやらかす場合があります。
全体的に if ブロック内に include を置いている所が多いので、サブルーチン化や関数化して呼び出すようにすれば回避できるかと思います。

現状でキャラを追加していくとメインファイル(Sz.hsp)の中に include があちこち点在するような状態になりメンテが大変になります。
私としては各ファイルのほうでサブルーチン化や関数化を行い、先頭や最後尾などに include をまとめて置くのをおススメしたいです…が、メリットデメリット色々あるので好きにやりましょう!



莉琉

リンク

2022/9/4(Sun) 10:19:46|NO.97062

#include "Chara/09_Mei/State.hsp"
をGosubに置き換えたら動作しました!
他の#includeも纏めてSz.hspの最下部に配置しました。

解決したので、リンク先のファイルは消去いたします。
この度はありがとうございました。



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