Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/24: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
1

Мерцание при перемещение картинки в PictureBox по таймеру

04.02.2012, 14:03. Просмотров 4595. Ответов 9
Метки нет (Все метки)

Добрый день.
У меня проблема мерцания при перемещение картинки в PictureBox по таймеру. Пробовал много чего. И двойную буферизацию вертел как только можно....Подскажите.
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
namespace BattleTest
{
    public partial class Form1 : Form
    {
        Timer time = new Timer();
        public Form1()
        {
            InitializeComponent();
            time.Interval = 10;
            time.Tick += new EventHandler(Tfire_Tick);
}
 bool OnFire = false;
 
        private void button1_Click(object sender, EventArgs e)
        {
           /* Image img = Image.FromFile("fire.png");
            Graphics gr = pictureBox1.CreateGraphics();
            gr.DrawImage(img, 370, 0, 70, 70);*/
            OnFire = true;
            time.Start();
        }
        int y = -20;
        private void Tfire_Tick(object sender, EventArgs e)
        {
            Image img = Image.FromFile("fire.png");
            Graphics gr = pictureBox1.CreateGraphics();
            y = y + 2;
            if (OnFire == true)
            {
                gr.DrawImage(img, 370, y, 70, 70);
            }
            //Invalidate();
           pictureBox1.Invalidate();
        }
    }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2012, 14:03
Ответы с готовыми решениями:

Смена картинки в PictureBox по таймеру
Не нашел нормального решения также и ответа(Поисковиками) Собственно как...

Перемещение курсором картинки в Picturebox
Собственно вопросик небольшой,но в программе бы меня порадовал бы.Не потскажете...

Перемещение курсором картинки из проводника в pictureBox
Доброго времени суток, уважаемые форумчане. Разработкой на C# занимаюсь...

Как устранить мерцание при перерисовке PictureBox?
Привет. Рисую на Bitmap, а потом PictureBox'у его присваиваю. Вопрос как убрать...

Ошибка при добавлении картинки в PictureBox
Во общем делаю визуальное наблюдения за другой программой. Решил сделать через...

9
Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
04.02.2012, 16:06 2
Я в свое время пытался сделать без мерцания...нашел один кодик, но во-первых его сейчас не найду,
во -вторых при использовании пикчербокса полностью избежать мерцания скорее всего не сможешь(ИМХО) Советую разбираться с WPF или XNA(для 2D графики очень удобный и легко понимаемый инструмент)
1
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.02.2012, 16:25  [ТС] 3
Димон_, я с wpf знаком, но form больше люблю (работать с сетью умею там). А если не в боксе, то в чем?
0
Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
04.02.2012, 17:05 4
Не в чом. Используй XNA - он может использоваться совместно с WinForms.
Как вобщем-то и WPF. Поставь оптимизированный под графику элемент из другой технологии и юзай WinForms спокойно.
0
Dzhej-Dzhej
Заблокирован
04.02.2012, 17:18 5
Костяныч, Сделайте "глобальные" переменные для отрисовки, в таймере изменяйте их значения(все формулы расчетов вычисляйте здесь), и последней строкой в OnTimer поставьте pictureBox1.Invalidate();
В pictureBox1.OnPaint просто отрисовывайте на основе "глобальных" переменных.

Есть еще Invalidate(прямоугольник для обновления);

Добавлено через 3 минуты
Цитата Сообщение от Костяныч Посмотреть сообщение
C#
1
2
3
4
private void Tfire_Tick(object sender, EventArgs e)
* * * * {
* * * * * * Image img = Image.FromFile("fire.png");
* * * * * * Graphics gr = pictureBox1.CreateGraphics();
Жостко. Зачем постоянно файл открывать и графикс для пикчербокса создавать.
2
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.02.2012, 17:34  [ТС] 6
Dzhej-Dzhej, глобальные переменные т.е. графикс вынести и объявление картинки а gr.DrawImage(img, 370, y, 70, 70); оставить?
0
Dzhej-Dzhej
Заблокирован
04.02.2012, 17:51 7
C#
1
2
3
4
5
6
        int x = 0, y = 0;//изменяются таймером
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            //здесь прорисовка всякая, типа:
            e.Graphics.DrawLine(new pen(Brushes.Red), new Rectangle(x, y, 100, 100));
        }
Цитата Сообщение от Костяныч Посмотреть сообщение
глобальные переменные т.е. графикс вынести
он уже будет не нужен

а загрузку картинок сделайте в Form_Load или в конструкторе формы.

Добавлено через 3 минуты
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
он уже будет не нужен
т.к. в pictureBox1_Paint e.Graphics таковым и является.
1
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
04.02.2012, 18:06  [ТС] 8
Спасибо большое, теперь все ок. Планирую отдельные классы для текстур создать типа fire. Игру делаю, этот фаер будит лететь в соперника, когда долетит проверит нет ли у второго щита, если нет то отнимаем жизнь и.т.д. все сложно и интересно)))
1
temich-92
c#
89 / 89 / 27
Регистрация: 25.03.2011
Сообщений: 290
04.02.2012, 18:18 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        Pen pen;
 
        Panel panel;
        Timer timer;
 
        bool isRunningRight;
        Rectangle rect;
 
        Graphics graphics;
        BufferedGraphicsContext bufferedGraphicsContext;
        BufferedGraphics bufferedGraphics;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            ClientSize = new Size(400, 400);
            StartPosition = FormStartPosition.CenterScreen;
 
            panel = new Panel()
            {
                Location = new Point(5, 5),
                Size = new Size(ClientSize.Width - 10, ClientSize.Height - 10)
            };
            Controls.Add(panel);
 
            InitializeGraphics();
 
            timer = new Timer();
            timer.Interval = 10;
            timer.Tick += new EventHandler(timer_Tick);
 
            pen = new Pen(Color.Red);
            rect = new Rectangle(panel.Width / 2, panel.Height / 2, 40, 40);
 
            timer.Start();
        }
 
        private void InitializeGraphics()
        {
            graphics = panel.CreateGraphics();
            bufferedGraphicsContext = new BufferedGraphicsContext();
            bufferedGraphics = bufferedGraphicsContext.Allocate(graphics, new Rectangle(0, 0, panel.Width, panel.Height));
        }
 
        void timer_Tick(object sender, EventArgs e)
        {
            Run();
            DrawToBuffer();
        }
 
        void Run()
        {
            int dx = 0;
            if (isRunningRight)
                dx = 1;
            else
                dx = -1;
 
            if (rect.Right > panel.Width)
                isRunningRight = false;
            if (rect.Left < 0)
                isRunningRight = true;
 
            rect.Offset(dx, 0);
        }
 
        private void DrawToBuffer()
        {
            bufferedGraphics.Graphics.Clear(BackColor);
 
            bufferedGraphics.Graphics.DrawEllipse(pen, rect);
 
            bufferedGraphics.Render();
        }
    }
}
вот немигающий код
2
Костяныч
17 / 17 / 4
Регистрация: 31.10.2010
Сообщений: 1,238
Записей в блоге: 2
05.02.2012, 09:54  [ТС] 10
Ёмаё опять проблема. Останавливается на строчке Image img = Image.FromFile("a.jpg"); и пишет "Недостаточно места"
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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Timer timer = new Timer();
            fire.Initialize();
            timer.Tick += new EventHandler(Tfire_Tick);
            timer.Interval = 100;
            timer.Start();
            User1Position = user1.NowPosition;
        }
 
        User1 user1 = new User1();
        int User1Position;
        Fire fire = new Fire();
        Image PicFire = Image.FromFile("fire.png");
        public bool OnFire = false;
        public int FirePosition;
        public int yFire=500;
        Image img = Image.FromFile("a.jpg");
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(img, User1Position, 300, 200, 200);
            if (OnFire == true)
            {
                g.DrawImage(PicFire, FirePosition, yFire, 70, 70);
            }
        }
        private void Tfire_Tick(object sender, EventArgs e)
        {
            User1Position = user1.NowPosition;
            if (OnFire == true)
            {
                yFire = yFire - 20;
            }
            pictureBox1.Invalidate();
        }
 
 
        private void button3_Click(object sender, EventArgs e)
        {
            fire.GoFire(user1.NowPosition);
        }
 
    }
Класс Fire:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Fire
    {
        Form1 form;
        int y = 20;
        
        int StartPosition;
 
        public void Initialize()
        {
            form = new Form1();
        }
 
        public void GoFire(int Position)
        {
            form.FirePosition = Position;
            form.OnFire=true;
 
        }
    }
Добавлено через 1 час 18 минут
Извините, я все исправил. Перегрузка при объявлении классов была.
0
05.02.2012, 09:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2012, 09:54

В pictureBox менять картинки при нажатии на кнопку
Здравствуйте подскажите пожалуйста как сделать с помощью кнопки чтобы менялось...

Изменение картинки в PictureBox при наведении курсора
При наведении на picturebox фон изменяется на другую картинку. Как это сделать?

Имя картинки в label при загрузке в pictureBox
Привет, при нажатии кнопки button1 открывается диалог. Есть возможность...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru