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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0603
TR#deffuncでのパラメータタイプのlabelについて8未解決


TR

リンク

2007/6/3(Sun) 09:37:40|NO.8739

 ある条件があったときに、命令時に指定されたグローバルのラベルにとぶことができればいいな、という
モジュールを作っています。
 他のパラメータタイプのint、var、array、str、doubleはちゃんと使えるのですが、labelが
うまく使えません。
 この、パラメータタイプlabelは、どのように使えばいいのでしょうか……。

以下失敗例:
1.モジュール変数の指定が無効
#module
#deffunc jump label p1 goto p1@ return #global jump *ss stop *ss mes "OK!" stop

2.すでにラベルが使われています(3行目)。
#module
#deffunc jump label p1 goto *p1@ return #global jump ss stop *ss mes "OK!" stop

(他にも、#deffunc jump label *p1としてみたりしたのですが、当然ダメでした…。)



この記事に返信する


KENTA

リンク

2007/6/3(Sun) 10:07:58|NO.8740

たぶんまだlabelはまだできないのでしょう。
しかし、変数をラベル方にすればできます。

a=*label goto a stop *label mes "ジャンプ" stop



TR

リンク

2007/6/3(Sun) 13:46:16|NO.8741

KENTAさんへ

 お答えいただきありがとうございます!
 私の今使っているHSPのバージョンは3.0なのですが、教えていただいたソース、
そちらではうまくいきませんでした。3.1β9で実行してみたらうまくいきました。
 β版ということで、安定した動作にまだ不安があって、3.1β9でがっつりとプログラムを
組もうかどうかは迷い中なのですが、変数にラベル型を入れる方法もあるのだと、勉強になります。
 モジュール化したら、こんな感じでしょうか…。#deffuncでは、varにしたらうまくいきました。

#module
#deffunc jump var p1 goto p1 return #global a=*hash jump a stop *hash mes "ok!"

 ただ、やはり3.0でプログラムを組みたいのと、できれば一つの命令内でラベルを直接指定
(jump *hashのような)したい、というのが、うまくいきません…。labelはまだ指定をするこ
とはできなさそう、とのことで、諦めるしかないのでしょうか…。「goto *a」とか、ちゃんと
ラベル指定している命令もあるのだから、なんとかなるかと思ったのですが…。



FUJI

リンク

2007/6/3(Sun) 15:52:59|NO.8743

ラベル型のパラメータタイプが実装されるまでは、ラベルを変数に代入してから呼ぶマクロを組むといいと思います。

#module modJump
#deffunc _jump var p1 gosub p1 return #define global jump(%1) labelname@modJump = %1 : _jump labelname@modJump #global jump *hash stop *hash mes "ok!" return



TR

リンク

2007/6/3(Sun) 21:40:15|NO.8748

 うわ、すごい…!マクロってすごいですね…!
 やはり、#deffuncでラベルを扱うには3.1β9でなければならないようで…すが、利点の
方が多そうなので、βに移行して、この方法を使わさせていただきます!

 初心者丸出しで申し訳ないのですが、もう一つ;
 マクロを扱ったことが無く、#deffuncにマクロを使用する以外のパラメータがある場合、
#define global jump(%1) labelname@modJump = %1 : _jump labelname@modJump

の行はどう組みかえればいいのでしょうか…。  現在作成中の命令が、
#module "slctxt"
#deffunc slc_t str p1,int p2,var p3
 というもので、
 p1が表示する文、p2が番号、p3が飛ばしたいラベル と、混合しているのです…。
 「modJump」を「slctxt」に、「jump」を「slc_t」に変えるだけではダメだとわかりました…。



c

リンク

2007/6/3(Sun) 23:58:16|NO.8751

えーっと、マジレスします。

ラベル変数で盛り上がってるみたいですが、
ラベル変数は、
モジュール作成側が、
モジュール側で、
処理を定義するのではなく、
ユーザーに処理を定義し、
モジュールに、
自分の定義した処理を呼び出して欲しい、
などのような、
一種の、
コールバックのようなものを作りたいときに使います。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
コールバックというのは、
あるタイミングで、
OSから呼び出してもらう仕組みのことですねはい。
これはユーザーが定義した処理をOSから呼んでもらうときに使いますねはい。
処理を提供する側が定義しない分、
ゆーざーにあわせた汎用的なプログラムが可能になるってわけですょうん。(ライブラリとかっすよ)
同様に、
普通のモジュールっていうのは、
モジュール作者が勝手に処理を定義しますよねはい。
こういう場合、そのモジュールが気に入らない場合でも
定義されているものに従わなくっちゃいけないんですよおら。
が、
よりユーザーにあわせた汎用的なモジュールを作ろうとした場合、
処理自体をユーザーに作らせりゃいいんですよ。
ま、
そういうことで、
普通に
goto/gosub、on goto/gosub
が使える状況で、
無理に・格好つけてラベル変数なんぞ
使う必要がないってことです。

自分ひとりで組み上げるプログラムの場合、
ラベル変数は、
goto以上にスクリプトを読みにくくさせる以外の何者でもないと思いますです。
一人で作る場合、モジュールの処理を、モジュール外に置くことの利点は何ですか???

どうせ、ラベルサンプル書いてくれるなら、

lb = *a, *b, *c, *d foreach lb gosub lb(cnt) loop stop *a mes "処理aが呼び出された": return *b mes "処理bが呼び出された": return *c mes "処理cが呼び出された": return *d mes "処理dが呼び出された": return
といった実用例を挙げてほしいだ。

a = *label goto a stop *a "aにジャンプ" stop
といったように1変数=1ラベルなんて、
ラベル変数の利点を何も示していない、
って思わないかい?



KENTA

リンク

2007/6/4(Mon) 11:57:09|NO.8753

>TRさん
label型は3.1b8から(だった気がしますが・・・。)
対応するようになりました。
なので、3.0では反応しなかったのでしょう。



TR

リンク

2007/6/5(Tue) 09:55:19|NO.8772

cさんへ

 レスありがとうございます!
 全く反論もできないのですが、しかし少し利点があるんです。
 今作っているのがADVゲームで、章ごとに*s1や*s2としてわけているんです。*s1なら、
*s2に移る前の行にgoto *s1をして無限ループになるようにして。
 で、文字列で先の章を選ぶ選択肢を表示させることになったとき、文字列の上にポインタが
あったら、文字列の後ろに文字列の大きさで背景を表示する、というモジュールを作ってみました。

#module "slc_t"
;slctxt:表示する文p1、表示する文の選択肢番号p2(0から順に) ;buffer 1にboxf 0,0,600,50をしてある。 #deffunc slctxt str p1,int p2 num=p2 cx.num=ginfo_cx:cy.num=ginfo_cy sltx.num=p1 mes sltx.num slx.num=ginfo_mesx:sly.num=ginfo_mesy if mousex>cx.num-5&mousex<cx.num+slx.num+7&mousey>cy.num-5&mousey<cy.num+sly.num+7:{ pos cx.num-5,cy.num-5:gcopy 1,0,0,slx.num+12,sly.num+12:slclick@=num} pos cx.num,cy.num:mes sltx.num ;A return #global
 これを、以下のようなソースの中で使っています。
*s1
redraw 0:slclick=-1 color 255,255,255:boxf 0,0,640,480 color 0,0,0:pos 100,100:gmode 3,,,90;(選択肢背景の透明度調整) slctxt "選択肢1",0:mes "\n": slctxt "選択肢2",1 stick waitinS if slclick=0&waitinS>1:goto *s16;B if slclick=1&waitinS>1:goto *s17;B redraw 1:wait 1 goto *s1 *s16 *s17
 これで、選択肢にポインタがあるときにクリックしたら、指定されたラベルにジャンプ
できますよね。でも、これから何回となく同様のことをするのに、毎回Bのようにするのは
手間なうえにややこしくなりそう…。なので、モジュールのAの位置に、p3を移動ラベルとして、
if slclick@=num&waitinS@>1:goto p3;B
 と入れられたら便利だなー…と思ったのが、この質問の発端です。
 プレイ時には、ラベル移動は前にしか進ませないし、選択肢以外の目的には使わないから、
そんなややこしくならないだろう…と楽観しているんですが…やはり、モジュールでラベルを
使うのは浅はかすぎるでしょうか…。

KENTAさんへ

 ありがとうございます!3.1b8からだったんですね…現在が3.1b9だから、結構最近なんですね。
 やはりバージョンの問題でしたか。やっぱり、腹をくくって3.1b9でやっていってみます。
 わざわざありがとうございました!



f

リンク

2007/7/7(Sat) 02:28:56|NO.9303

age



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