[もどる]
一括表示
0474 なぞの問題(2 0.212で)
投稿者:Deathworks 2006/05/29(月) 18:46

今日は、Deathworksです。
私のコンピューターがインターネットにつながっていませんから、2 0.213をまだインストールしませんでした。ですから、2 0.213で直ったかも知りません。そして、ファイルを持って来るのを忘れてしまいましたから、前の様にコピーぺするのも出来ませんけど、必要な情報をおぼえていると思いますから、一応書き込みたいと思います。もし情報が足りませんと、もう一度コピペして書き込みます。

今回の問題はテキストを出す時に起きました。
ルーチンAがこんな感じになりました:
IF[@DW_Item_Index(@DW_Current_Item,\[Item_Index_Type])==\[Item_Type_None]]
GOSUB[#="DW_Item_Ov_None01"]
ELSE[@DW_Item_Index(@DW_Current_Item,\[Item_Index_Type])==\[Item_Type_Special]]
GOSUB[#="DW_Item_Ov_Special01"]
...
IFEND[]
@DW_Changes=0
LABEL[#="Item_Disp_Loop01"]
...
この後は前の書き込んだルーチンの同じようなキーの入る事を分析部分です。(前のルーチンからのコピペです)
そして、呼んだルーチンがこんな感じになりました:
LABEL[#="DW_Item_Ov_None01"]
\[p]ID番号:_[$DW_Item_Curr_Item]
\[r]まだ作られていない。
RETURN[]
もちろん、ルーチンAと別のファイルになります。($DW_Item_Curr_ItemはルーチンAで変更したグローバルの変数です。)
そうすると、YU-RISがFreeze(動かなくなること)してしまいます。二番目のルーチンがどんな形になっても、変数を使わなくても、最後のラインを出さず止めてしまいます。(上のVersionでちゃんと「ID番号:001」を書いた後で。「まだ作られていない。」を出しません)
でも、不思議なことが続きました:
ルーチンAの
@DW_Changes=0
の後で
\[p]つづく
を入ると、YU-RISがちゃんと最後まで行けます。
あるルーチンでのFreezeが他のルーチンの状態によって直すのがちょっと不思議だと思いますから、バグだと思います。二番目のルーチンを色々なVersionにして確かめても、最後のラインを出さずFreezeになりますから。

Deathworks

0476 2 0.213でも、そしてコードのコピーペー
投稿者:Deathworks 2006/05/30(火) 00:09

今日は、Deathworksです。
2 0.213でテストしても、同じ結果になりました。以下はルーチンの「大丈夫」のVersionですけど、問題を直ってくれたら嬉しいです。
ルーチンA(メインが「GOSUB」で呼び出すルーチンです。自分のファイルに入っています。)


LABEL[#="DW_Item_Distributor01"]
//
// アイテムの管理
//
INT[@DW_Number_Length=0]
LABEL[#="DW_Item_Dist_Display01"]
IF[@DW_Item_Current_Item<1]
@DW_Item_Current_Item=1
ELSE[@DW_Item_Current_Item>=\[Item_Index_Size]]
@DW_Item_Current_Item=\[Item_Index_Size] -1
IFEND[]
$DW_Item_Curr_Item=$@DW_Item_Current_Item
VARINFO[LET=@DW_Number_Length SET=$DW_Item_Curr_Item LENGTH=1]
LOOP[SET=3-@DW_Number_Length]
$DW_Item_Curr_Item="0"+$DW_Item_Curr_Item
LOOPEND[]
\[p]アイテムを選んで下さい。\[r]
IF[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_None]]
GOSUB[#="DW_Item_Ov_None01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Special]]
GOSUB[#="DW_Item_Ov_Special01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Weapon]]
GOSUB[#="DW_Item_Ov_Weapon01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Armor_Torso]]
GOSUB[#="DW_Item_Ov_A_Torso01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Armor_Head]]
GOSUB[#="DW_Item_Ov_A_Head01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Armor_Feet]]
GOSUB[#="DW_Item_Ov_A_Feet01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Shield]]
GOSUB[#="DW_Item_Ov_Shield01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Neck]]
GOSUB[#="DW_Item_Ov_Neck01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Ring]]
GOSUB[#="DW_Item_Ov_Ring01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Ammunition]]
GOSUB[#="DW_Item_Ov_Ammu01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_One_Shot]]
GOSUB[#="DW_Item_Ov_Once01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Reusable]]
GOSUB[#="DW_Item_Ov_Reusable01"]
ELSE[@DW_Item_Index(@DW_Item_Current_Item,\[Item_Index_Type])==\[Item_Type_Event]]
GOSUB[#="DW_Item_Ov_Event01"]
IFEND[]
@DW_Changes=0
GO[#="DW_Dist_Loop01"]
LABEL[#="DW_Dist_Loop01"]
\[r]_
IF[(@DW_DOWN == 0) && ((@_PAD_DOWN(@DW_Pad_Number) > 0) || (@_KEY_DOWN > 0))]
@DW_DOWN=1
@DW_Changes=1
@DW_Item_Current_Item+=1
ELSE[(@DW_UP == 0) && ((@_PAD_UP(@DW_Pad_Number) > 0) || (@_KEY_UP > 0))]
@DW_UP=1
@DW_Changes=1
@DW_Item_Current_Item-=1
ELSE[(@DW_MARU == 0)&&((\[Button_Maru] > 0)||(\[Key_Maru] > 0))]
@DW_MARU = 1
ELSE[(@DW_BATU == 0)&&((\[Button_Batu] > 0)||(\[Key_Batu] > 0))]
@DW_BATU = 1
GO[#="DW_Item_Distributor_End"]
IFEND[]
IF[(@DW_LEFT != 0) && ((@_PAD_LEFT(@DW_Pad_Number) < 0)&&(@_KEY_LEFT < 0))]
@DW_LEFT=0
IFEND[]
IF[(@DW_RIGHT != 0) && ((@_PAD_RIGHT(@DW_Pad_Number) < 0)&&(@_KEY_RIGHT < 0))]
@DW_RIGHT=0
IFEND[]
IF[(@DW_DOWN != 0) && ((@_PAD_DOWN(@DW_Pad_Number) < 0)&&(@_KEY_DOWN < 0))]
@DW_DOWN=0
IFEND[]
IF[(@DW_UP != 0) && ((@_PAD_UP(@DW_Pad_Number) < 0)&&(@_KEY_UP < 0))]
@DW_UP=0
IFEND[]
IF[(@DW_MARU != 0) && ((\[Button_Maru] < 0)&&(\[Key_Maru] < 0))]
@DW_MARU=0
IFEND[]
IF[(@DW_BATU != 0) && ((\[Button_Batu] < 0)&&(\[Key_Batu] < 0))]
@DW_BATU=0
IFEND[]
IF[@DW_Changes!=0]
GO[#="DW_Item_Dist_Display01"]
ELSE[]
GO[#="DW_Dist_Loop01"]
IFEND[]
GO[#="DW_Dist_Loop01"]
LABEL[#="DW_Item_Distributor_End"]
_\[p]
RETURN[]


そして、呼び出したルーチンは以下のようになります(こちらも別のファイルになりますね。)。


LABEL[#="DW_Item_Ov_None01"]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]まだ作られていない。
RETURN[]
LABEL[#="DW_Item_Ov_Special01"]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Special])]
\[r]これ以上のデータが必要ではありません。\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Weapon01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Weapon])]
LOOP[SET=\[Item_Data_Weapon_Size]]
\[r]_[$DW_Weapon_Data_Name(@I)] _[@DW_Weapon_Data(@I)]
@I+=1
LOOPEND[]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_A_Torso01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Armor_Torso])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_A_Head01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Armor_Head])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_A_Feet01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Armor_Feet])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Shield01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Shield])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Neck01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Neck])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Ring01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Ring])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Ammu01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Ammunition])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Once01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_One_Shot])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Reusable01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Reusable])]
\[r]
RETURN[]
LABEL[#="DW_Item_Ov_Event01"]
INT[@I=0]
\[r]ID番号:_[$DW_Item_Curr_Item]
\[r]名前:_[$DW_Item_Name_Index(@DW_Item_Current_Item)]
\[r]タイプ:_[$DW_Item_Type_Name(\[Item_Type_Event])]
\[r]
RETURN[]


Globalでの関係のものは


G_INT[@DW_Changes=0]

G_INT[@DW_Item_Index(\[Item_Index_Size],\[Item_Index_Dimension])]
G_STR[$DW_Item_Name_Index(\[Item_Index_Size])]
G_INT[@DW_Item_Current_Item=1]
G_STR[$DW_Item_Curr_Item="001"]
G_INT[@DW_Weapon_Data(\[Item_Data_Weapon_Size])]

G_STR[$DW_Item_Type_Name(\[Item_Types])]
G_STR[$DW_Weapon_Data_Name(\[Item_Data_Weapon_Size])]


Initでの準備は

$DW_Item_Type_Name(\[Item_Type_None])="未決定"
$DW_Item_Type_Name(\[Item_Type_Special])="ダミー"
$DW_Item_Type_Name(\[Item_Type_Weapon])="武器"
$DW_Item_Type_Name(\[Item_Type_Armor_Torso])="鎧"
$DW_Item_Type_Name(\[Item_Type_Armor_Head])="兜"
$DW_Item_Type_Name(\[Item_Type_Armor_Feet])="靴"
$DW_Item_Type_Name(\[Item_Type_Shield])="盾"
$DW_Item_Type_Name(\[Item_Type_Neck])="首輪"
$DW_Item_Type_Name(\[Item_Type_Ring])="指輪"
$DW_Item_Type_Name(\[Item_Type_Ammunition])="弾"
$DW_Item_Type_Name(\[Item_Type_One_Shot])="使い捨て"
$DW_Item_Type_Name(\[Item_Type_Reusable])="再使い"
$DW_Item_Type_Name(\[Item_Type_Event])="イベント"
$DW_Weapon_Data_Name(\[Weapon_Data_Subtype])="細かいタイプ"
$DW_Weapon_Data_Name(\[Weapon_Data_Min_STR])="必要な強さ"
$DW_Weapon_Data_Name(\[Weapon_Data_Min_DEX])="必要な器用さ"
$DW_Weapon_Data_Name(\[Weapon_Data_Damage])="ダメージ"
$DW_Weapon_Data_Name(\[Weapon_Data_Element])="属"
$DW_Weapon_Data_Name(\[Weapon_Data_Easiness])="難しさ"

そして、新しいMACROは
//
// アイテムリスト用の便利な
// 「Constant」
//
MACRO[NAME="Item_Index_Type" STR="0"]
MACRO[NAME="Item_Index_Disposition" STR="1"]
MACRO[NAME="Item_Index_Price" STR="2"]
MACRO[NAME="Item_Index_Icon_Number" STR="3"]
//
MACRO[NAME="Item_Index_Size" STR="500"]
MACRO[NAME="Item_Index_Digits" STR="3"]
MACRO[NAME="Item_Index_Dimension" STR="4"]
//
MACRO[NAME="Item_Type_None" STR="0"]
MACRO[NAME="Item_Type_Special" STR="1"]
MACRO[NAME="Item_Type_Weapon" STR="2"]
MACRO[NAME="Item_Type_Armor_Torso" STR="3"]
MACRO[NAME="Item_Type_Armor_Head" STR="4"]
MACRO[NAME="Item_Type_Armor_Feet" STR="5"]
MACRO[NAME="Item_Type_Shield" STR="6"]
MACRO[NAME="Item_Type_Neck" STR="7"]
MACRO[NAME="Item_Type_Ring" STR="8"]
MACRO[NAME="Item_Type_Ammunition" STR="9"]
MACRO[NAME="Item_Type_One_Shot" STR="10"]
MACRO[NAME="Item_Type_Reusable" STR="11"]
MACRO[NAME="Item_Type_Event" STR="12"]
//
MACRO[NAME="Item_Types" STR="13"]
//
MACRO[NAME="Weapon_Data_Subtype" STR="0"]
MACRO[NAME="Weapon_Data_Min_STR" STR="1"]
MACRO[NAME="Weapon_Data_Min_DEX" STR="2"]
MACRO[NAME="Weapon_Data_Damage" STR="3"]
MACRO[NAME="Weapon_Data_Element" STR="4"]
MACRO[NAME="Weapon_Data_Easiness" STR="5"]
//
MACRO[NAME="Item_Data_Weapon_Size" STR="6"]
//


使っているアイテムリストはまだ全て「0」(=未決定)になります

ルーチンAの中の

\[p]アイテムを選んで下さい。\[r]

というラインを消せば、スクリーンの変更が行わなくなりますけど、KEYの仕業をちゃんと聞きます。
でも、LABEL[#="DW_Dist_Loop01"]の後の

\[r]_

がなくなりますと、Freezeになります。

\[r]

だけならも駄目です。テキストがなければ、\[r]が無視されるらしいです。

AUTOCLICKもAUTOPAGEもAUTORETURNがOFFになります。

どうか確かめて下さい。

Deathworks

0481 見ました
投稿者:たくみ 2006/05/31(水) 04:36

Deathworksさんどうもです。
時間がなくてまだ私のほうで十分な確認ができていませんが、
ひとつ気になったのは、
LABEL[#="DW_Dist_Loop01"] 〜 GO[#="DW_Dist_Loop01"] の間をループして、そこでキー入力処理をしていますが、
そのループ内にウェイト命令が入っていないのに気づきました。

\[r]_

の部分を、

WAIT[FRAME=1]

に変えてみてもらえれば、多分正しく動くのではないかと思います。


多分原因としては、
「ウェイト命令が入っていないため延々と処理され続け、CPU使用率が100%になったまま、
YU-RISが応答不能になっている」のだと思います。

このあたりもマニュアルでいまいち説明不足だったので申し訳ないのですが、
キー/マウス/パッド入力処理をさせたり画面を描画させたりしつつ、ループ処理をさせる場合は、
必ずウェイト処理が必要になります。
で、そのウェイト処理を行う命令というのが、
 ・WAIT 命令 (←指定したフレームまたは時間分だけウェイト)
 ・表示文字 (←文字を表示しつつ、1フレームウェイト)
の2つなのです。
※YU-RISマニュアルの「タスク」の項目の下のほうに、一応簡単な説明があります。

で、\[r]__ と書いたら上手くいったのは、「__」が表示文字として認識されて、
1回ループするたびに1フレームのウェイトが入ったために、上手く動いたのだと思います。

このあたりは YU-RISのちょっと特殊な仕様で申し訳ないのですが、
とりあえず、難しいことは考えずに、
「ループ処理しつつ描画させたり入力処理させたい場合は、ループの最初か最後に WAIT 命令を入れる」
とだけ覚えておいてもらえればOKだと思います(^^