- ベストアンサー
画像処理について。(移動)
今、スロットのアプリケーションを作成中なのですが、 いまいちリールの回転が滑らかじゃありません。 試してみたのが、ピクチャーを12345と作り、 1番目の画像を2番目へ.....と一つずつずらしていく方法 (画像をずらす) もう一つ 12345とピクチャーを作り、 ピクチャーボックスの位置を動かしていく方法 (1が2の位置へ2が...5が1の位置へ) この二つの方法ではいまいち滑らかにリールが回転するようには、見えません。(timeの関数を使ってあります) よい方法が有りましたらぜひ教えてください。 画像の変数(リール配列は21個あります。) 画像の種類は7種類
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
サンプルです。 フォーム1[Form1] ├コマンドボタン1[Command1] │ ├コマンドボタン2[Command2] │ ├ピクチャボックス1[Pictur1] ││ │└ピクチャボックス2[Pictur2] │ └ピクチャボックス3[Pictur3] となるように画面に各コントロールを貼り付けてください。 ピクチャボックス2はピクチャボックス1の中に入れてください。 lngPicW/lngPicHでピクチャの1つの領域範囲を設定してます。 lngMoveVectでピクチャの移動量を設定してます。これはlngPicHを割り切れる数字に設定した方が、スムーズに動きます。 Option Explicit Private Const lngPicW As Long = 100 'ピクチャの幅 Private Const lngPicH As Long = 100 'ピクチャの高さ Private Const lngMoveVect As Long = 5 'ピクチャの移動量(高さを割り切れる数字が好ましい) 'スクロールを行うピクチャの高さ Private lngScrollPicH As Long Private Sub Command1_Click() Dim wkAry As Variant Dim i As Long Dim lngCntPic As Long '絵の情報 wkAry = Array( _ "C:\WINNT\しゃくなげ.bmp" _ , "C:\WINNT\グリーン ストーン.bmp" _ , "C:\WINNT\サポテック織り.bmp" _ , "C:\WINNT\サンタフェ.bmp" _ , "C:\WINNT\シャボン.bmp" _ ) 'ピクチャの数 lngCntPic = UBound(wkAry) + 1 'スクロールピクチャの高さ取得 lngScrollPicH = (lngCntPic + 1) * lngPicH With Me .Command1.Enabled = False .Command2.Enabled = True With .Picture1 .Visible = True End With With .Picture2 .Visible = True .Width = lngPicW .Height = lngScrollPicH .Left = 0 .Top = lngPicH - lngScrollPicH End With For i = 0 To lngCntPic - 1 .Picture3.Picture = LoadPicture(wkAry(i)) Call .Picture2.PaintPicture(.Picture3.Picture, 0, (lngCntPic - i) * lngPicH, lngPicW, lngPicH, 0, 0, .Picture3.ScaleWidth, .Picture3.ScaleHeight, vbSrcCopy) If i = 0 Then Call .Picture2.PaintPicture(.Picture3.Picture, 0, 0, lngPicW, lngPicH, 0, 0, .Picture3.ScaleWidth, .Picture3.ScaleHeight, vbSrcCopy) End If Next i End With End Sub Private Sub Command2_Click() Dim blnWork As Boolean With Me blnWork = Not .Timer1.Enabled If blnWork Then .Command2.Caption = "停止" Else .Command2.Caption = "回転" End If .Timer1.Enabled = blnWork End With End Sub Private Sub Form_Load() '各初期設定です 'あらかじめデザイン時にここのForm_Loadイベントでしていることを設定しておくと、Form_Loadのイベントは省略できます With Me With .Command1 .Caption = "初期設定" .Enabled = True End With With .Command2 .Caption = "回転" .Enabled = False End With With Timer1 .Enabled = False .Interval = 1 End With .ScaleMode = vbPixels With .Picture1 .ScaleMode = vbPixels .AutoSize = False .Visible = False .Appearance = 0 .BorderStyle = 0 .AutoRedraw = True .Enabled = False .Cls .Width = lngPicW .Height = lngPicH End With With .Picture2 .ScaleMode = vbPixels .AutoSize = False .Visible = False .Appearance = 0 .BorderStyle = 0 .AutoRedraw = True .Enabled = False .Cls End With With .Picture3 .ScaleMode = vbPixels .AutoSize = True .Visible = False .Appearance = 0 .BorderStyle = 0 .AutoRedraw = True .Enabled = False .Cls End With End With End Sub Private Sub Timer1_Timer() Dim lngTop As Long With Me 'TOP位置を計算 lngTop = .Picture2.Top + lngMoveVect If lngTop >= 0 Then lngTop = lngPicH - lngScrollPicH End If .Picture2.Top = lngTop End With End Sub
その他の回答 (2)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
追記です タイマーコントロールも必要です。。。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
現在21個のピクチャボックスを用意してるのでしょうか? 1つのピクチャボックスに描画することにより、処理が軽くなり、スライドをしてるように見せることができます。 21個は面倒なので、仮に5個で説明します。 1つのピクチャの幅=50 1つのピクチャの高さ=30 とします。 1.ピクチャボックス1をフォーム中に用意する 2.ピクチャボックス1の幅=50/高さ=30 3.ピクチャボックス2をピクチャボックス1の中に用意する 4.ピクチャボックス2幅=50/高さ=30*(5個+1) 5.PaintPicturで上から1/5/4/3/2/1の順番で描画 6.ピクチャボックス2のTOPを(-1*5*30)に設定 このとき一番下のピクチャが表示されているように見える。 7.ピクチャボックス2のTOP初期値がこの場合-150で、タイマーにより-149、-148と徐々にずらす。 8.ピクチャボックス2のTOP=0のとき、6の処理へ戻る
お礼
お返事ありがとうございます。 さっそく試してみます。 お世話になりました。
補足
PaintPicturの使い方がいまいち分からないので、 すみませんが、コード付きで教えてもらえないでしょうか。 使った事のないコードなので、 よろしくお願いします。
お礼
大変わかりやすく記入いただき、ありがとうございます ぜひ試してみます。