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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0602
初心者マクロの書き方を知りたい3解決


初心者

リンク

2021/6/2(Wed) 12:31:05|NO.92988

はじめましての方ははじめまして。
以前、自作のフォント表示スクリプトのことで質問させていただいた者です。

自作ゲームのデータ入力を簡潔にするために、#defineを使ってシンプルな書き方になるようにしたいのですが、
うまく関数内のデータを参照することができません。
"0"という数値を渡してやれば0番目のデータが、"1"という数値なら1番目のデータが表示される想定でコードを書いていたのですが、
何故か0番目のデータしか参照できなくて困っております・・・

ヘルプを見てもよくわからず、ネットの解説を見てもいまいちわからないので、
どなたか詳しい方がいらっしゃいましたらご教授くださいませ。

;データベース実装テスト
;------------------ #module "db_test" ;マクロ定義 #enum global db_title = 0 #enum global db_comment #enum o = -1;0からカウントさせるためのダミー定義 #define itemname(%1) #enum global %1 %c case %1 #undef title #define title(%1="未設定") if type=db_title : return %1 #define comment(%1="未設定") if type=db_comment : return %1 ;関数 #defcfunc database int type,int id switch id ;これらのデータは仮です itemname db_item_playstation2 title "プレイステーション2" comment {"人気の最新式DVDプレイヤー。 コレさえあれば 映画にアニメも 見ほうだい! ちなみに ゲームもできるというウワサが。"} itemname db_item_nintendowii title "Wii" comment {"人気の健康器具。 同梱のWiiリモコンは イザというときに 武器にもなるぞ。 ちなみに ゲームもできるらしい。"} itemname db_item_nintendods title "ニンテンドーDS" comment {"現在 ちまたで話題沸騰中の 最新式脳トレゲーム機。 さらに 別売のソフトを買えば 電子辞書や家計簿 さらにはTVチューナーなど ベンリなツールに 早変わり!"} default if type=db_title : return "エラー" if type=db_comment : return {"このメッセージが見れるのはおかしいよ。"} swend #global ;表示用処理 repeat redraw 0 color 63,63,127:boxf color 255,255,255 stick key if key&2 : sentaku-1 if key&8 : sentaku+1 pos 16,16 : mes sentaku pos 16,32 : mes database(db_title,sentaku) pos 16,52 : mes database(db_comment,sentaku) redraw 1 await 16 loop



この記事に返信する


沢渡

リンク

2021/6/2(Wed) 16:19:58|NO.92989

ソースを見た感じでは問題なさそうなのですが、色々試してみたところ、
itemnameマクロを#enumに置き換えるのが上手くいっていないのかもしれません。
(試しにdb_item_playstation2とdb_item_nintendowiiとdb_item_nintendodsを
mesで表示したところ、どれも0と表示された)

#defineについてヘルプで調べてみると
>現状ですべてのプリプロセッサがマクロ展開に対応しているわけではありません。
とありますが、どうもこのスレ↓を読んだ限り、
マクロ展開に対応しているプリプロセッサはかなり限定的であるようです。
(同スレの木村氏によると#deffuncと#defcfuncぐらいしか対応していない様子?)
http://hsp.tv/play/pforum.php?mode=pastwch&num=33137

個人的には「どのゲームハード名がどの数値に対応しているのか」を
一覧できた方がわかりやすいように思えるので、
このような形ではどうでしょうか。

;データベース実装テスト ;------------------ #module "db_test" ;マクロ定義 #enum global db_title = 0 #enum global db_comment #enum db_item_playstation2=0 #enum db_item_nintendowii #enum db_item_nintendods #undef title #define title(%1="未設定") if type=db_title : return %1 #define comment(%1="未設定") if type=db_comment : return %1 ;関数 #defcfunc database int type,int id switch id ;これらのデータは仮です case db_item_playstation2 title "プレイステーション2" comment {"人気の最新式DVDプレイヤー。 コレさえあれば 映画にアニメも 見ほうだい! ちなみに ゲームもできるというウワサが。"} case db_item_nintendowii title "Wii" comment {"人気の健康器具。 同梱のWiiリモコンは イザというときに 武器にもなるぞ。 ちなみに ゲームもできるらしい。"} case db_item_nintendods title "ニンテンドーDS" comment {"現在 ちまたで話題沸騰中の 最新式脳トレゲーム機。 さらに 別売のソフトを買えば 電子辞書や家計簿 さらにはTVチューナーなど ベンリなツールに 早変わり!"} default if type=db_title : return "エラー" if type=db_comment : return {"このメッセージが見れるのはおかしいよ。"} swend #global ;表示用処理 repeat redraw 0 color 63,63,127:boxf color 255,255,255 stick key if key&2 : sentaku-1 if key&8 : sentaku+1 pos 16,16 : mes sentaku pos 16,32 : mes database(db_title,sentaku) pos 16,52 : mes database(db_comment,sentaku) redraw 1 await 16 loop



初心者

リンク

2021/6/2(Wed) 18:30:02|NO.92990

>沢渡さん
ありがとうございます。
プログラムソースの最初でenumを定義するより、分岐のマクロ内で定義してしまうようにしたら
あとからデータを追加するときに手間が減って便利だと思っていたのですが、
見直さざるを得ないみたいですね・・・

それにしても、こういう仕様はちゃんとヘルプに書いておいてほしい・・・
いつもこういうところでつまづく・・・



初心者

リンク

2021/6/2(Wed) 18:31:18|NO.92991

すみません、解決のところチェックし忘れたので再書き込みです



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.92988への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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