• ベストアンサー

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

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

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

サンプルです。 フォーム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
質問者

お礼

大変わかりやすく記入いただき、ありがとうございます ぜひ試してみます。

その他の回答 (2)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

追記です タイマーコントロールも必要です。。。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

現在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
質問者

お礼

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

kakuunn
質問者

補足

PaintPicturの使い方がいまいち分からないので、 すみませんが、コード付きで教えてもらえないでしょうか。 使った事のないコードなので、 よろしくお願いします。

関連するQ&A

  • PictureBoxの画像の表示方法を教えて VB.NET

    VB.NET2003環境なのですが、 ピクチャーボックスに画像を表示したいのですが、 下記のようなことはできるでしょうか? ピクチャーボックスの大きさ640*240で固定 画像ファイル640*480 だった場合に、画像を縮小して、横長のピクチャーボックスの 中央に(左右に余白をつける)画像ファイルを表示したいです。 ピクチャーボックス自体の大きさを変える方法などは分かったのですが、 表示前にファイルの画像のサイズを小さくして、位置を指定して 表示する方法がわからないので、このようなことができましたら、 方法をご教示頂きたいです。 よろしくお願い致します。

  • 画像の表示について

    1.imageボックスを用いた場合、pictureプロパティで画像を参照した後Stretch=Trueにするとそのimageの大きさに合わせて画像を縮小して表示してくれます。   pictureボックスのときはその大きさに合わせて画像を縮小して表示できません。AutoSize=tureにしても画像の大きさにpictureボックスが大きくなってしまうだけです。 pictureボックスにはそのような縮小機能はないのでしょうか? 指定する画像を縮小して保存し直すしかないのでしょうか? そうすると表示したい大きさに合わせるのが大変で・・・。 2.ひとつのフォーム上に与えられた変数によって 画像を表示したいと考えています。 私たちが習ったのは 1. まずpictureボックスを1つ用意する。 2. 表示したい枚数だけimageボックスを準備しその中に画像をpictureプロパティで指定する。(画像5枚につきimageボックス5つ) 3. textボックスに数字をいれcommandボタンをおす。 4. その値によって picture1.piture=image1.picture という具合で表示させる。 こうなると表示したい画像が10枚あればimageボックスが 10個必要になりますよね。 そうなるとフォーム上がごちゃごちゃなってしまいます。 そうしないように画像をアドレスを指定して直接いれることはできませんか? image1.picture="gazou1.bmp"(エラーでした・・・。)みたいな感じで・・・。 そうするとimageボックスを1つしか作らなくてよいのですっきりするのですが。 以上2つよろしくお願いします。

  • ボタンクリックでタブ内のピクチャコントロールに画像描画

    呼び出し元ダイアログ(A)と コンボボックスのあるダイアログ(B) そしてタブの中に入るダイアログ(C)があります。 それぞれのダイアログ内にあるものは以下のとおり A→ボタン1(IDC_BUTTON1)…Bを呼び出すためのもの   ボタン2(IDC_BUTTON2)…画像を呼び出すためのもの   タブ(IDC_TAB1)…Cが入るもの B→コンボボックス(IDC_COMBO1)…画像を選択するもの   ↓   dataは「picture1;picture2」   OK/CANCELボタン…略 C→ピクチャボックス(IDC_PICT1)…画像を表示させるためのもの プログラムでAのタブの中にCを入れるところを完成しました。 次に以下のようなことをやりたいのですが、どのように処理をしたらいいのかわかりません。 ボタン1を押す→Bが呼び出される→コンボボックスで画像を選択→ボタン2を押す→タブ内のピクチャボックスにコンボボックスで指定した画像が表示される。 というようにしたいです。 1つのダイアログ上で画像をピクチャボックスに表示するものはやったことがありますが、ダイアログを挟んでの表示はやったことがないためここ2日悩んでいます。 下手な説明かとは思いますがご教授の程よろしくお願いいたします。 ※コンボボックス変数→CComboBox m_combo; ピクチャボックス変数→CStatic m_picture;

  • 画像を開く時に

    前まで画像を開くのは、Windows Picture~ で開いてました。 昨日からなんですが画像を開くのは PictureViewer というものに変わってしまいました。 クイックタイムプレイヤーのマークがついてます。 正直これでは不便なので、 windows Picture~ に変えたいのですがどうすればいいでしょうか? 画像を右クリ→プログラムから開く→この種類のファイルを開く時は~→OK を行いましたができませんでした。

  • [続編] pictureBoxそのものの位置を移動させたい -- 残像取り除きたい

    以前、『pictureBoxそのものの位置を移動させたい』というタイトルで質問させていただきました。変数iを用意して、iの値が変わるたびにpictureBoxそのものが動いているように見せかけるというもの。これに関しては、zhaojieさまから教えていただき、 Me.PictureBox1.Location = New System.Drawing.Point(i, j) で実現できました。しかしながら、実際に描画させると残像が残ってしまうようです。これをどうにかしたい。添付資料上部は初期状態で、右下に動かしたいピクチャーボックスがあります。これにある処理(グラフをかかせる)をさせながらピクチャーボックスを移動させたのが下部になります。ピクチャーボックスが左に移動しているのがわかると思います。ただ、軌跡が残像として残ってしまいます。これをなくす対処方法があれば教えてください。

  • エクセルのプログラムでイメージコントロールで表示した画像のサイズを変更したり移動する方法

    エクセルでまずユーザーフォーム、イメージコントロール、コンボボックス(サイズ変更)、スクロールバー(表示位置)を作り、 Set イメージ.Picture = Load Picture("C\xxx.xxx") というようにイメージコンロールに画像を表示させ、イメージコントロールのサイズや位置を変えることなくその中にある画像の部分のみサイズや表示位置を変えたいのですがどのようにすればよいのでしょうか? MoveメソッドやPictureSizeModeを使うとイメージコントロール自体が変わってしまいます。 回答よろしくお願いします。

  • 画像ファイルを配列に格納する方法

    http://okwave.jp/qa/q8852322.html このページで、 配列から直接圧縮画像ファイルを出力する方法を教えていただきました。 次は圧縮画像ファイルから配列を読み取るプログラムを作りたいと考えています。 http://tanlab.blog.fc2.com/blog-entry-31.html このページで画像ファイルをメモリに読み込む方法は書かれていて、 GdipCreateBitmapFromFile(ByVal StrPtr(file1), image) で変数imageに読み込むことができます。 このimageを上記のページの変数pDstBitmapに回すことで、 読み込んだ画像を別の画像として出力できることがわかりました。 いまやりたいことは 変数imageあるいは変数pDstBitmapを配列に書き出すことなのですが どうやれば良いでしょうか? これらの変数はLongとして定義されていて、 型が配列ではないのですが どのようにして扱えば良いのでしょうか? 一応、検索などして調べてみましたが 分かりませんでしたので教えてください。

  • フォームのピクチャーボックスの内容の退避

    動的に変わるピクチャーボックスの内容を以下の配列変数に設定したいのです。 dim Pct(X) as picturebox set pct(X) = form1.picture1 同じピクチャーボックスを表示したい場合は、以下のように変数から画面に設定したいのです。 set form1.picture1 = pict(X) が、退避しているはずなのに、全てがおなじピクチャーになってしまいます。 そんなことってありますか? 私が間違っているところがあれば、教えてください。 ピクチャーの内容は、VBからExcelのグラフを編集した後、クリップボード経由でピクチャーボックスに貼り付けたものです。

  • デジカメで撮った画像をPCに取り込み、トリミングしました。

    デジカメで撮った画像をPCに取り込み、トリミングしました。 これを年賀状ハガキに印刷したいと思っています。 それにあたり、トリミングしたものをぐるっと回転させる方法と、ハガキの好きな位置に印刷する方法がわからなく困っています。 画面全体で見てもそれらしきコマンドが見当たらないのですが・・。 ちなみに使っている画面はwindowsのスタートメニューから「ピクチャー」という所に入って、そこに画像が保存してあってそれを開いています。

  • OpenCVの画像表示について。

    OpenCVにて画像処理ソフトをつくっています。 VC++で、まず簡単に開くボタンから画像を開き、ピクチャーボックス、またはウィンドウに画像を表示するものを作ろうと思います。 しかし、ソースの中にファイル名を指定することでしか画像を開く方法しか方法がわかりません。 どのようにしてボタンを設置すればよいのでしょうか? また、プロジェクトの種類はWin32だけでしか作れないのでしょうか? OpenCVを使い始めたばかりの者でとても的外れな質問だとは思いますが、どうぞよろしくお願いいたします。

専門家に質問してみよう