SRC質問掲示板Mk2
(現在 過去ログ123 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■21484 / inTopicNo.1)  インクルードの記述ミスの指摘
  
□投稿者/ 夜叉 -(2009/03/31(Tue) 09:13:58) [ID:eS70O1if]
    現在コマンド入力を求めるインクルードを作成しているのですがどのように記述すればよいのか分かりません
    対応したキー番号は上下左右とA〜G(配列はASDFGの横一列)なのですが
    キー番号はそれぞれ下に書いてある通りなのですがそれをランダムで表示させる方法がわかりません

    キー[←] = KeyState(37)
    キー[↑] = KeyState(38)
    キー[→] = KeyState(39)
    キー[↓] = KeyState(40)

    キー[A] = KeyState(65)
    キー[S] = KeyState(83)
    キー[D] = KeyState(68)
    キー[F] = KeyState(70)
    キー[G] = KeyState(71)

    これらをランダムで5つ表示させて入力させるというのが目標です
    全く参考にならないと思いますが思ったとおりに書いたのがしたです

    ファービットブレイザー:
    set キー Random(キー)
    set キー判定 0
    set キー[←] = KeyState(37)
    set キー[↑] = KeyState(38)
    set キー[→] = KeyState(39)
    set キー[↓] = KeyState(40)
    set キー[A] = KeyState(65)
    set キー[S] = KeyState(83)
    set キー[D] = KeyState(68)
    set キー[F] = KeyState(70)
    set キー[G] = KeyState(71)
    Switch キー
    endsw
    sunset
    talk システム
    コマンドを入力しろ
    end

    for i = 1 to 40
    DrawWidth 9
    Color RGB(255, 255, 255)
    FillStyle 透明
    FillColor RGB(255, 255, 255)
    Line 65 225 420 300 B
    DrawWidth 1
    Color RGB(100, 100, 100)
    Line 65 225 420 300 BF
    refresh

    Font 16pt P明朝 RGB(255, 255, 255) Regular
    PaintString 115 245 $(キー) $(キー) $(キー) $(キー) $(キー)

    wait 2
    if KeyState(キー) then
    incr キー判定
    PlaySound Flair.wav
    endif
    Wait until (i * 2)
    next
    noon
    exit

    if コマンド > 4 Then
    autotalk フリオニール
    3;槍よ
    suspend
    戦闘アニメ_○
    autotalk フリオニール
    3;槍よ、切り裂く!
    suspend
    戦闘アニメ_○
    autotalk フリオニール
    3;槍よ、切り裂く!、砕けろ
    suspend
    戦闘アニメ_○
    autotalk フリオニール
    3;槍よ、切り裂く!、砕けろ、弾け!
    suspend
    戦闘アニメ_○
    autotalk フリオニール
    3;槍よ、切り裂く!、砕けろ、弾け!、剣よ!
    suspend
    戦闘アニメ_○
    autotalk フリオニール
    3;槍よ、切り裂く!、砕けろ、弾け!、剣よ!これで最後だ!
    end
    endif
    unset キー判定
    exit


    ここまで長く書いて何を言いたいのかわからないと思います、すみません
    自分に技術が足りないのは分かっているつもりですがどうかお願いします
引用返信/返信 削除キー/
■21485 / inTopicNo.2)  Re[1]: インクルードの記述ミスの指摘
□投稿者/ Mr -(2009/03/31(Tue) 13:18:48) [ID:xu962QgY]
http://mrsrc.web.fc2.com/
    完成を急がないで、順番を追って作業した方がいいと思いますよ。
    私は、大体以下の様にして作業しています。
    これを端折ったものは自分でも意味不明なものに仕上がります。

    1.実現したいことをできるだけ言葉で書いてみる
    今回なら、
    「画面に5回分のキー入力指示をランダムで表示して、プレイヤーに5回入力させる。上手くいったら技発動」
    だと思います多分。ディシディアやったことないんで分かりませんが。
    実際はもっと細かく書きます。表示位置とか、受付時間は何秒かとか。
    頭の中でイメージがハッキリしていればわざわざ書かなくてもいいです。その辺は個人差なので。
    書くほど萎える人もいれば、書くほどハッキリしてくる人もいるでしょうし。

    2.どうやって実現するのか、小分けにして考えてみる
    「画面に5回分のキー入力指示をランダムで表示」する場合、
    画面に表示 → PaintPictureかPaintString
    5回分 → Forなどで5回繰り返す
    キー入力指示をランダムで → Random関数と配列の組み合わせ
    と考えられます。
    具体的なコマンドが分からなければ、ヘルプを読み漁るなり質問するなりしましょう。

    3.実際にコマンドを打っていく
    「画面に5回分のキー入力指示をランダムで表示」を簡単に打つとこうなります。

    # 配列を作る
    キー[1] = "←"
    キー[2] = "↑"
    キー[3] = "→"
    キー[4] = "↓"
    # 5回実行する
    For i = 1 To 5
     # 配列から引っ張ってきた文字をX座標60間隔で描画する
     PaintString (i * 60) - $(キー[Random(4)])
    Next
    Refresh

    想定した通りに動かなかった場合、ヘルプを見ながらひとつずつコマンドや関数を確認します。
    それでダメなら質問掲示板に書き込みましょう。



    まずはこういう手順を踏んでみてください。
    いきなり全部を教えるのはちょっと無理です。それに、覚え切れないでしょうし。
    分からない点が出てきたらその都度書き込めばいいのです。
    質問掲示板に書き込み回数制限はありません。
    解決する問題は一回当たり一つに絞りこんだ方が回答も得られやすいというものです。
引用返信/返信 削除キー/
■21486 / inTopicNo.3)  すばらしく価値ある回答かと
□投稿者/ あかんべえ -(2009/03/31(Tue) 21:41:23) [ID:WRJY0y0R]
     質問への回答ではない書き込み、失礼します。

     Mrさんの示された回答は、「私は、大体以下の様にして作業しています」と控えめな表現をされてますが、ソフトウェア開発史上での多くの人たちの経験が凝縮されたものです。
     回答としても、すばらしいものだと思います。

     なので、軽く読み飛ばしてほしくはないな、と思いました。
     まあ言えば、プリントアウトして壁に貼って何度も読み返す価値のある回答かと。
     示された手法は汎用的なものですので、夜叉さんだけではなく、同じような悩みを抱えている人、そろそろ独自のシステムやサブルーチンを作ってみたいと考えている人すべてに、プリントアウトして読み返し、同じ手法で自分でもやってみることをおすすめします。

引用返信/返信 削除キー/
■21491 / inTopicNo.4)  Re[3]: すばらしく価値ある回答かと
□投稿者/ 夜叉 -(2009/04/02(Thu) 10:57:05) [ID:eS70O1if]
    Mrさんあかんべえさん、返信が遅れました
    なかなかネットを繋ぐことができないので返事が遅れてしまいます
    とりあえず、キーを押してもらう以外は教えてもらってですが完成しました

    center 対象ユニット
    #押してもらうキーをセットMrさんに教えてもらいました
    set キー[1] "↑"
    set キー[2] "↓"
    set キー[3] "←"
    set キー[4] "→"
    set キー[5] "A"
    set キー[6] "S"
    set キー[7] "D"
    set キー[8] "F"
    set キー[9] "G"
    #フォント
    Font 20pt P明朝 RGB(100, 255, 210) Regular

    #枠
    DrawWidth 1
    Color RGB(100, 100, 100)
    Line 0 190 480 280 BF

    #ランダムに5つキーを表示大よそ5秒あれば良いかと
    #PaintString〜の箇所もMrさんに教えてもらいました
    for i = 1 to 5
    PaintString ( i * 60) - $(キー[Random(9)])
    Wait 4
    Wait until (i * 10)
    refresh

    #@以降がまだ出来ていない部分です

    #キー判定に関してforを使うと一つしか表示されない?
    @for i = 1 to 5
    @ If KeyState($(キー[Random(9)])) Then
    @ incr キー判定
    @ PlaySound Type(Digital).wav
    @ endif
    @ Next

    next
    unset キー
    clearpicture
    talk フリオニール

    end
    #以降は前に書いた部分でシステムに無関係なので記述はなし
    exit


引用返信/返信 削除キー/
■21495 / inTopicNo.5)  Re[4]: すばらしく価値ある回答かと
□投稿者/ Mr -(2009/04/03(Fri) 19:35:15) [ID:i5S9sUuV]
    ぱっと見たところ、WaitコマンドとKeyState関数の使い方が違います。
    『Wait Until n』は『Wait Start』から指定した時間が経過するまでそこで何もしないで待つ、という使い方をします。『Wait Until』だけで使っても、SRCには「いつから待てばいいか」が分からないのです。
    KeyState関数は、キー番号を渡して、その番号に該当するキーが押されていたら1を返却する関数です。
    KeyState関数がキーが押されているかを判別するのはほんの一瞬(1000分の1秒以下)です。ちなみに格闘ゲームなどでは1フレーム(60分の1秒)ごとにどのキーが押されているかを判定しています。つまり、KeyState関数でキーが押されているかを取得しようとしたら、何回も何回も繰り返して実行しないといけないわけです。1000分の1秒を狙い撃ちできる人などいないのですから。

    また、それ以前に、
    >#ランダムに5つキーを表示大よそ5秒あれば良いかと
    の下の「for i = 1 to 5」から下を文章で書いていきますとね、


    5回繰り返しその1
     9文字の中からランダムで一つ選んで表示
     0.4秒間何もせずに待つ
     Wait Startの処理から繰り返し回数×1秒間何もせずに待つ(Wait Startが無いので無意味)
     画面を更新

     (ここから下が@付きの部分です)

     5回繰り返しその2
      この瞬間に9文字の中からランダムで選んだキーが押されているかどうか。
      押されていたら変数「キー判定」を1増やす
      押されていたら音を鳴らす
     5回繰り返しその2に戻る

    5回繰り返しその1に戻る


    となるんですよ。多分こういう動作を想定されてはいないと思うんですね。
    あと、前回のレスの、イメージを固める作業は完了しましたか?だとすると、上手く行かないのはどの部分ですか?
    こういうことを書いているのは、夜叉さんが「何ができなくて困っているのか」がわからないからです。
    「全部分からない」は無しです。
    ここは質問掲示板ですから、疑問があれば答えます。ただ、1から手取り足取り教えてくれる教習所ではないので、どこが分からないのかは明確にしてもらわないと答えにくいのですよ。

引用返信/返信 削除キー/
■21496 / inTopicNo.6)  Re[5]: すばらしく価値ある回答かと
□投稿者/ 夜叉 -(2009/04/03(Fri) 21:20:59) [ID:eS70O1if]
    Mrさん何度もすみません
    とりあえずキー判定までは完成しましたイメージどおりです
    イメージは
    1.順繰りにランダムでセットした文字を表示←○

    2.1で表示したキーを押されているかどうか←×

    3.キー判定まで約5〜6秒待つ(コマンドミスはあっても関係なし)←○

    4.判定がパーフェクトなら全て成功したアニメを表示するが判定に失敗があるなら中途半端なアニメを表示←○

    2の部分
    記述1:If KeyState($(キー)) Then
    記述2:If KeyState($(キー[Random(9)])) Then

    両方試してみましたがダメでした

    コマンド:
    #押してもらうキーをセット
    set キー[1] "↑"
    set キー[2] "↓"
    set キー[3] "←"
    set キー[4] "→"
    set キー[5] "A"
    set キー[6] "S"
    set キー[7] "D"
    set キー[8] "F"
    set キー[9] "G"

    #キー番号あまり関係ない?というより表示の際番号が表示

    #キー[1] = "38"
    #キー[2] = "40"
    #キー[3] = "37"
    #キー[4] = "39"
    #キー[5] = "65"
    #キー[6] = "83"
    #キー[7] = "68"
    #キー[8] = "70"
    #キー[9] = "71"

    #ここは完成
    #ランダムに5つキーを表示
    Font 20pt P明朝 RGB(100, 255, 210) Regular
    for i = 1 to 5
    PaintString ( i * 60) - $(キー[Random(9)])
    wait 2
    refresh
    next

    #キー処理ここから
    for i = 1 to 5
    wait start

    #未完成
    If KeyState($(キー)) Then

    incr キー判定
    PlaySound Type(Digital).wav
    wait 20

    endif
    Wait until (i * 10)
    Next
    #キー処理ここまで

    if キー判定 = 5 Then

    戦闘アニメ〜〜

    endif

    #残っているとまずいものを削除
    unset キー
    unset キー判定
    clearpicture
    #callは使っていないのでexitでOK?
    exit

引用返信/返信 削除キー/
■21499 / inTopicNo.7)  Re[6]: すばらしく価値ある回答かと
□投稿者/ Mr -(2009/04/04(Sat) 12:44:03) [ID:i5S9sUuV]
    まず事前に確認しないといけないのですが、どのキーを押したときに入力されたとみなすのでしょうか。
    例えば、Cを押しても入力としていいのでしょうか。
    つまりキーを、正しいキー・違うキー、の二つに分けるのか、
    それとも、正しいキー・違うキー・関係ないキー、の三つに分けるのか、ということです。
    キー判定をするからには、この正しいキー・違うキーの全てをチェックしないといけません。
    (正しいキーと関係ないキーに分けるという方法もありますが、この場合間違いが無いので時間内に全部のキーを押されたら正解扱いになってしまいます)

    以下、キー入力の考え方です。
    まずは、キー入力を一つ受け取る場合を考えましょう。
    前回も書きましたが、KeyState関数が入力を判別するのは一瞬で、いわば点です。しかし、人間がキーを押すのはコンピューターから見たらとても一瞬とはいえないくらい長い期間なのです。こちらは面です。
    キーが押されているか、というよりは、キーを押している間にKeyState関数を実行する、と考えた方が良いでしょう。
    つまり、面の入力時間を設定して、その間にKeyState関数という点を無数に設定します。たまたま面と点がかぶれば(実際は割りと良くかぶります)キーが押されていると判断するわけです。
    コレをSRCコマンドを駆使して書くと、こんな感じになります。

    Wait Start
    For i = 1 To 300
     # 全ての関係あるキーが押されているかをチェックする。同時押しは考慮しない。
     If キーが押されているか Then
      If このキーは正解か Then
       正解の処理
      Else
       間違いの処理
      EndIf
     ElseIf キーが押されているか Then
     ・(一つ目のIfと同じ)
     ・
     ・
     EndIf
     # 5秒間にチャンスは300回
     Wait Until ((50 / 300) * i)
    Next

    「このキーは正解か」「正解の処理」「間違いの処理」はどうすれば良いか、まず自分で考えてみてください。
    ともあれ、これが出来たら次は5回繰り返してみましょう。
引用返信/返信 削除キー/
■21502 / inTopicNo.8)  Re[7]: すばらしく価値ある回答かと
□投稿者/ 夜叉 -(2009/04/06(Mon) 11:45:01) [ID:ieYK4nIL]
    複雑に考えすぎて何が何だかわからなくなってしまいました
    とりあえず
    キーを押してあるかどうか
    キーは正解か?
    キーは不正解か?
    という所で色々悩んでいます

    #押してもらうキーをセット
    set キー[1] "↑"
    set キー[2] "↓"
    set キー[3] "←"
    set キー[4] "→"
    set キー[5] "A"
    set キー[6] "S"
    set キー[7] "D"
    set キー[8] "F"
    set キー[9] "G"

    #キー[1] = "38"
    #キー[2] = "40"
    #キー[3] = "37"
    #キー[4] = "39"
    #キー[5] = "65"
    #キー[6] = "83"
    #キー[7] = "68"
    #キー[8] = "70"
    #キー[9] = "71"

    #ランダムに5つキーを表示
    Font 20pt P明朝 RGB(100, 255, 210) Regular
    for i = 1 to 5
    PaintString ( i * 60) - $(キー[Random(9)])
    wait 2
    refresh
    next

    #キー処理ここから

    #何回繰り返すかこの場合5回
    for i = 1 to 5
    #何秒待つかこの場合5秒
    wait start
    for i = 1 to 300
    #先ずはキーを押しているかどうか
    If KeyState(i) Then
    #押されているキーがランダムで表示したうちのどれかと合致しているか
    if KeyState(i) = $(キー[Random(9)]) Then
    incr キー判定
    PlaySound Type(Digital).wav
    #wait 20
    #違うなら
    elseif not KeyState(i) = $(キー[Random(9)]) Then
    PlaySound Miss.wav
    endif
    endif
    Wait until ((50 / 300) * i)
    Next
    next
    #キー処理ここまで

    unset キー
    unset キー判定
    clearpicture
    exit
引用返信/返信 削除キー/
■21503 / inTopicNo.9)  Re[8]: すばらしく価値ある回答かと
□投稿者/ Mr -(2009/04/06(Mon) 19:36:02) [ID:i5S9sUuV]
    複雑に考えてしまうと余計に分かりにくくなるので、できる限りシンプルに考えていきましょう。
    全てのイベントコマンドの記述には意味がありますので、それをひとつずつ考えてみてください。
    たとえば、
    『set キー[1] "↑"』
    この記述は意味が分かっていますか?
    これは『キー』という名前の入れ物の『1』と書いてある場所に『↑』という文字を入れるという意味です。
    そして、
    『PaintString ( i * 60) - $(キー[Random(9)])』
    これは『キー』という箱の『1〜9のうちのどれか』に入っている文字を画面に表示する、という意味です。
    さて質問です。
    『If KeyState(i) Then』
    これはどういう意味でしょうか?まあとりあえず入れてみたのかもしれませんが、とりあえずでは動いてくれないのがプログラムというやつです。
    前回の私の書き方が不親切なのもあったのですが、改めてキーが押されているかの考え方を書きますと、

    ↑が押されているか
     正解は↑なのか
      正解の場合は正しいキー入力
      正解ではない場合は間違ったキー入力
    →が押されているか
     正解は→なのか
      正解の場合は正しいキー入力
      正解ではない場合は間違ったキー入力
    ↓が押されているか
     正解は↓なのか
      正解の場合は正しいキー入力
      正解ではない場合は間違ったキー入力

    と、このように『入力できるキー全て』をチェックします。
    これはSRCに限ったことではなく、全てのゲームがそうであるはずです。
    キーを押したら「押しましたー」という信号がSRCに行くのではなく、SRCがキーボードを1/60秒に一回見にきて、今どのキーが押されているかを判断していると考えてください。

    さて、次の問題は『正解かどうか』です。
    何を持って正解とするのでしょうか。
    それは、
    一回目の入力なら一回目の表示と同じであること
    です。
    さて、一回目の表示とは何でしょうか。
    はい、『PaintString ( i * 60) - $(キー[Random(9)])』これです。
    しかしこれ、入力の時点ではもう見ることができません。
    『if KeyState(i) = $(キー[Random(9)]) Then』
    この記述のRandom(9)は以前のRandom(9)とは別のものなのです。
    正解かどうかを判別するには、正解を用意しておかなければなりません。
    表示が決まったときに『何を表示したか』を保存します。

    # どの文字か という名前でRandomの結果を取得
    どの文字か = Random(9)
    # Randomの結果に応じて処理する
    Switch どの文字か
    Case 1
    # Randomの結果が1 =キー[1] =↑ =キー番号は38
    # よって、i番目の表示は38
    表示[i] = 38
    Case 2
    # Randomの結果が2 =キー[2] =↓ =キー番号は40
    # よって、i番目の表示は40
    表示[i] = 40



    Case 9
    # Randomの結果が9 =キー[9] =G =キー番号は71
    # よって、i番目の表示は71
    EndSw

    PaintString ( i * 60) - $(キー[どの文字か])

    この先、例えば1番目の表示を参照したい場合は、
    表示[1]
    3番目の表示を参照したい場合は、
    表示[3]
    とすれば良いことになります。


    これらを参考に、記述を書き直してみてください。
    どうしても分からないようならメッセンジャーでコンタクトしてもらってもOKです。
引用返信/返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -