- ベストアンサー
スロットゲームのプログラミング
お世話になります。 先日からスロットゲームに関して、質問しているものなのですが、リールが止まる時のタイミングについて質問です。 ボタンをクリックすると、回転し自然に止まるスロットなのですが、絵柄を用意してパラパラ漫画の要領で回転を再現してます。 各リール用にタイマーを設置して、1リール目が止まると、2リールのインターバルを0にして、止める構造に してあるのですが、1~3リールとも同じタイミングで止まってしまいます。 タイマーウェイト処理も停止絵柄の前で止まり、ウェイト後にカックンと止まる始末。 自然にポン、ポン、ポンと止まるように処理するには どうしたら用意でしょうか。 またご指導のほどよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VB6のタイマーは,はっきり言って使えません。 と言うのは,タイマーイベントはWindows上で動くので, どうしても他のアプリケーションやタスクの影響を受けるからです。 それでは,どうやって正確な時間を測るかですが, これにはWindowsAPIのTimeGetTimeを使います。 使い方は,検索エンジンでTimeGetTimeって引けば出てきます。 簡単に紹介すると,TimeGetTimeはシステムが起動してからの 時間を測るためのものです。これを使うには,まず Private Declare Function timeGetTime Lib "winmm.dll" () As Long を一番上の欄外でグローバル変数として宣言する必要があります。 つぎに,たとえばある一定の時間待つようなSubルーチンを作るなら, Private Sub Wait(WaitTime As Long) Dim TimeStart As Long StartTime = timeGetTime Do DoEvents Loop While (timeGetTime - StartTime < WaitTime) End Sub のようにします。 これを応用して,リールの止まる際にランダムでウェイト時間を 足して行けば,ゆっくり回転するようになります。 もちろん,ランダムで数字を加えますので, 同時に止まることはありません。 解りにくい場合は,また補足します。
その他の回答 (2)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
基本的に、TimerコントロールはPCのスペックにより 何故か速さが異なります(早くまわそうとすればするほど)。 確認済みかもしれませんが・・・。 だからどうすれば良いか、という事まではちょっと思いつきません・・・。 WindowsAPIのSleep()でもそれだけではどうにも出来ませんし・・・。 60でまわし、止まるにつれて回転は遅くなるはずです。 実機でも。 ピタッとは止まらないでしょう。 そういうスロットは見た事ありませんが・・・^^; 止まる時は60から、インターバルを徐々に上げる事により 速度低下を図る方法ではダメですか? 終了インターバルが1000でダメなら800、600などではどうでしょうか?
お礼
ご指導ありがとうございます。 先ほど検証しましたが、600でも上司の顔色が変わりません。 トホホ・・・・
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
インターバルが1000になるまで100ずつ加算し、 1000になったら0にする、とかでゆっくり止まり、 別々に止まるのでは? 現在、Timer1のインターバルが0になった途端に Timer2のインターバルが0になり、 その途端にTimer3のインターバルが0になっているので、 同時に止まってしまうのではないでしょうか。 勘で言っているので、見当違いでしたら失礼。
お礼
ご指導ありがとうございます。 全くおしゃっていただいてる通りなのですが、会社で作成しておりまして、インターバルが100で回転していても「遅い。実機の動きに近づけろ」との上司命令でして、現状60でまわしています。その状態から「ポンポンポンだ」と言われてまして、胃が痛い毎日です。 すいません、お礼が愚痴になってしまいました。
お礼
とりあえずランダムで出した係数に、読み込み枚数を何枚か足して、タイムラグをつける方法になりました。 またよろしくお願いします。
補足
ご指導ありがとうございます。 早速新しいプロシージャをつくりSubルーチンをコピペさせていただき、(General)に宣言部分を記述しました。 そして停止タイマー部に Image2(old2).Visible = False Image2(idx2).Visible = True old2 = idx2 If Timer1.Interval = 0 Then waittime = 2 ここを追加し If idx2 = 0 Then Timer2.Interval = 0 ElseIf idx2 = 3 Then Timer2.Interval = 0 ElseIf idx2 = 6 Then Timer2.Interval = 0 以下略 追加部分の数字を変えてみたりしたのですが、思う様に動いていません。記述の仕方がおかしいのでしょうか、それともAPIの使い方やソースの書き方などが根本的に間違ってますか。 ちなみにidx2は絵柄を書き換えてるときに使ってる変数です。