Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Phoelix
0 / 0 / 1
Регистрация: 16.11.2015
Сообщений: 11
.NET 4.x

Как превратить пиксели в обекты?

16.03.2016, 21:54. Показов 1537. Ответов 10

Студворк — интернет-сервис помощи студентам
Hello World! Помогите мне пожалуйста, хочу создать игру-песочницу в стиле The Powder Toy (пиксельная песочница).
И вот все бы хорошо, только я никак не могу придумать, как пиксели, которые мы рисуем, превратить в обьекты имеющие свои свойства.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2016, 21:54
Ответы с готовыми решениями:

(пиксели окна != пиксели монитора) ?
HDC hDCScreen = GetDC(NULL); int Horres = GetDeviceCaps(hDCScreen, HORZRES); int Vertres = GetDeviceCaps(hDCScreen, VERTRES); ...

Обекты C++
Доброго времени всем суток помоги пожалуста... У меня есть в проекте Header (Hbook.h) с классами (TBook и SpisokBooks), в нём вроде...

обекты класса С++
time5.cpp // îïðåäåëåíèÿ Ôóíêöèé-÷ëåíîâ êëàññà Time #include <iostream.h> #include"time5.h" // Ôóíêöèÿ-êîíñòðóêòîð äëÿ...

10
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10424 / 5154 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.03.2016, 10:48
Цитата Сообщение от Phoelix Посмотреть сообщение
И вот все бы хорошо, только я никак не могу придумать, как пиксели, которые мы рисуем, превратить в обьекты имеющие свои свойства.
Осталась самая мелочь, да?
Цитата Сообщение от Phoelix Посмотреть сообщение
И вот все бы хорошо, только я никак не могу придумать, как пиксели, которые мы рисуем, превратить в обьекты имеющие свои свойства.
Вам нужно рисовать не пикселы. Вам нужно создавать и рисовать объекты. Объекты складывать в список. Каждый объект принадлежит к определенному классу, имеет определенные свойства, имеет свои координаты, имеет свой вектор движения, свой цвет и т.д. А на экране нужно просто отрисовывать каждый объект в виде маленького прямоугольника в нужных координатах, взятых из свойств объекта.
1
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
17.03.2016, 10:54
Можно используя
C#
1
CreateGraphics()
метод:

C#
1
2
3
Bitmap b = new Bitmap(Width, Height, this.CreateGraphics());
//pixel is:
Color c = b.GetPixel(x, y);
Для задания пикселю нужного цвета

C#
1
b.SetPixel(x, y, c);
1
 Аватар для Phoelix
0 / 0 / 1
Регистрация: 16.11.2015
Сообщений: 11
17.03.2016, 12:50  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Вам нужно рисовать не пикселы. Вам нужно создавать и рисовать объекты
Цитата Сообщение от afront Посмотреть сообщение
C#
1
2
3
Bitmap b = new Bitmap(Width, Height, this.CreateGraphics());
//pixel is:
Color c = b.GetPixel(x, y);
Хммм... Если работать через Bitmap, то нужно, типа, по клику в клетке битмап (e.x, e.y) создать обьект с определенными свойствами, которые мы задаем нашему Pencil, а потом
C#
1
 panel1.update()
?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10424 / 5154 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.03.2016, 22:20
Лучший ответ Сообщение было отмечено Phoelix как решение

Решение

Phoelix,
Создайте двумерный массив объектов. Каждый объект может занимать ровно одну ячейку. Создайте цикл обработки физики, который будет проходится по массиву и обновлять состояние частиц. И создайте отдельный цикл отрисовки частиц, который будет тоже проходится по массиву и отрисовывать каждую частицу.

Это все выглядит вот так:
Базовый класс частицы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    /// <summary>
    /// Базовый класс частицы
    /// </summary>
    abstract class Particle
    {
        public PointF Location { get; set; }
        public PointF PrevLocation { get; set; }
        public PointF Velocity { get; set; }
        public PointF Force { get; set; }
        public float Mass { get; set; }
        public virtual Color Color { get; set; }
        public float AirFriction { get; set; }
 
        protected static Random OtherThreadRnd = new Random();
        protected static Random Rnd = new Random();
 
        public Particle()
        {
            Mass = 1;
            Color = Color.Orange;
            AirFriction = 0.95f;
            //сила тяжести
            Force = new PointF(0, Mass*9.8f);
        }
 
        /// <summary>
        /// Обновление сил, скоростей и координат
        /// </summary>
        public virtual void Update(Sandbox sb, float dt)
        {
            PrevLocation = Location;
 
            //приращение скорости
            Velocity = Velocity.Add(Force, dt / Mass);
            //трение о воздух
            Velocity = Velocity.Mult(AirFriction);
            //приращение координаты
            Location = Location.Add(Velocity, dt);
            //мы ударились о другую частицу?
            var cell = sb[(int)Location.X, (int)Location.Y];
            if (cell != null && cell != this)
            {
                //остаемся на месте, обрабатываем столкновение
                Location = PrevLocation;
                OnCollision(cell);
            }
        }
 
        /// <summary>
        /// Событие соударения
        /// </summary>
        public virtual void OnCollision(Particle other)
        {
            Velocity = new PointF(Rnd.Next(-4, 5), 0);
        }
    }

Песочница - контейнер частиц
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    /// <summary>
    /// Песочница - контейнер частиц
    /// </summary>
    class Sandbox
    {
        public const int WIDTH = 600;
        public const int HEIGHT = 400;
 
        public Particle[,] Particles = new Particle[WIDTH, HEIGHT];
 
        public Particle this[Point p]
        {
            get{ return this[p.X, p.Y]; }
            set { this[p.X, p.Y] = value; }
        }
 
        public Particle this[int x, int y]
        {
            get
            {
                if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) return null;
                return Particles[x, y];
            }
 
            set
            {
                if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) return;
                Particles[x, y] = value;
            }
        }
 
        public void Update(float dt)
        {
            //обновляем частицы
            foreach(var p in Particles)
            if (p != null)
                p.Update(this, dt);
 
            //заносим частицы в новые ячейки
            lock (this)
            {
                var newCells = new Particle[WIDTH,HEIGHT];
 
                for (int x = 0; x < WIDTH; x++)
                for (int y = 0; y < HEIGHT; y++)
                {
                    var p = Particles[x, y];
                    if (p != null)
                    {
                        var xx = (int)p.Location.X;
                        var yy = (int)p.Location.Y;
                        if (xx < 0 || xx >= WIDTH || yy < 0 || yy >= HEIGHT) continue;
                        
                        //передвигаемся в другую ячейку
                        if (newCells[xx, yy] != null)//если ячейка уже занята - остаемся на месте
                        {
                            p.Location = p.PrevLocation;
                            p.OnCollision(newCells[xx, yy]);
                        }
                        else
                            newCells[xx, yy] = p;
                    }
                }
 
                Particles = newCells;
            }
        }
    }

Панель отрисовки модели
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    /// <summary>
    /// Панель отрисовки модели
    /// </summary>
    partial class SandboxPanel : UserControl
    {
        private Bitmap bmp;
        public Sandbox Sandbox { get; set; }
 
        public SandboxPanel()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            //создаем буферный битмап
            bmp = new Bitmap(Sandbox.WIDTH, Sandbox.HEIGHT);
        }
 
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //игнорируем отрисовку бекграунда
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            if (Sandbox == null)
                return;
 
            e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
            e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
 
            //отрисовываем частицы на битмапе
            var particles = Sandbox.Particles;
 
            using(var wr = new ImageWrapper(bmp, false))
            for (int x = 0; x < Sandbox.WIDTH; x++)
            for (int y = 0; y < Sandbox.HEIGHT; y++)
            {
                var p = particles[x, y];
                if (p != null)
                    wr[x, y] = p.Color;
            }
 
            //отрисовываем битмап
            e.Graphics.DrawImageUnscaled(bmp, Point.Empty);
        }
    }

Главная форма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    public partial class MainForm : Form
    {
        private Sandbox sb;
        private Tools tools;
 
        public MainForm()
        {
            InitializeComponent();
 
            //создаем песочницу
            sb = new Sandbox();
            //создаем инструмент рсования
            tools = new Tools(){Sandbox = sb};
 
            cbTool.SelectedIndex = 0;
            pnSandbox.Sandbox = sb;
 
            //запускаем моделирование физики в отдельном потоке
            ThreadPool.QueueUserWorkItem((_)=>
            {
                var sw = new Stopwatch();
                sw.Start();
                //цикл моделирования физики
                while (true)
                {
                    var dt = 0.25f;
                    //var dt = sw.ElapsedMilliseconds / 200f;
                    sw.Restart();
                    sb.Update((float) dt);
                }
            });
 
            //запускаем таймер обновления интерфейса
            new System.Windows.Forms.Timer {Enabled = true, Interval = 15}.Tick += delegate { pnSandbox.Invalidate(); };
        }
 
        private void pnSandbox_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                var radius = 5;
 
                //создаем частицы
                switch (cbTool.Text)
                {
                    case "Sand": tools.CreateParticles<SandParticle>(e.Location, radius); break;
                    case "Solid": tools.CreateParticles<SolidParticle>(e.Location, radius); break;
                    case "Water": tools.CreateParticles<WaterParticle>(e.Location, radius); break;
                }
            }
        }
    }


Все вместе: WindowsFormsApplication332.zip

5
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
17.03.2016, 23:23
Вау. Красивая штука. Как-нибудь доберусь до графики... может быть ) после баз данных и asp.net ))

Добавлено через 5 минут
Но песок, похоже, не тонет... В учебных целях
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10424 / 5154 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
18.03.2016, 00:23
Цитата Сообщение от baliar Посмотреть сообщение
Но песок, похоже, не тонет... В учебных целях
В моей полной версии - тонет.
Я это оставил на доработку автора.
1
 Аватар для Phoelix
0 / 0 / 1
Регистрация: 16.11.2015
Сообщений: 11
23.03.2016, 15:00  [ТС]
Вау! Спасибо! Гениально! Спасибо за помощь! Оказалось все ОООЧЕНЬ просто! Мдя, мы не ищем легких путей)))))
Спасибо за реализацию движения, дальше, думаю, справлюсь.
0
 Аватар для Phoelix
0 / 0 / 1
Регистрация: 16.11.2015
Сообщений: 11
30.05.2016, 06:28  [ТС]
Storm23, Прости, что я это делаю, но можешь хоть подсказку дать, КАК ЗАСТАВИТЬ ЭТИ ЧАСТИЦЫ МЕНЯТЬСЯ МЕСТАМИ(Вода и песок). Буду ООООООЧЕНЬ благодарен! Я целый месяц выносил свой мозг в попытках сделать это, самыми изощренными способами. Я сделал IDParticle и заставил сканировать по кординате у и у+1, и оно сканировало, но поменять -- Екссепшн... Я просто вызывал Location и prevLocation, нифига. И я прекрассно понимаю, что программа сделанна так, что 2-3 функции добавить и готово... Поможешь?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10424 / 5154 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.05.2016, 11:06
Цитата Сообщение от Phoelix Посмотреть сообщение
КАК ЗАСТАВИТЬ ЭТИ ЧАСТИЦЫ МЕНЯТЬСЯ МЕСТАМИ(Вода и песок)
Здесь есть исходник, с тонущим песком: https://www.cyberforum.ru/blog... g3835.html

И делается это легко:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        /// <summary>
        /// Событие соударения
        /// </summary>
        public virtual void OnCollision(Sandbox sb, Particle other)
        {
            if (other.Mass < Mass)//меняем местами, если столкнулись с более тяжелой частицей
            {
                var loc = other.Location;
                other.Location = Location;
                Location = loc;
            }
            else
                //отскок в сторону
                Velocity = new PointF(FastRnd.Next(), 0);
        }
1
 Аватар для Phoelix
0 / 0 / 1
Регистрация: 16.11.2015
Сообщений: 11
30.05.2016, 12:19  [ТС]
Элементарно! Спасибо!..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2016, 12:19
Помогаю со студенческими работами здесь

обекты в Open Gl
подскажыте как сделать здание(дом) в open gl,зарание спс)

3D обекты в Call of Duty(R) 4 - Modern Warfare(TM) ?!
С помощью какой программы создовались 3D обекты в Call of Duty(R) 4 - Modern Warfare(TM) ?! А также: -реализация физики: создание...

Пузырьковая сортировка ArrayList содержащего обекты класа
Подскажите как отсортировать ArrayList содержащего обекты класа, используя пузырьковую сортировку? import java.io.BufferedReader; ...

Как объединить пиксели?
Добрый день, у меня есть один фон, для всех картинок, на этот фон я вставляю картинки в общей сложности их будет 23. Все картинки...

Как изменить или как сдвигнуть форму с места на другие пиксели
посмотрите здесь как созданную форму сдвинут на другие места на кнопку сдвиг код надо


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru