画面上に星を描いて、それを上下にスクロールさせたいと
考えています。
この場合、星の座標を書きかえることだと理解していますが
なかなかアルゴリズムがかけません。
ヒントなど授けてくれたらうれしいです。
VB2008
星の描かれたPicutreBoxを用意して,それを移動させるのではだめですか?
毎回描き直すより楽だと思いますが。
座標を書きかえる方法であれば
(100、100−X、200、200−X)
↑のように座標を指定して、ループで変数の値を変えれば、いけると思います。
上下のMAXに達したらその値を使わないといけないっぽいので
(100、Y-X、200、Z-X)
とかで座標しないけいけないかもです。
でも、YuOさんの方法が楽ですねー!
自分はそんなことぜんぜん思いつきませんでした。。。
>星の描かれたPicutreBoxを用意して,それを移動させるのではだめですか?
>毎回描き直すより楽だと思いますが。
なるほど それは考えつきませんでした。
でも、例えば下方に移動したときに、上方が空きますよね。
そこを埋めるには、う〜ん難しい
(私はプログラミングの才能がないのかもしれませんが少し考えてみます。)
ああ、それとな、ココ毎日通報しといてやるよ。
ネットカフェからもな。
ネカフェ遮断で終わりかと・・・。
vbがハッキングされた。
不正アクセス者は福岡市内在住。
個人情報を福岡県警に今日郵送します。
>でも、例えば下方に移動したときに、上方が空きますよね。
>そこを埋めるには、う〜ん難しい
上方が空くっていうのがどういった
ことを指しているのかよくわからないんですが、PicutreBoxを
移動させるので、「上方が空く」というのはFromの上方という
ことですよね?そこを埋めるというのは?
>星の描かれたPicutreBoxを用意
というのは完全な星の画像を動かすだけだから空いたりなんかしません。
>上方が空くっていうのがどういった
>ことを指しているのかよくわからないんですが、PicutreBoxを
>移動させるので、「上方が空く」というのはFromの上方という
>ことですよね?そこを埋めるというのは?
PicutreBoxが640×480 でFormが800×600
なら、PicutreBoxコントロールが移動したら空きができませんか
ということなのですが?
なんか私の脳みそに問題ありでしょうか?
> PicutreBoxが640×480 でFormが800×600
> なら、PicutreBoxコントロールが移動したら空きができませんか
> ということなのですが?
当然空きはできますが,それの何が問題なのでしょうか。
べた書きしたところで空くのですから。
何が問題になるのかは,この場においてはオパマさんのみが知っている情報です。
空くのは当然として,それがやりたいことと違うのであれば,空いた領域をどうしたいのかを書いてください。
>PicutreBoxが640×480 でFormが800×600
>なら、PicutreBoxコントロールが移動したら空きができませんか
>ということなのですが?
PictureBoxのサイズを1000×800にすれば解決できる
問題ですか?
>当然空きはできますが,それの何が問題なのでしょうか。
>べた書きしたところで空くのですから。
背景を空きと言うなら、空きができるできないではなくて
>PicutreBoxが
この時点で星以外は全部空きなのでは?
>PictureBoxのサイズを1000×800にすれば解決できる
>問題ですか?
その考え方で星を端まで移動させるならフォームの9倍必要かな?
最初の条件で上下にしか動かさないように書いてるから
縦をフォームの3倍にすればいいって考えは、まぁありだと思います。
自分のみが使うプログラムなら。。。ですが。
描画領域外の,ここで言っている「空」の部分から☆を描画しつつ,
スクロールすればいいだけなのでは?
> 描画領域外の,ここで言っている「空」の部分から☆を描画しつつ,
うん。。。常識で考えれば、特に問題になるようなことは無いんだけどね。
最初から星の描画しか条件が出てないのに、何故かそれ以外の描画が問題
らしい。描画自体のコードが説明されてないので特に言うことは無いんだけど、
通常の再描画処理で勝手に背景はデザイン時の背景色になりそうなもんですが。
>PicutreBoxが640×480 でFormが800×600
>なら、PicutreBoxコントロールが移動したら空きができませんか
移動しなくても空きあるやん?そこはどうしてるの?
同じことすればいいんじゃないの?どこに悩む要素があるの?って事です。
--------------------
| フォーム |
| |
| -------------- |
| | 描画領域 | |
| | | |
| | ☆ | |
| | | |
| -------------- |
| |
--------------------
こんな感じでPicutreBoxごと動かすと確かに空きが出来るように感じると
おもうのですが、
フォームとPicutreBoxの色が同色なら
--------------------
| フォーム |
| |
| |
| |
| ☆ |
| |
| |
| |
| |
--------------------
こんな感じになるだろうから、まるるうさんのおっしゃるように
☆以外は空きになりますよね。
と、解釈してる自分はあってますかね?
↑の投稿、ぐちゃぐちゃになってしまいました。
なんとかいいたい事汲み取っていただけるとありがたいです。
ひよこさん>わざわざ図まで書いていただき感謝します。
もう少し頭をひねってみます・・・(ーー;)
WPF アプリにするという選択肢は無しでしょうか?
Image に背景透過な画像を割り当てておき、座標移動するだけで済むと思います。
Windows Forms が良いというのであれば、PictureBox の BackColor を Transparent にして、
そこに背景透過な星画像を割り当てておくという手もあるかと思います。
(事前に画像が用意できない場合、Bitmap クラスで動的に生成する事もできるでしょう)
ただしこちらの方法だと、座標を高速に連続して動かすと、透過背景部分の描画が
追いつかない事があります。その場合、PictureBox を動かす方法は諦めて、
ControlStyles.DoubleBuffer を割り当てた上で Paint イベントで描画処理するようにするか、
あるいは ElementHost コントロールを併用して、描画関係の部分だけ WPF に頼るのも手です。
> ↑のように座標を指定して、ループで変数の値を変えれば、いけると思います。
ループにすると、再描画やユーザー操作を妨げる可能性があるので、
アニメーションが目的なら、Windows Forms ならタイマー併用にした方が
良いかと思います。WPF なら StoryBoard で充分かもしれませんが。
>010010001
>100100010
これシフトだけどローテートって言うのでは?
アセンブラーにしては意外と薄識ですね。
それから
「シフト演算」という単語の使いどころ間違ってますよ。
>そんな話はどうでもいいよ。
>キャラデータをシフトするだけの簡単な話なんだからさ。
それを教えてあげたらいいじゃない。
あごめんね。見誤った。アセンブラーですらないのか・・。
http://www.geocities.co.jp/SiliconValley/5634/t82A6_0002.html#2149
こんな人がたまにいるみたいですね。
BASIC初心者?
だったら得意のマシン語で教えてあげれば?
板違いだけどね。
どこまで進んでいるのかわかりませんが..
> どう思う?
ながいです
# ひよこ 2009/08/07(金)
> ”描画領域”
と書かれているボックスですが,それは可視領域なのでは.
今回の”描画領域”は可視領域外の「ソラ」と言われている部分も含むので,
その点に注意すればどうってことないですが,現状どんな感じなんでしょうね.
>星の描かれた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
If PictureBox1.Top > Me.Height - 300 Then PictureBox1.Top = 0
こうすると星が降るようないい感じになりました。
これが完成品です
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
Dim c As Integer
c = 0
は削除してください。
いろいろやっていたので残ってしまいました。
>If PictureBox1.Top > Me.Width - 1000 Then PictureBox1.Top = 0
>
これが気になった。
「Me.Width」(フォームの横幅?)
マルポ?
http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=9324
レスがあまりつかないのでマルポをしてしまいました。
お許し下さい。今後このようなことがないように気をつけます
> レスがあまりつかないのでマルポをしてしまいました。
え?
だって、
> これが完成品です
って書いてあるから、もう終わったと思ってるけど?
解決しているレスにああだこうだは御法度だ。
# スレとレスが間違ってる感もありますが。。。
>解決しているレスにああだこうだは御法度だ。
そんなことはありません。
問題があるから書き込む人が居るのです。
スレ主の意思表示として確認し、書き込む側の
判断で必要なことを追記してください。
スクロールしてないな。
あとさ、星を描画の前1行にコレ入れると綺麗になるよ。
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
ね。親切でしょ。
れおくんのレスがちゃんと会話できているように見える。。。
だめな人にレスつけると一周まわって良くなるの?
コード見た瞬間に動かす気が失せたんだよね。。。
どう見てもスクロールの効果がなしに近い、好き勝手描く
プログラムで「完成品です」って来たから
・・・ぽかーん。
ってなった。
でもまぁ、今動かしたらそれなりに綺麗に見えるから
いいんじゃないの?って思った。PictureBox を動かすのは
無意味だから再描画だけで良いし、スクロールのプログラム
として良い所が全く無いと思うけど、まぁ綺麗に見えるから。
。。。プログラムの掲示板の書込みじゃないよね?これ。
おばまさんは、配列が苦手のようにみえるけど。
入門者はソコでつまずく人が多いよ。
別に恥ではないと思う。
1000個の星をloadのとこで配列に格納する必要があるよ。
配列は避けては通れない壁。
この壁を迂回することはできない。
突破するしかないですね。
魔界の仮面弁士さんをはじめとしたこの道に精通した方のコメントをひそかに期待していたのですが、やはり某氏に指摘されたようにあまりにもおそまつなプログラムだったので語る言葉もきっとなかったのだと推測しております。頭も悪く能力もない私ですが、気を取り直して頑張りたいと思います。
れおさん、アドバイス感謝します。ありがとう。
プログラミングの適性を考えたほうがいいかもよ。
嘲笑されっぱなしじゃつらいでしょに。
他に道もあるんだから。
お粗末とは思わん。
単純に、聞きたいことが伝わってない、言葉が足りて無い、質問範囲が広すぎるから1から教えなきゃならないから何でそんなことしなければならない、と。
他の方法なんていくつもあるが、それを全部書けと?
あと、津波のように質問をどんどん流されても困る。
最初の質問と違うものは別でスレッド立ててね。
>プログラミングの適性を考えたほうがいいかもよ
いわれるとおりですね。ごもっとも
プログラミングはもうあきらめたいと思います。
配列は難しいですか?
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
改名しました(オパマです)
れおさん、たいへん参考になるソース有り難うございます。
素晴らしいですね。
挫けかけましたが、再度一から出直したいと思います。
また、おしえてくださいね。
テトリス、パックマン、マージャン
シューテイングゲームとか、モグラたたき
とかゲームプログラムだけならアドバイスできます。
vbで簡単に作れますんで、がんばってね。
ツイート | ![]() |