OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

画像処理について。(移動)

  • 暇なときにでも
  • 質問No.167464
  • 閲覧数350
  • ありがとう数2
  • 気になる数1
  • 回答数3
  • コメント数0

お礼率 50% (8/16)

今、スロットのアプリケーションを作成中なのですが、
いまいちリールの回転が滑らかじゃありません。
試してみたのが、ピクチャーを12345と作り、
1番目の画像を2番目へ.....と一つずつずらしていく方法
(画像をずらす)
もう一つ
12345とピクチャーを作り、
ピクチャーボックスの位置を動かしていく方法
(1が2の位置へ2が...5が1の位置へ)
この二つの方法ではいまいち滑らかにリールが回転するようには、見えません。(timeの関数を使ってあります)
よい方法が有りましたらぜひ教えてください。

画像の変数(リール配列は21個あります。)
画像の種類は7種類
通報する
  • 回答数3
  • 気になる1
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

サンプルです。

フォーム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
お礼コメント
kakuunn

お礼率 50% (8/16)

大変わかりやすく記入いただき、ありがとうございます
ぜひ試してみます。
投稿日時 - 2001-11-13 01:42:23
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

現在21個のピクチャボックスを用意してるのでしょうか? 1つのピクチャボックスに描画することにより、処理が軽くなり、スライドをしてるように見せることができます。 21個は面倒なので、仮に5個で説明します。 1つのピクチャの幅=50 1つのピクチャの高さ=30 とします。 1.ピクチャボックス1をフォーム中に用意する 2.ピクチャボックス1の幅=50/高さ=30 3. ...続きを読む
現在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の処理へ戻る
補足コメント
kakuunn

お礼率 50% (8/16)

PaintPicturの使い方がいまいち分からないので、
すみませんが、コード付きで教えてもらえないでしょうか。
使った事のないコードなので、
よろしくお願いします。
投稿日時 - 2001-11-13 00:43:27
お礼コメント
kakuunn

お礼率 50% (8/16)

お返事ありがとうございます。
さっそく試してみます。

お世話になりました。
投稿日時 - 2001-11-12 23:54:28
  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

追記です タイマーコントロールも必要です。。。
追記です
タイマーコントロールも必要です。。。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ