Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
16 / 9 / 1
Регистрация: 16.11.2021
Сообщений: 115
Записей в блоге: 3

Анимация спрайта. Не исчезают отработанные картинки в pictureBox1

13.03.2023, 18:28. Показов 535. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Пытаюсь сделать анимацию картинки, при правильном действии, картинка будет выскакивать хвалить и исчезать.
То есть это 30 спрайтов где персонаж увеличивается и уменьшается. И идея в том чтобы их включать поочередно.
Кое-как добился чтобы она нормально анимировалась, но появился баг, с очисткой старых кадров, или не знаю даже как это назвать. Сначала был просто метод.
Вычитал что это баг формы, и надо в другом потоке это делать, запустил метод в другом потоке, все равно такая же беда.

Название: Безымянsный.png
Просмотров: 72

Размер: 20.9 Кб



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
using System.Net.NetworkInformation;
using System.Windows.Forms;
 
namespace Sprite
{
    public partial class Form1 : Form
    {
        Graphics g;     //  графический объект
        readonly Bitmap buf;     //  буфер 
        int stage = 0;      // индекс чередующегося кадра
        int x = 0, y = 0;   // координаты шара (левого верхнего угла квадрата)
 
        public Form1()
        {
            InitializeComponent();
 
            // Новый экземпляр класса Bitmap c заданным размером
            buf = new Bitmap(pictureBox1.Width, pictureBox1.Height);
 
            // Создает новый графический объект из указанного рисунка
            g = Graphics.FromImage(buf);
 
            // перекраска фона тут было белый цвет, в скобках, я сделал прозрачный
            SolidBrush bf = new SolidBrush(Color.Transparent);
            g.FillRectangle(bf, 0, 0, pictureBox1.Width, pictureBox1.Height);
 
        }
 
        private  void button1_Click(object sender, EventArgs e)
        {
            stage = 0;
            timer1.Enabled = true;
        }
        public void AngryPigAppears()
        {
            imageList1.Draw(g, new Point(x, y), stage);
           
            pictureBox1.Image = buf;
           
            stage++;
           
            if (stage == 27)
            {
                timer1.Enabled = false;
                return;
            }
        }
 
        private async void timer1_Tick(object sender, EventArgs e)
        {
            await Task.Run(() => AngryPigAppears());
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2023, 18:28
Ответы с готовыми решениями:

При нажатии мышки, не отпуская, переносить картинки, которые находятся в PictureBox1 по PictureBox1
Здравствуйте,есть проблема. На форме присутствует pictureBox1,а в свою очередь в pictureBox1 размещено n-ое количество других...

ТАЙЛовские картинки в PictureBox1
Можно ли в PictureBix1 отобразить часть тайловской картинки, к примеру если тайловская картинка состоит из 20 клеток, 5 по ширине и 4 по...

анимация спрайта
Доброго времени суток. Нужно анимировать спрайт, в нем 6 кадров всего, но не знаю как это сделать. Буду рад как готовому коду, так и...

2
16 / 9 / 1
Регистрация: 16.11.2021
Сообщений: 115
Записей в блоге: 3
14.03.2023, 02:03  [ТС]
Нашел в документации работает.
Но в упор не врубаюсь как это все запускается?
И как это прикрутить к кнопке или другому событию. ЧТобы анимация включалась только при возникновении события.

Кликните здесь для просмотра всего текста
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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //button1.Click += (s, e) => 
        }
 
 
        //Create a Bitmpap Object.
        Bitmap animatedImage = new Bitmap("1.gif");
        bool currentlyAnimating = false;
 
        //This method begins the animation.
        public void AnimateImage()
        {
            if (!currentlyAnimating)
            {
 
                //Begin the animation only once.
                ImageAnimator.Animate(animatedImage, new EventHandler(this.OnFrameChanged));
                currentlyAnimating = true;
            }
        }
 
        private void OnFrameChanged(object o, EventArgs e)
        {
 
            //Force a call to the Paint event handler.
            this.Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
 
            //Begin the animation.
            AnimateImage();
 
            //Get the next frame ready for rendering.
            ImageAnimator.UpdateFrames();
 
            //Draw the next frame in the animation.
            e.Graphics.DrawImage(this.animatedImage, new Point(0, 0));
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
        }
    }



Получалось засунуть в кнопку вот это:
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
        {
            currentlyAnimating = true;
        }
Тогда работает, но все равно непонятно, как и откуда оно запускается.

Добавлено через 5 часов 6 минут
Какой ужас!!! Зачем вообще нужны эти АниматыИмаге и ИмагеДравы с Поинтами...день убил пытаясь разобраться в этом кошмаре!!!
И это был отличный повод возненавидеть виндовс форм!

В итоге закончилось все вот этим. Работает, надежно просто и не глючит вообще.
Наверное надо в многопотоке это делать, и еще чего-то. Не знаю. Работает и Слава Богу.

Таймер надо под каждую гифку настраивать, чтобы как гифка проиграла 1 раз, и таймер ее выключал.

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
public partial class Form1 : Form
    {
        public int timerCounter = 0;
        public Form1()
        {
            InitializeComponent();
            AnimationOF();
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            timerCounter = 0;
            timer1.Enabled = true;
            timer1.Start();
            AnimationON();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            timerCounter++;
            if (timerCounter == 9)
            {
                timer1.Stop();
                timer1.Enabled = false;
                AnimationOF();
            }
        }
 
 
        public void AnimationON()
        {
            pictureBox1.Enabled = true;
            pictureBox1.Show();
        }
 
        public void AnimationOF()
        {
            pictureBox1.Enabled = false;
            pictureBox1.Hide();
        }
    }
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
14.03.2023, 09:58
Цитата Сообщение от Leshakk Посмотреть сообщение
И это был отличный повод возненавидеть виндовс форм!
Ну и зря. Всё становится на места если держать в голове то, что любое обновление UI WinForms работает в одном потоке.
1. По коду всё просто, надо было так вызывать
C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
{
   //Begin the animation.
   AnimateImage();
}
2. При запуске задачи в Task (см. первый пост) также надо понимать, что задача может быть выполнена в другом потоке. Следовательно при обновлении UI надо использовать Invoke. Вот интересная статья по поводу обновления UI из задачи и/или фонового потока.
3. Если хочется сделать полностью независимую анимацию, то можно прибегнуть к запуску анимации в форме запущенной в своём потоке, но всё равно придётся решать задачу межпотокового взаимодействия.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2023, 09:58
Помогаю со студенческими работами здесь

Анимация спрайта
Есть такая проблема, только начал изучать ООП и C# делаю свою игру на Unity, написал скрипт для анимации пульсирующая...

Анимация спрайта
Помогите чем могете?(Хочу реализовать анимированное движение персонажа, т.е при нажатии например клавиши Left происходила покадровая смена...

Как переключать картинки из ресурсов в pictureBox1 с помощью одной button?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Спрайтовая анимация 3 объекта 3 спрайта
Подскажет кто с решением? нужен код на спрайтовую анимацию с 3мя объектами

Pygame: анимация удаления спрайта
Всем добрый день! Возник один вопрос в ходе написания игры. Надо сделать анимацию удаления спрайта. Суть в том, что этот спрайт должен...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru