画面のスクロール

解決


オパマ  2009-07-27 15:28:37  No: 146121  IP: 192.*.*.*

画面上に星を描いて、それを上下にスクロールさせたいと
考えています。
この場合、星の座標を書きかえることだと理解していますが
なかなかアルゴリズムがかけません。

ヒントなど授けてくれたらうれしいです。
VB2008

編集 削除
YuO  2009-08-04 13:39:43  No: 146122  IP: 192.*.*.*

星の描かれたPicutreBoxを用意して,それを移動させるのではだめですか?
毎回描き直すより楽だと思いますが。

編集 削除
ひよこ  2009-08-04 15:24:19  No: 146123  IP: 192.*.*.*

座標を書きかえる方法であれば

(100、100−X、200、200−X)

↑のように座標を指定して、ループで変数の値を変えれば、いけると思います。
上下のMAXに達したらその値を使わないといけないっぽいので
(100、Y-X、200、Z-X)
とかで座標しないけいけないかもです。



でも、YuOさんの方法が楽ですねー!
自分はそんなことぜんぜん思いつきませんでした。。。

編集 削除
オパマ  2009-08-04 18:33:44  No: 146124  IP: 192.*.*.*

>星の描かれたPicutreBoxを用意して,それを移動させるのではだめですか?
>毎回描き直すより楽だと思いますが。
なるほど  それは考えつきませんでした。
でも、例えば下方に移動したときに、上方が空きますよね。
そこを埋めるには、う〜ん難しい
(私はプログラミングの才能がないのかもしれませんが少し考えてみます。)

編集 削除
reo  2009-08-04 21:50:33  No: 146125  IP: 192.*.*.*

ああ、それとな、ココ毎日通報しといてやるよ。
ネットカフェからもな。

編集 削除
バカだ  2009-08-04 23:28:32  No: 146126  IP: 192.*.*.*

ネカフェ遮断で終わりかと・・・。

編集 削除
reo  2009-08-05 08:25:38  No: 146127  IP: 192.*.*.*

vbがハッキングされた。
不正アクセス者は福岡市内在住。
個人情報を福岡県警に今日郵送します。

編集 削除
ひよこ  2009-08-05 11:11:54  No: 146128  IP: 192.*.*.*

>でも、例えば下方に移動したときに、上方が空きますよね。
>そこを埋めるには、う〜ん難しい


上方が空くっていうのがどういった
ことを指しているのかよくわからないんですが、PicutreBoxを
移動させるので、「上方が空く」というのはFromの上方という
ことですよね?そこを埋めるというのは?

編集 削除
特攻隊長まるるう  2009-08-05 16:36:16  No: 146129  IP: 192.*.*.*

>星の描かれたPicutreBoxを用意
というのは完全な星の画像を動かすだけだから空いたりなんかしません。

編集 削除
オパマ  2009-08-06 11:23:15  No: 146130  IP: 192.*.*.*

>上方が空くっていうのがどういった
>ことを指しているのかよくわからないんですが、PicutreBoxを
>移動させるので、「上方が空く」というのはFromの上方という
>ことですよね?そこを埋めるというのは?
PicutreBoxが640×480  でFormが800×600
なら、PicutreBoxコントロールが移動したら空きができませんか
ということなのですが?
なんか私の脳みそに問題ありでしょうか?

編集 削除
YuO  2009-08-06 11:44:31  No: 146131  IP: 192.*.*.*

> PicutreBoxが640×480  でFormが800×600
> なら、PicutreBoxコントロールが移動したら空きができませんか
> ということなのですが?

当然空きはできますが,それの何が問題なのでしょうか。
べた書きしたところで空くのですから。

何が問題になるのかは,この場においてはオパマさんのみが知っている情報です。
空くのは当然として,それがやりたいことと違うのであれば,空いた領域をどうしたいのかを書いてください。

編集 削除
natu  2009-08-06 13:46:39  No: 146132  IP: 192.*.*.*

>PicutreBoxが640×480  でFormが800×600
>なら、PicutreBoxコントロールが移動したら空きができませんか
>ということなのですが?

PictureBoxのサイズを1000×800にすれば解決できる
問題ですか?

編集 削除
特攻隊長まるるう  2009-08-06 13:58:32  No: 146133  IP: 192.*.*.*

>当然空きはできますが,それの何が問題なのでしょうか。
>べた書きしたところで空くのですから。
背景を空きと言うなら、空きができるできないではなくて
>PicutreBoxが
この時点で星以外は全部空きなのでは?

>PictureBoxのサイズを1000×800にすれば解決できる
>問題ですか?
その考え方で星を端まで移動させるならフォームの9倍必要かな?
最初の条件で上下にしか動かさないように書いてるから
縦をフォームの3倍にすればいいって考えは、まぁありだと思います。
自分のみが使うプログラムなら。。。ですが。

編集 削除
ガッ  2009-08-07 14:57:49  No: 146134  IP: 192.*.*.*

描画領域外の,ここで言っている「空」の部分から☆を描画しつつ,
スクロールすればいいだけなのでは?

編集 削除
特攻隊長まるるう  2009-08-07 18:11:42  No: 146135  IP: 192.*.*.*

> 描画領域外の,ここで言っている「空」の部分から☆を描画しつつ,
うん。。。常識で考えれば、特に問題になるようなことは無いんだけどね。
最初から星の描画しか条件が出てないのに、何故かそれ以外の描画が問題
らしい。描画自体のコードが説明されてないので特に言うことは無いんだけど、
通常の再描画処理で勝手に背景はデザイン時の背景色になりそうなもんですが。

>PicutreBoxが640×480  でFormが800×600
>なら、PicutreBoxコントロールが移動したら空きができませんか
移動しなくても空きあるやん?そこはどうしてるの?
同じことすればいいんじゃないの?どこに悩む要素があるの?って事です。

編集 削除
ひよこ  2009-08-07 18:51:55  No: 146136  IP: 192.*.*.*

--------------------
|    フォーム        |
|                    |
|   --------------   |
|  |  描画領域    |  |
|  |              |  |
|  |     ☆       |  |
|  |              |  |
|   --------------   |
|                    |
 -------------------- 

こんな感じでPicutreBoxごと動かすと確かに空きが出来るように感じると
おもうのですが、

フォームとPicutreBoxの色が同色なら

 --------------------
|    フォーム        |
|                    |
|                    |
|                    |
|        ☆          |
|                    |
|                    |
|                    |
|                    |
 -------------------- 

こんな感じになるだろうから、まるるうさんのおっしゃるように
☆以外は空きになりますよね。

と、解釈してる自分はあってますかね?

編集 削除
ひよこ  2009-08-07 18:53:19  No: 146137  IP: 192.*.*.*

↑の投稿、ぐちゃぐちゃになってしまいました。
なんとかいいたい事汲み取っていただけるとありがたいです。

編集 削除
オパマ  2009-08-07 19:35:53  No: 146138  IP: 192.*.*.*

ひよこさん>わざわざ図まで書いていただき感謝します。
もう少し頭をひねってみます・・・(ーー;)

編集 削除
魔界の仮面弁士  2009-08-07 19:59:06  No: 146139  IP: 192.*.*.*

WPF アプリにするという選択肢は無しでしょうか?
Image に背景透過な画像を割り当てておき、座標移動するだけで済むと思います。


Windows Forms が良いというのであれば、PictureBox の BackColor を Transparent にして、
そこに背景透過な星画像を割り当てておくという手もあるかと思います。
(事前に画像が用意できない場合、Bitmap クラスで動的に生成する事もできるでしょう)

ただしこちらの方法だと、座標を高速に連続して動かすと、透過背景部分の描画が
追いつかない事があります。その場合、PictureBox を動かす方法は諦めて、
ControlStyles.DoubleBuffer を割り当てた上で Paint イベントで描画処理するようにするか、
あるいは ElementHost コントロールを併用して、描画関係の部分だけ WPF に頼るのも手です。


> ↑のように座標を指定して、ループで変数の値を変えれば、いけると思います。
ループにすると、再描画やユーザー操作を妨げる可能性があるので、
アニメーションが目的なら、Windows Forms ならタイマー併用にした方が
良いかと思います。WPF なら StoryBoard で充分かもしれませんが。

編集 削除
とんま  2009-08-08 01:01:28  No: 146140  IP: 192.*.*.*

>010010001
>100100010
これシフトだけどローテートって言うのでは?
アセンブラーにしては意外と薄識ですね。

それから
「シフト演算」という単語の使いどころ間違ってますよ。

編集 削除
とんま  2009-08-09 13:12:43  No: 146141  IP: 192.*.*.*

>そんな話はどうでもいいよ。
>キャラデータをシフトするだけの簡単な話なんだからさ。
それを教えてあげたらいいじゃない。

あごめんね。見誤った。アセンブラーですらないのか・・。

http://www.geocities.co.jp/SiliconValley/5634/t82A6_0002.html#2149
こんな人がたまにいるみたいですね。

BASIC初心者?
だったら得意のマシン語で教えてあげれば?
板違いだけどね。

編集 削除
ガッ  2009-08-09 16:17:21  No: 146142  IP: 192.*.*.*

どこまで進んでいるのかわかりませんが..

> どう思う?
ながいです

# ひよこ 2009/08/07(金)
> ”描画領域”
と書かれているボックスですが,それは可視領域なのでは.
今回の”描画領域”は可視領域外の「ソラ」と言われている部分も含むので,
その点に注意すればどうってことないですが,現状どんな感じなんでしょうね.

編集 削除
オパマ  2009-09-02 10:06:22  No: 146143  IP: 192.*.*.*

>星の描かれたPicutreBoxを用意して,それを移動させるのではだめですか

この方法でやってみました。スクロールがややスムーズでありませんが
いちおうできました。また、アドバイスお願いします

Public Class Form1
    
    Dim rnd As Random = New Random() '乱数の宣言 
    Dim x As Integer, y As Integer


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       


        Me.BackColor = Color.Black 'Form1の背景を黒くする


    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Top += 5 'PictureBox1を下に移動
        PictureBox1.Invalidate()
        If PictureBox1.Top > Me.Height Then PictureBox1.Top = 0

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = Not Timer1.Enabled

    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        For i As Integer = 0 To 99 '星を描く

            x = rnd.Next(639)
            y = rnd.Next(479)

            Select Case rnd.Next(4)
                Case 0
                    e.Graphics.FillRectangle(New SolidBrush(Color.LimeGreen), x, y, 2, 2)
                Case 1
                    e.Graphics.FillRectangle(New SolidBrush(Color.White), x, y, 2, 2)
                Case 2
                    e.Graphics.FillRectangle(New SolidBrush(Color.Red), x, y, 2, 2)

            End Select


        Next
    End Sub
End Class

編集 削除
オパマ  2009-09-02 10:54:16  No: 146144  IP: 192.*.*.*

If PictureBox1.Top > Me.Height - 300 Then PictureBox1.Top = 0

こうすると星が降るようないい感じになりました。

編集 削除
オパマ  2009-09-02 14:41:41  No: 146145  IP: 192.*.*.*

これが完成品です

Public Class Form1
    Dim c As Integer
    Dim rn As Random = New Random

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Black
        PictureBox1.Width = 1280
        PictureBox1.Height = 1000
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

        Dim x As Integer, y As Integer
        For i As Integer = 0 To 999
            x = rn.Next(999)
            y = rn.Next(999)
            Select Case rn.Next(4)
                Case 0

                    e.Graphics.FillEllipse(New SolidBrush(Color.Green), x, y, 3, 3)
                    
                Case 1

                    e.Graphics.FillEllipse(New SolidBrush(Color.Red), x, y, 3, 3)

                Case 2
                    
                    e.Graphics.FillEllipse(New SolidBrush(Color.Yellow), x, y, 3, 3)

            End Select
        Next
        c = 0

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Top += 5
        PictureBox1.Invalidate()
        If PictureBox1.Top > Me.Width - 1000 Then PictureBox1.Top = 0

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = Not Timer1.Enabled
    End Sub
End Class

編集 削除
オパマ  2009-09-02 14:43:57  No: 146146  IP: 192.*.*.*

Dim c As Integer
  c = 0

は削除してください。
いろいろやっていたので残ってしまいました。

編集 削除
GOD  2009-09-02 22:24:22  No: 146147  IP: 192.*.*.*

>If PictureBox1.Top > Me.Width - 1000 Then PictureBox1.Top = 0
>
これが気になった。
「Me.Width」(フォームの横幅?)

編集 削除
ごほうこく  2009-09-03 20:00:00  No: 146148  IP: 192.*.*.*

マルポ?
http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=9324

編集 削除
オパマ  2009-09-03 20:14:50  No: 146149  IP: 192.*.*.*

レスがあまりつかないのでマルポをしてしまいました。
お許し下さい。今後このようなことがないように気をつけます

編集 削除
ha?  2009-09-03 21:19:54  No: 146150  IP: 192.*.*.*

> レスがあまりつかないのでマルポをしてしまいました。

え?
だって、

> これが完成品です

って書いてあるから、もう終わったと思ってるけど?

編集 削除
まるぼう  2009-09-03 21:38:10  No: 146151  IP: 192.*.*.*

解決しているレスにああだこうだは御法度だ。

編集 削除
特攻隊長まるるう  2009-09-03 22:09:32  No: 146152  IP: 192.*.*.*

# スレとレスが間違ってる感もありますが。。。

>解決しているレスにああだこうだは御法度だ。
そんなことはありません。
問題があるから書き込む人が居るのです。
スレ主の意思表示として確認し、書き込む側の
判断で必要なことを追記してください。

編集 削除
れお  2009-09-04 01:51:26  No: 146153  IP: 192.*.*.*

スクロールしてないな。
あとさ、星を描画の前1行にコレ入れると綺麗になるよ。
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
ね。親切でしょ。

編集 削除
特攻隊長まるるう  2009-09-04 02:30:23  No: 146154  IP: 192.*.*.*

れおくんのレスがちゃんと会話できているように見える。。。
だめな人にレスつけると一周まわって良くなるの?

コード見た瞬間に動かす気が失せたんだよね。。。
どう見てもスクロールの効果がなしに近い、好き勝手描く
プログラムで「完成品です」って来たから

・・・ぽかーん。

ってなった。
でもまぁ、今動かしたらそれなりに綺麗に見えるから
いいんじゃないの?って思った。PictureBox を動かすのは
無意味だから再描画だけで良いし、スクロールのプログラム
として良い所が全く無いと思うけど、まぁ綺麗に見えるから。

。。。プログラムの掲示板の書込みじゃないよね?これ。

編集 削除
れお  2009-09-04 05:21:14  No: 146155  IP: 192.*.*.*

おばまさんは、配列が苦手のようにみえるけど。
入門者はソコでつまずく人が多いよ。
別に恥ではないと思う。
1000個の星をloadのとこで配列に格納する必要があるよ。
配列は避けては通れない壁。
この壁を迂回することはできない。
突破するしかないですね。

編集 削除
オパマ  2009-09-04 06:56:01  No: 146156  IP: 192.*.*.*

魔界の仮面弁士さんをはじめとしたこの道に精通した方のコメントをひそかに期待していたのですが、やはり某氏に指摘されたようにあまりにもおそまつなプログラムだったので語る言葉もきっとなかったのだと推測しております。頭も悪く能力もない私ですが、気を取り直して頑張りたいと思います。

れおさん、アドバイス感謝します。ありがとう。

編集 削除
5785u0365  2009-09-04 07:38:13  No: 146157  IP: 192.*.*.*

プログラミングの適性を考えたほうがいいかもよ。
嘲笑されっぱなしじゃつらいでしょに。

他に道もあるんだから。

編集 削除
ha?  2009-09-04 08:42:04  No: 146158  IP: 192.*.*.*

お粗末とは思わん。
単純に、聞きたいことが伝わってない、言葉が足りて無い、質問範囲が広すぎるから1から教えなきゃならないから何でそんなことしなければならない、と。

他の方法なんていくつもあるが、それを全部書けと?

あと、津波のように質問をどんどん流されても困る。
最初の質問と違うものは別でスレッド立ててね。

編集 削除
オパマ  2009-09-04 08:43:14  No: 146159  IP: 192.*.*.*

>プログラミングの適性を考えたほうがいいかもよ

いわれるとおりですね。ごもっとも
プログラミングはもうあきらめたいと思います。

編集 削除
れお  2009-09-05 01:21:48  No: 146160  IP: 192.*.*.*

配列は難しいですか?
1番簡単な配列で良いとおもいますよ。
動けば良いのです。
Public Class Form1
    '星の数
    Const hosi_kazu As Integer = 100
    '星の横位置
    Dim hosi_x(hosi_kazu - 1) As Integer
    '星の縦位置
    Dim hosi_y(hosi_kazu - 1) As Integer
    '星のサイズ
    Dim hosi_size(hosi_kazu - 1) As Integer
    '星の色
    Dim hosi_color(hosi_kazu - 1) As Integer
    '星のスピード
    Dim hosi_speed(hosi_kazu - 1) As Integer
    '__
    Dim obamaRandom As System.Random
    '色の数
    Const iro_kazu As Integer = 10 '10色
    Dim iro(iro_kazu - 1) As Brush

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'システムカラーを配列に格納
        iro(0) = Brushes.Blue : iro(1) = Brushes.White
        iro(2) = Brushes.Yellow : iro(3) = Brushes.YellowGreen
        iro(4) = Brushes.Green : iro(5) = Brushes.Aqua
        iro(6) = Brushes.Pink : iro(7) = Brushes.Orange
        iro(8) = Brushes.Gold : iro(9) = Brushes.Lime
        '__
        Me.Size = New Size(510, 530)
        PictureBox1.Size = New Size(500, 500)
        PictureBox1.Location = New Point(0, 0)
        PictureBox1.BackColor = Color.Black
        obamaRandom = New System.Random()
        For i As Integer = 0 To hosi_kazu - 1
            hosi_x(i) = obamaRandom.Next(500)
            hosi_y(i) = obamaRandom.Next(500)
            hosi_size(i) = obamaRandom.Next(2, 10)
            hosi_color(i) = obamaRandom.Next(iro_kazu)
            hosi_speed(i) = obamaRandom.Next(1, 4)
        Next
        Timer1.Interval = 100
        Timer1.Start()
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        For i As Integer = 0 To hosi_kazu - 1
            e.Graphics.FillEllipse(iro(hosi_color(i)), hosi_x(i), hosi_y(i), hosi_size(i), hosi_size(i))
        Next
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        For i As Integer = 0 To hosi_kazu - 1
            hosi_y(i) += hosi_speed(i)
            If hosi_y(i) > 490 Then
                hosi_y(i) = 0
                hosi_x(i) = obamaRandom.Next(500)
                hosi_color(i) = obamaRandom.Next(iro_kazu)
            End If
        Next
        PictureBox1.Invalidate()
    End Sub
End Class

編集 削除
syou  2009-09-05 09:43:13  No: 146161  IP: 192.*.*.*

改名しました(オパマです)
れおさん、たいへん参考になるソース有り難うございます。
素晴らしいですね。
挫けかけましたが、再度一から出直したいと思います。
また、おしえてくださいね。

編集 削除
れお  2009-09-06 21:23:41  No: 146162  IP: 192.*.*.*

テトリス、パックマン、マージャン
シューテイングゲームとか、モグラたたき
とかゲームプログラムだけならアドバイスできます。
vbで簡単に作れますんで、がんばってね。

編集 削除