いきなり、直しました
いきなりツイッターでご指摘をいただいたので
がっつり直しました。
まず、2周目問題ですが、
内部的には、X座標が増え続けていて
- 1周目
- 240 - 240 = 0 (X 座標 0 からボールが)
- 2周目
- 480 - 240 = 240 (X 座標 240 からボールが)
orz...
他にも Invalidate() を2発もどうかというので
ひとつにまとめました。
たぶん、大丈夫。たぶん。
ダメなのも一つ前のエントリに残しておきます
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { Text = "アプリ"; Size = new Size(240, 320); MinimizeBox = false; SuspendLayout(); AutoScaleDimensions = new SizeF(96, 96); AutoScaleMode = AutoScaleMode.Dpi; Menu = new MainMenu(); InitializeComponent(); ResumeLayout(false); } // x,y はボールの座標、xx,yy はボールをクリックしたときの座標、px,py は新しく作ったボールの座標 private int x = 0; private int y = 0; private int xx; private int yy; // list は画面表示のときに作成したボールをすべて描画するためのリスト private List<Point> list = new List<Point>(); // タイマーを作成 private void InitializeComponent() { var timer = new Timer(); timer.Interval = 50; timer.Tick += new EventHandler(timer_Trick); timer.Enabled = true; } void timer_Trick(object sender, EventArgs e) { // x 座標(横)に3ずつ動く、右端まで行ったら左から x += 3; if (x >= ClientSize.Width) x = 0; // y 座標(縦)に4ずつ動く、下まで行ったら上から y += 4; if (y >= ClientSize.Height) y = 0; Invalidate(); } // マウスをクリックした場所がボールの辺りだったらリスト list に座標を追加(スタート位置は左端なのでX座標は0) protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.X <= 16 && e.Y >= y - 8 && e.Y <= y + 8) { yy = y; list.Add(new Point(0 , yy)); } } // 描画するとこ protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // listに入ってるものすべてを描画 for (int i = 0; i < list.Count;i++) { var p = list[i]; // listの中身i番目の(X,Y)のXを3つ進めて p.X += 3; // 端っこまで行ったら元の位置に戻す if (p.X >= ClientSize.Width) p.X -= 240; //listの中身i番目に戻す list[i] = p; using (var brush = new SolidBrush(Color.Purple)) { e.Graphics.FillEllipse(brush, p.X, p.Y, 16, 16); } } // 最初から縦に動いているものを描画 using (var brush = new SolidBrush(Color.Red)) { e.Graphics.FillEllipse(brush, 0, y, 16, 16); } } } }