いきなり、直しました

いきなりツイッターでご指摘をいただいたので
がっつり直しました。

まず、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);
            }
        }
    }
}