WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:RPGの戦闘シーンを作成したい

0:[投稿] とも [MAIL] [2002/08/19 10:47 ][環境:WIN+IE WIN系+Java]

初めまして。
どーにも、こーにもできなくて、ここにやってきました。

実は、JavaScriptでRPGを作成しているのですが、
イベント処理に対してWaitをかける方法が見つかりません。

具体的には、戦闘シーンで下記のようなことが実現できればと思っています。

1.自分の攻撃(メッセージをTextAreaに出力)
(1秒Wait)
2.相手の攻撃(メッセージをTextAreaに出力)
(1秒Wait)
3.戦闘結果(メッセージをTextAreaに出力)

ユーザがコマンドを選択したイベントで処理を行うため、上記処理を1回の処理で行わなければなりません。
(また、TextAreaは直前の内容は削除して出力しています)

最悪、メッセージをダイアログ出力(alert()を使って)すれば解決するとは思っているのですが、
なにかよい方法があれば、教えてください。


1:[回答] セラ [2002/08/19 17:57 ]

すいません、RPG ってなんですか?


2:[回答] おーなーしぇふ [2002/08/19 18:15 ]

>イベント処理に対してWaitをかける方法が見つかりません。
setTimeoutを使ってみると良いかも?
こんな感じです。

var Str = new Array();
Str[0] = "自分の攻撃";
Str[1] = "相手の攻撃";
Str[2] = "戦闘結果";

var timerID = 10;
var Cnt = 0;
var T = 1000;    //間隔の指定
function Tes(){
    clearTimeout( timerID );

    var tx = document.f1.text;    //Textareaの指定
    if( Cnt < Str.length-1 ){
        tx.value = Str[Cnt];
        Cnt++;

        timerID = setTimeout( "Tes();", T );
    }else{
        tx.value = Str[Cnt];
        Cnt = 0;
    }
    return;
}

注)間隔の指定およびTextareaの指定は、必要に応じて修正して下さい。

>すいません、RPG ってなんですか?
「ロールプレイングゲーム」ではないかと?


3:[回答]   [2002/08/19 18:18 ]

>>1
ロールプレイングゲーム
>>0
var d1=new Date().getTime()
var d2=new Date().getTime()
while(d2<d1+1000*1.0){//1.0秒待つ
d2=new Date().getTime()
}


4:[回答] とも [2002/08/19 22:02 ]

おーなーしぇふ さん、ありがとうございます。

早速試してみます!
同じように?試したときは永久ループに入ってしまい、どーにもこーにもならない状況でした・・・。

ちなみにRPGとは、ご指摘の通り「ロールプレイングゲーム」です。

どうもありがとうございました。


5:[完了] とも [2002/08/19 22:02 ]

状態間違えました。


6:[お知らせ] おーなーしぇふ [2002/08/19 22:13 ]

完了済みですが、以下参考まで;

>>3
理屈ではWait処理がかかるのですが、実際には画面表示が更新されないので(スクリプト処理の明け渡しがないため)、期待通りの結果にはなりません。
※最後のメッセージが表示されるだけ

window.status 部分なら表示が切り替わりますが……以下、例を;
※ちなみにWinのIE5.5でしかチェックしてません。

var Str = new Array();
Str[0] = "自分の攻撃";
Str[1] = "相手の攻撃";
Str[2] = "戦闘結果";

var Cnt = 0;
function Tes(){
    var tx = document.f1.text;    //Textareaの指定
    tx.value = "";
    
    tx.value = Str[Cnt];
    window.status = Str[Cnt];
    Cnt++;
    Wait();
    
    tx.value = Str[Cnt];
    window.status = Str[Cnt];
    Cnt++;
    Wait();
    
    tx.value = Str[Cnt];
    window.status = Str[Cnt];
    Cnt = 0;
    return;
}
function Wait(){
    var d1 = new Date().getTime();
    var d2 = new Date().getTime();
    while( d2 < d1+1000*1.0 ){    //1.0秒待つ
        d2=new Date().getTime();
    }
    return;
}

●(参考)時間がかかる操作中に表示を更新する
http://www.microsoft.com/japan/msdn/columns/dude/dude02262001.asp


7:[完了] とも [2002/08/19 23:33 ]

おーなーしぇふ 様、本当にThanksです。

でも、実は書き込みを読む前に、別の方法で実現することができました。
(きちんとイベント処理をこなしつつ、メッセージ出力も行う)

ですが、
 function Wait(){
に関しては、本当に感謝しています。

単純にWaitかけたい場合に重宝させていただきます。
(今までは「できない!」と言い張っていました)


8:[完了] セラ [2002/08/20 13:32 ]

完了しているのになんですが、ロールプレイングゲームってどういう内容のゲームのことでしょうか?


9:[完了] saori [2002/08/20 14:09 ]

http://heavensgate.rpgnet-jp.com/official/biginers/bigi02.html
こんな↑感じです。

キャラを操作してゲームするのがRPGです。


10:[完了] おーなーしぇふ [2002/08/20 14:53 ]

>> 7
>でも、実は書き込みを読む前に、別の方法で実現することができました。
できれば紹介して欲しかった……(^^;)<別の方法


11:[完了] セラ [2002/08/20 22:50 ]

なるほど。
役割を演じるかどうかよりも、ファンタジーな世界観だったり、戦闘をするだけでも RPG と呼ぶ人が多いことが分かりました。


12:[完了] とも [2002/08/22 00:37 ]

>できれば紹介して欲しかった……(^^;)<別の方法

強引ですが、イベント処理をタイマー処理でLoopさせました。

イベントが発生したら、フラグを立てて、そのフラグがたっている場合はユーザの入力を規制するという方法です。
でもって、
Loop内でもフラグ(カウンタ)をもち、そのフラグによって1つずつ処理をこなしていくというものです。

1回目のLOOP
自分の攻撃(メッセージ出力)

(タイマーで1秒Wait)

2回目のLOOP
相手の攻撃(メッセージ出力)

(タイマーで1秒Wait)

3回目のLOOP
結果表示(メッセージ出力)

(タイマーで1秒Wait)

4回目のLOOP
タイマー処理を解除&ユーザからの入力を規制していたフラグを解除

ってな感じです。

「アホ」って笑わないでくださいね。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World