none
Частицы в Windows Form RRS feed

  • Общие обсуждения

  • Подскажите статью или ещё что то, где написано о том как делать частицы (particles) которые будут появляться и исчезать через определённое время.

    Меня не интересуют 3d пространства, так что давайте ссылки только на легкие 2d-шные примеры.

    Не знаю имеет это значение или нет но вместо частиц я буду использовать pictureBox`ы.

    Заранее спасибо!

    1 августа 2014 г. 8:33

Все ответы

  • Я вспомнил вот эту тему. Я тогда доработал немного программку звёздного неба (но не выложил код, т. к. топикстартер больше ничего не просил). Сейчас нашёл тот код:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WinFormStars
    {
        public partial class Form1 : Form
        {
            NumericUpDown numericUpDown;
            CheckBox checkBox;
            Panel skyPanel;
            Random random = new Random();
            Timer timer = new Timer();
            string[] stars = { "\u2605", "\u2606" };
            List<Star> list = new List<Star>();
            StringFormat sf = new StringFormat();
    
            public Form1()
            {
                InitializeComponent();
    
                numericUpDown = new NumericUpDown { Parent = this, Minimum = 10, Maximum = 50 };
                checkBox = new CheckBox
                {
                    Parent = this,
                    Left = numericUpDown.Width,
                    Height = numericUpDown.Height,
                    Appearance = Appearance.Button,
                    Text = "Animate",
                    TextAlign = ContentAlignment.MiddleCenter
                };
                skyPanel = new Panel
                {
                    Parent = this,
                    BackColor = Color.Black,
                    Top = numericUpDown.Height,
                    Width = this.ClientSize.Width,
                    Height = this.ClientSize.Height - Top,
                    Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom
                };
                //timer.Interval = 500;
                sf.Alignment = StringAlignment.Center;
                sf.LineAlignment = StringAlignment.Center;
    
                for (int i = 0; i < numericUpDown.Maximum; ++i)
                    list.Add(new Star());
                initStars();
    
                skyPanel.Paint += skyPanel_Paint;
                numericUpDown.ValueChanged += numericUpDown_ValueChanged;
                checkBox.CheckedChanged += checkBox_CheckedChanged;
                timer.Tick += timer_Tick;
                this.SizeChanged += Form1_SizeChanged;
                this.FormClosing += Form1_FormClosing;
            }
    
            void initStars()
            {
                for (int i = 0; i < numericUpDown.Maximum; ++i)
                {
                    list[i].index = random.Next(stars.Length);
    
                    list[i].emSize = (float)random.Next(5, 15);
    
                    int red = random.Next(255);
                    int green = random.Next(255);
                    int blue = random.Next(255);
                    list[i].brush = new SolidBrush(Color.FromArgb(red, green, blue));
    
                    list[i].x = (float)random.Next(skyPanel.Width);
                    list[i].y = (float)random.Next(skyPanel.Height);
                }
            }
    
            void timer_Tick(object sender, EventArgs e)
            {
                foreach (var star in list)
                {
                    if (star.growing)
                    {
                        star.emSize++;
                        if (star.emSize >= 15)
                            star.growing = false;
                    }
                    else
                    {
                        star.emSize--;
                        if (star.emSize <= 5)
                            star.growing = true;
                    }
                }
                skyPanel.Refresh();
            }
    
            void checkBox_CheckedChanged(object sender, EventArgs e)
            {
                timer.Enabled = checkBox.Checked;
            }
    
            void skyPanel_Paint(object sender, PaintEventArgs e)
            {
                for (int i = 0; i < numericUpDown.Value; ++i)
                    using (var font = new Font(skyPanel.Font.FontFamily, list[i].emSize))
                        e.Graphics.DrawString(stars[list[i].index], font, list[i].brush, list[i].x, list[i].y, sf);
                //for (int i = 0; i < numericUpDown.Value; ++i)
                //{
                //    int index = random.Next(stars.Length);
    
                //    var emSize = (float)random.Next(5, 15);
    
                //    var x = (float)random.Next(skyPanel.Width);
                //    var y = (float)random.Next(skyPanel.Height);
    
                //    int red = random.Next(255);
                //    int green = random.Next(255);
                //    int blue = random.Next(255);
    
                //    using (var font = new Font(skyPanel.Font.FontFamily, emSize))
                //    using (var brush = new SolidBrush(Color.FromArgb(red, green, blue)))
                //        e.Graphics.DrawString(stars[index], font, brush, x, y);
                //}
            }
    
            void numericUpDown_ValueChanged(object sender, EventArgs e)
            {
                initStars();
                skyPanel.Refresh();
            }
    
            void Form1_SizeChanged(object sender, EventArgs e)
            {
                initStars();
                skyPanel.Refresh();
            }
    
            void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (timer != null)
                {
                    timer.Stop();
                    timer.Dispose();
                }
            }
    
        }
    
        class Star
        {
            public int index;
            public float x;
            public float y;
            public bool growing;
            public float emSize;
            public SolidBrush brush;
        }
    }
    

    Звёзды (то бишь частицы) изменяют размеры по таймеру. Их положение и цвет каждый раз задаётся новое при изменении размеров окна и при задании нового количества.

    -----

    PS. Задрали глюки форума! Кликнул "Ответить". Пока нашёл своё старое сообщение, пока нашёл свой старый код, пока оформил сообщение - прошло несколько минут. Кликаешь "Отправить" - долго любуешься вращающейся джифкой, после чего - ничего.

    Такое часто бывает: если долго пишешь сообщение (отвлёкся на что-нибудь), то оно не отправляется. Доколе?

    1 августа 2014 г. 10:54
  • В методе skyPanel_Paint можно закомментировать первый цикл и раскомментировать второй: при этом не только размеры звёзд будут меняться, но и их положение при каждой "анимации".
    1 августа 2014 г. 11:02

  • PS. Задрали глюки форума! Кликнул "Ответить". Пока нашёл своё старое сообщение, пока нашёл свой старый код, пока оформил сообщение - прошло несколько минут. Кликаешь "Отправить" - долго любуешься вращающейся джифкой, после чего - ничего.

    Такое часто бывает: если долго пишешь сообщение (отвлёкся на что-нибудь), то оно не отправляется. Доколе?

    Непонятно. Еще бы сделать защиту от закрытия вкладки, если нажал на "Ответить". Пару раз так полный ответ дропал. И форматирование нормальное, а то бэкспейс используешь в строках и шрифт уменьшается.
    1 августа 2014 г. 15:05