VB6でpictureBoxをループさせる方法教えてください

解決


  2007-02-06 04:45:58  No: 135160

VB6でループができないです。
明日までにどなたか教えてください><;


通ってみた  2007-02-06 06:59:13  No: 135161

まず、意味がわかる文章を書かないと、まったく先に進みませんよ
単なるループならFor 〜 Next、Do 〜 Loopなどがあります


  2007-02-07 00:45:35  No: 135162

すみません^^;
えっとpictureの透過はできているんですが。
ループのプログラムがわからなくて^^;
いろいろ試してみましたができなくて
Do〜loop、for〜Nextなどはいろいろ試しましたが
どうにもループしなくて困っています><


大吉末吉  2007-02-07 01:07:44  No: 135163

> pictureの透過
が、ループとどう関係するんです?

何をどういう風にループさせようとして、どういうコードを書いてみたら、
どう、上手くいかなかったのか、ちゃんと書いてください。

これじゃ、「ちゃんと、コードを書けば動きますよ」としか、答えようがありません・・・


  2007-02-07 01:20:54  No: 135164

透過はスクリーンセーバ作ってるので後に透過しないといけなかったからで透過しています
ループはコードがまったくわからないのです><
たとえば1の地点から2の地点に行ったらまた1の地点の戻ってきてまた
2の地点に行っての繰り返しを無限ループをしたいのです

私はVB初心者で本当にコードがわかりません><


大吉末吉  2007-02-07 01:42:12  No: 135165

> 透過はスクリーンセーバ作ってるので後に透過しないといけなかったからで透過しています

今回の「VB6でpictureBoxをループさせる方法教えてください」と「透過」の関係を尋ねているんですけど・・・

#質問に関係ない事なら書かないでください。話が混乱するだけです。

> 私はVB初心者で本当にコードがわかりません

では、頑張って勉強しましう!
勉強して、自分のレベルを上げるまでは、
自分でできる程度のプログラムで我慢するしかありませんからね。

> たとえば1の地点から2の地点に行ったらまた1の地点の戻ってきてまた
> 2の地点に行っての繰り返しを無限ループをしたいのです

「地点」をどうやって保持しているか分かりませんが・・・例えば、
---------------------------
Do While True
 If 地点= 地点1 Then
  地点= 地点2
 Else
  地点= 地点1
 End If

 ' -- 何かの処理
Loop
---------------------------
とか・・・

#念の為。上記は「概念(考え方の例)」であって、実際に動作するコードじゃありません。


大吉末吉  2007-02-07 01:55:43  No: 135166

先ほどのは、
「地点1と地点2をジャンプ」した場合、
「地点1から地点2へ順に移動」なら、

--------------------------------
s=1
Do While True
 If s = 1 Then
  For 変数 = 地点1 To  地点2 Step 地点1から地点2への移動量
    ' 処理
  Next
  s=-1
 Else
  For 変数 = 地点2 To  地点1Step 地点2から地点1への移動量
    ' 処理
  Next
  s=1
 End If
Loop
--------------------------------
こういうのもありですかね。

#念の為。上記は「概念(考え方の例)」であって(以下同文)


そがっち  2007-02-07 02:10:35  No: 135167

うむむ……
出来れば、最初から そのぐらいの質問の仕方が出来るようになりましょう。
小言っぽくなってしまいますが、物事を理論的に(情報を過不足なく)表現して
人に伝えることは、ある意味、プログラマやSEにとっては必要不可欠のスキルかと
思いますので。
(話は逸れるかもしれませんが、慣れたSEだと、他愛の無い会話をしただけで、
  相手が技術者として優れているか、だいたい予想が付くそうです)

……で、要は、
「PictureBoxを、ある条件で移動させる(ずらしていく)処理を無限ループさせたい」
んですよね。たぶん。
セーバーとか透過云々は、私は わからないんですが、
「PictureBoxを移動 → PictureBoxのTop、Leftプロパティを変える」
なので、その「プロパティを変える」処理をループさせてください。

どうやら時間も無いそうなので、簡単に、Formを水平に動かすプログラムを
載せておきますので参考にしてください。

<Form1.frm>
Option Explicit

Const MinX As Long = 1500           '100 * Screen.TwipsPerPixelX
Const MaxX As Long = 4500           '300 * Screen.TwipsPerPixelX

Private Sub Form_Activate()
    Dim DirectionF As Boolean       'True:右に移動  False:左に移動
    
    Me.Left = MinX      'Formの水平位置初期化
    DirectionF = True   '始めは右に移動
    Do
        If DirectionF = True And Me.Left = MaxX Then    '範囲の右端に達した際の方向転換
            DirectionF = False
        End If
        If DirectionF = False And Me.Left = MinX Then   '範囲の左端に達した際の方向転換
            DirectionF = True
        End If
        
        If DirectionF = True Then                       'DirectionFによって動かす方向を変える
            Me.Left = Me.Left + Screen.TwipsPerPixelX
        Else
            Me.Left = Me.Left - Screen.TwipsPerPixelX
        End If
        DoEvents    'アプリが「応答なし」になるのを回避
    Loop

End Sub

PictureBoxの場合も、これの応用で移動自体は出来ます。
あと、移動速度を変える場合は、タイマ等を使用して、「タイマイベントでループ」する
必要が出てきますが、これについては今は触れないことにします。
(変数のスコープとか説明しなくちゃいけなくなる可能性があるので)

何となく、「初歩をすっ飛ばしてるんじゃないか?」というイメージも受けますが、
出来ればもうちょっと基本的な部分から、キッチリ押さえていく事をオススメします。


  2007-02-07 02:55:36  No: 135168

ありがとうございます^^

えっと自分のは一回画面の外に消えてそしてもう一回始まったところに戻りまたそれが画面外に消えの繰り返しをしたいのです。

それを無限ループさせたいのです。
よろしくお願いします


そがっち  2007-02-07 03:02:27  No: 135169

えと、退社時間が近いので(汗)とりあえずヒントだけ。
・画面の大きさはScreen.WidthやScreen.Heightで取得可能
・初期位置では左端に隠れて見えないような状態にするなら、
  初期位置は -Me.Width
これだけわかれば、あとは応用で何とかなるとは思うんですが……


通り巣鴨  2007-02-07 03:03:54  No: 135170

do 
 if 画面の外に出たら then
  座標を初期化処理
 end if
  座標の移動処理
DoEvents
loop

としか答えられないような気がする


  2007-02-07 03:04:39  No: 135171

ありがとうございますm(_ _)m
試して見ます


  2007-02-07 04:05:03  No: 135172

考え方はわかりましたが・・・
構文がよくわかりません><;
移動もしますが画面外に消えたら戻ってきません・・・
Do〜Loop文使ってみましたがいまいちDo〜Loop文がまだ理解できてないです。


そがっち  2007-02-07 04:33:50  No: 135173

うーん……
とりあえず、出来れば、その「画面外に消えて戻って来ない」状態のヤツでいいので、
書いたコードを見せてみてもらえませんか?
そこから問題点を示した方が、今後のためでも あると思うので。

しばらく後に、もう一度ここを覗いてみますので。


  2007-02-07 04:37:17  No: 135174

Private Sub Timer4_Timer()
    Dim dx As Integer
    Dim Picture21 As Integer
    
    dx = 1
    
    Form1.Picture24.Top = Form1.Picture24.Top - ((1 * Rnd) + dx)
    Form1.Picture24.Left = Form1.Picture24.Left - ((50 * Rnd) + dx)
    
    saver3
End Sub
Private Sub saver3()
    WindowState = 2
    
    Dim x As Integer, y As Integer, w As Integer, h As Integer
    
    x = Picture24.Left     'コピー先の座標
    y = Picture24.Top
    w = Picture24.Width  'コピー先のサイズ
    h = Picture24.Height
    '背景(花見)をコピー
    Picture24.PaintPicture Form1.Image, 0, 0, , , x, y, , , vbSrcCopy
    
    Picture24.PaintPicture Picture20.Image, 0, 0, w, h, 0, 0, w, h, vbSrcPaint  '←追加
    
    Picture24.PaintPicture Picture23.Image, 0, 0, w, h, 0, 0, w, h, vbSrcAnd '←追加

End Sub

今はこんな感じです^^;
これで一応左側に消えますがループができません><


KG  2007-02-07 04:55:13  No: 135175

通り巣鴨さんがおっしゃっている、

if 画面の外に出たら then
  座標を初期化処理
end if

が見受けられませんが。

#というかこの処理が零さんのいう「ループ」になるのですかね。


通りすがり  2007-02-07 05:00:14  No: 135176

座標を初期化する処理のやり方を教えてください・・・


そがっち  2007-02-07 05:02:35  No: 135177

ふむふむ……
確かに、これだと戻ってきませんね。
「画面からはみ出したら下端、または右端に戻す」処理が記述されていないのは、理解できてますでしょうか?
ひたすら引くだけじゃ、戻ってこられませんよ。

Private Sub Timer4_Timer()
    Dim dx As Integer
    Dim Picture21 As Integer
    
    dx = 1
    
    Form1.Picture24.Top = Form1.Picture24.Top - ((1 * Rnd) + dx)
    Form1.Picture24.Left = Form1.Picture24.Left - ((50 * Rnd) + dx)

    'ここで、画面からはみ出る(Top < Me.Height、または Left < Me.Width)可能性がある
    'はみ出た場合は、最下端または最右端に飛ばす
    If Form1.Picture24.Top < Me.Height Then     '上に はみ出たら……
        Form1.Picture24.Top = Screen.Height     '最下端に飛ばす(Screen.Heightが最下端になるのは解りますね?)
    End If
    If Form1.Picture24.Left < Me.Width Then     '左に はみ出たら……
        Form1.Picture24.Left = Screen.Width     '最右端に飛ばす(Screen.Widthが以下略)
    End If

    saver3
End Sub

……と、こんな感じでしょうか?
Me.HeightやMe.Widthを使っている意味が解らなければ、Me.HeightやMe,Widthを
試しにゼロに変えて動かしてみてください。
(((1 * Rnd) + dx)、((50 * Rnd) + dx)のところをScreen.TwipsPerPixelY、
  Screen.TwipsPerPixelXに変えてみると、もっと解りやすいかも?)


そがっち  2007-02-07 05:05:44  No: 135178

しまった、間違えました、スミマセン。
Me.Height と Me.Width は、マイナスをつけて
-Me.Hwight 、-Me.Width として下さい。

今、VB6入ってるマシン起動してないんでデバッグしてなくて(^^;……失礼しました。


  2007-02-07 05:27:17  No: 135179

Form1.Picture24.Top = Form1.Picture24.Top - Screen.TwipsPerPixelY
  Form1.Picture24.Left = Form1.Picture24.Left - Screen.TwipsPerPixelX
   
  'ここで、画面からはみ出る(Top < Me.Height、または Left < Me.Width
可能性がある
    'はみ出た場合は、最下端または最右端に飛ばす
    If Form1.Picture24.Top < 0 Then     '上に はみ出たら……
        Form1.Picture24.Top = Screen.Height     '最下端に飛ばす(Screen.Heightが最下端になるのは解りますね?)
    End If
    If Form1.Picture24.Left < 0 Then     '左に はみ出たら……
        Form1.Picture24.Left = Screen.Width     '最右端に飛ばす(Screen.Widthが以下略)
    End If

これで一応上にたどり着いたら消えました
ですが消えた後元の位置に戻りの繰り返しができません。


そがっち  2007-02-07 06:16:33  No: 135180

んーと……
んでは とりあえず、Screen.Height → Form1.Height 、Screen.Width → Form1.Width に
変えてみてもらえますか?
(もしかしたらForm1.ScaleHeightとScaleWidthの方がいいかもだけど)
それと、「元の位置に戻る」というのは、「本当に最初に画像が現れた位置」ですかね?
それとも、下の端に ほとんど隠れた位置? はたまた、下の端だけど完全に画像が見える位置?
その辺の情報を教えて下さい。

あと、多少話は逸れますが、(Me.)WindowState = 2 は、Form_Loadあたりでやっておいて、
それ以降は毎回設定したりしない方がいいと思いますよ。

(しかしいきなりラスタオペレーションですか(汗))


  2007-02-07 17:18:09  No: 135181

消えた画像は「元の位置に戻る」用にしたいです。
元の位置からまた移動して消えていってからの繰り返しですから
元の位置のほうがいいです。


あんび  2007-02-07 18:30:14  No: 135182

既にヒントや答えはいっぱい書いていただいているようなのですが?
答えを全部聞きたいのですか?勉強しているのですか?

とりあえず、元の位置を最初にどこかに退避しておいて
一定位置(この場合は画面から消えたら)にきたら、画像の位置を最初に退避した
値をセットしてあげたら、画像は最初の位置にもどってるはずです。
提示されたコードを自分でヘルプなりネットで調べて、実験して
多少は加工してください。
そのほうが掲示板の書込みを待つより確実に早くやりたいことができるとおもいますよ。


  2007-02-07 18:46:50  No: 135183

書いているのはわかっているのですが
それを実行できないのです><

コードをいろいろ変えながらもしているのですが
うまくいかないのです。


通ってみた  2007-02-07 19:31:01  No: 135184

>消えた画像は「元の位置に戻る」用にしたいです。

えぇ、すればいいと思いますが・・・
え?誰かにして欲しいの?
では逆に聞きますが、「元の位置」ってどこですか?

その答えが、貴方の質問の答えです

(略).Top = 元の位置のTop
(略).Left = 元の位置のLeft

もしくは

(略).Move 元の位置のLeft, 元の位置のTop


そがっち  2007-02-07 20:44:44  No: 135185

うーん、とりあえずヒントだけ書いてみます。
まず、私の想像で、やりたい事は
「デザイン時に設定したPictureBoxの位置を初期位置として、移動させて画面から(Formから)
はみ出したら、初期位置に戻す」として、それを前提として書きます。

「デザイン時に設定したPictureBoxの位置を初期位置とする」
    ↓
「デザイン時の位置を何らかの方法で憶えておく」
事が必要です。
デザイン時のTop、Leftプロパティを定数として定義しておくのも不可では ないですが、
それだと同じ情報が重複してしまい、プログラム修正時にミスが出る可能性が高くなるので、
私が よくやるやり方のヒントを。
・Top、Leftプロパティを憶えておくための「変数」(定数じゃないですよ)を準備
    タイマーイベントプロシージャから抜けても憶えておいてもらわないといけないので、
    Timer4_Timer() 内での定義ではダメです。
    ほとんど答えになってしまいますが、「モジュールレベル変数」として
    (厳密には、その他にも やり方はありますが、ここでは割愛)定義してください。
・Form_Loadで、上で定義した変数に、Loadした時点でのPictureBoxのTop、Leftプロパティを代入しておく

……あとは、「はみ出た」条件に引っかかったときの戻り先の位置を設定する際に、
その変数の内容を再利用するだけです。


  2007-02-08 01:24:10  No: 135186

ありがとうございましたm(__)m
解決しました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加