Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 16:26   #1
iljuase
Новичок
Джуниор
 
Регистрация: 05.06.2011
Сообщений: 1
По умолчанию Столкновение шаров и их исчезновение при этом

Доброго времени суток!
Задача: есть окно, в ней кнопка, при нажатии на неё появляется шар в случайном месте и движется хаотично, при ударении о границы окна отскакивает. Это я реализовал.
Но вторую часть не могу, а именно при столкновении друг с другом шары должны исчезать .
Количество шаров не ограничено, но если надо, искусственно можно ограничить стами.


Вот мой код, не рабочий, к сожалению.
Как мне подсказали, надо добавить уведомления, но я не понял.

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;
using System.Collections;
namespace zadan
{ 
public delegate void delEv();
public delegate void delEvS(Ball sm);
public class Ball
{
    public int x, y;
    int i = 0;
    public int xz=-200, yz=-200;
    public int dx, dy;
    int h, w;
    public event delEv ev;
    public event delEvS evS;
    public Thread t;
    public bool life;
    public Color c;
    private ArrayList aL;
 
    
    Wind wind;
    public int X
    { get { return x; } }
    public int Y
    { get { return y; } }
    public Color color
    { get { return c; } }
    public Ball(int X, int Y, int Dx, int Dy, int W, int H, Color C, ref ArrayList aL, Wind wind)
    {   
        x = X; y = Y; dx = Dx; dy = Dy;
        this.aL = aL; h = H; w = W;
        c = C; this.wind = wind;
        this.evS += new delEvS(wind.HadlerEvs);
        life = true;
        t = new Thread(new ThreadStart(func));
        t.Start();
 
    }
    public void func()
    {
        while (life == true)
        {
           // int i = 0; int a, b;  
         //   a = x; b = y;
          x += dx; y += dy;
           if (x <= 0 || x >= wind.Width) { dx = dx * -1; }
           if (y <= 0 || y >= wind.Height) { dy = dy * -1; }
         //   while (i != 10)
          //  {
            double a= Math.Abs(x - xz) * Math.Abs(x - xz) + Math.Abs(y - yz) * Math.Abs(y - yz);
           if (Math.Sqrt(a)==20) { if (ev != null) evS(this); }
               // a++; b++; i++;
         //   }
 
          if (wind.aL_ball.Count != 1 || wind.aL_ball.Count != 0) { xz = x; yz = y; }
 
            Point p = new Point(x, y);
            lock (this)
            {
                if (ev != null)
                { ev(); }
                Thread.Sleep(100);
            }
        }
    }
    public void Finish()
    {
        life = false;
        t.Join();
    }
}
    public class Wind : Form
    {
        Button butAdd;
       public  ArrayList aL_ball;
        Random r;
        public Wind()
        {
            aL_ball = new ArrayList();
            r = new Random();
            butAdd = new Button();
            butAdd.Location = new Point(30, 30);
            butAdd.Size = new Size(60, 60);
            butAdd.Text = "+1";
            butAdd.Click += new EventHandler(OnButAdd);
            Controls.Add(butAdd);
        }
      public   void OnButAdd(object obj, EventArgs e)
        {
 
            Color c = (Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)));
            Ball b = new Ball(r.Next(this.Width), r.Next(this.Height), r.Next(3, 10), r.Next(1, 5),
                this.ClientSize.Width, this.ClientSize.Height, c, ref aL_ball, this);
            b.ev += new delEv(HandlerEv);
            aL_ball.Add(b);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            IEnumerator inumBig = aL_ball.GetEnumerator();
            while (inumBig.MoveNext())
            {
                Ball big = (Ball)inumBig.Current;
                e.Graphics.FillEllipse   (new SolidBrush(big.c), big.X, big.Y, 20, 20);
            }
        }
        void HandlerEv()
        { Invalidate(); }
        public void HadlerEvs(Ball sm)
        {
            lock (this)
            {
                aL_ball.Remove((Ball)sm);
            }
        }
 
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            for (int i = 0; i < aL_ball.Count; i++)
            {
                Ball b = (Ball)aL_ball[i];
                b.Finish();
               
 
            }}
 
        static void Main()
        {
            Wind w = new Wind();
            Application.Run(w);
        }
    }}


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 28.11.2012 в 16:38.
iljuase вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При освобождении обьекта TThread, он вешает всю программу. При этом код Execute у TThread уж выполнился.. Человек_Борща Общие вопросы Delphi 23 30.11.2011 09:18
Исчезновение курсора при раскрытии ComboBox Stilet Общие вопросы Delphi 6 19.08.2010 07:34
Арканоид в Делфи (столкновение шаров) Scabby Gamedev - cоздание игр: Unity, OpenGL, DirectX 31 07.03.2010 22:30
Столкновение шаров, Delphi Absentik Помощь студентам 0 10.12.2009 18:15
элементы массива заносились в ListBox при этом располагались в столбик?! Ensoph Компоненты Delphi 3 14.09.2007 11:49