Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
8 / 8 / 2
Регистрация: 05.08.2011
Сообщений: 18
1
.NET 4.x

Проблема с рисованием.

05.08.2011, 22:35. Просмотров 759. Ответов 8
Метки нет (Все метки)


Здравствуйте. Немного предыстории: пару недель назад я решил начать изучать с#, чтобы можно было отслеживать "прогресс" и при этом было бы интересно, решил сделать старые добрые танчики из денди.
Теперь ближе к сути. Когда танк катается один - всё нормально, если отрисовывать вдобавок снаряд, то заметно сильное торможение (движение рисуется через каждый пиксель). Вопрос собственно в том, как решить данную проблему? Я перепробовал несколько "способов" рисования, и через Bitmap, который присваиваем в image, и добавление делегатов в обработчик события onPaint (этот вариант был последним, поэтому именно его вы увидите), но результат был тот же(, вероятнее всего ошибка в самой структуре программы.
В коде мало комментариев, возможно бесполезных и наверняка есть куча кривых и не оптимальных решений, так что буду благодарен абсолютно любым советам и критике.

Выкладывайте код на форум
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2011, 22:35
Ответы с готовыми решениями:

Трудности с рисованием в Canvas
Рисую в Canvas`e квадрат и все вроде бы нормально, но когда я его перетаскиваю или начинаю вертеть...

Проблема с рисованием
Почему то на форме нет рисунка. Подскажите что не так. using System; using...

Очистка PictureBox перед рисованием очередной фигуры
Подскажите, пожалуйста, как сделать так, чтобы при рисовании одной фигуры, прежняя стиралась ( не...

Реализовать класс "Квадрат" с рисованием через DrawLine
Ребят, нужна помощь! Необходимо создать класс, который будет, при нажатии на кнопку, рисовать...

8
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.08.2011, 22:37 2
Лучший ответ Сообщение было отмечено как решение

Решение

GhostlyAngel, ссылки на файлообменники запрещены правилами форума, выложите проект сюда
3
8 / 8 / 2
Регистрация: 05.08.2011
Сообщений: 18
05.08.2011, 23:15  [ТС] 3
Извините, не внимательно читал правила.
танчики.rar
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2011, 23:28 4
переключись на wpf, там это проще решается. въехать, правда, потребуется, но оно того стоит, и технология никуда не исчезнет, а будет развиваться, так что не зря потратишь время.
1
8 / 8 / 2
Регистрация: 05.08.2011
Сообщений: 18
05.08.2011, 23:32  [ТС] 5
Цитата Сообщение от novi4ok Посмотреть сообщение
переключись на wpf, там это проще решается. въехать, правда, потребуется, но оно того стоит, и технология никуда не исчезнет, а будет развиваться, так что не зря потратишь время.
Если других вариантов нет, то придётся wpf изучить. Спасибо за совет.
0
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
06.08.2011, 00:40 6
Надеюсь, WinForms еще поживут немного до тех пор, пока не исчезнут в никуда)

GhostlyAngel, для пары недель изучения языка - адски круто, по-моему) Кстати, у меня пуля летит вполне нормально; с легкой опаской, но можно попробовать убрать Thread.Sleep(5) в timer1_Elapsed - вдруг поможет. Кроме того, оно там вроде все равно заметной разницы не дает.

Кстати, а что делается вот в этом таймере, и почему он не вызывается при игре на первом уровне?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void tm_Elapsed1(object sender, EventArgs e)
        {
            if (img.CurrentTankCount < img.TankMax)
            {
                using (System.Windows.Forms.Timer t = sender as System.Windows.Forms.Timer)
                {
                    int i = (int)t.Tag;
                    img.Tank[img.CurrentTankCount] = new gTank(fm1.Tank2, 1, img.TankRespawn[i].X, img.TankRespawn[i].Y);
                    img.Tank[img.CurrentTankCount].PrevVector = 2;
                    pictureBox1.Paint += img.Tank[img.CurrentTankCount++].Paint;
                    img.Tank[img.CurrentTankCount].Bullet = new Shot(bullet);
                    pictureBox1.Paint += img.Tank[img.CurrentTankCount].Bullet.Paint;
                    pictureBox1.Invalidate(new Rectangle(img.TankRespawn[i].X, img.TankRespawn[i].Y, 40, 40));
                    pictureBox1.Update();
                }
            }
        }
Потому что при игре на втором уровне у меня здесь вываливается эксепшн на строке с Bullet.
А еще почему-то пуля только одна - так и должно быть? Не играл в танчики, может, это фича такая)

Up. А, я так понял, это для других, пока не существующих танков.
0
8 / 8 / 2
Регистрация: 05.08.2011
Сообщений: 18
06.08.2011, 07:17  [ТС] 7
А еще почему-то пуля только одна - так и должно быть? Не играл в танчики, может, это фича такая)
Да, в танчиках именно так, я решил оставить это как "фичу" танчиков и не усложнять себе жизнь)
Up. А, я так понял, это для других, пока не существующих танков.
Уровень может быть вообще без респаунов танков (пока не придумал зачем такой уровень, но пусть будет), кроме того, респаунов может быть несколько и соответственно таймеров таких будет тоже несколько.
Потому что при игре на втором уровне у меня здесь вываливается эксепшн на строке с Bullet.
Это уже я не долглядел, когда переделывал с помощью делегатов))
Код
pictureBox1.Paint += img.Tank[img.CurrentTankCount++].Paint;
Именно тут ошибка, раньше это было последнее действие в функции, и инкремент успешно увеличивал Count, когда нужно. А сейчас из-за этого функция обращается к танку, которого в массиве ещё нету.
Вот полный код исправленной функции:
Код
        
private void tm_Elapsed1(object sender, EventArgs e)
        {
            if (img.CurrentTankCount < img.TankMax)
            {
                using (System.Windows.Forms.Timer t = sender as System.Windows.Forms.Timer)
                {
                    int i = (int)t.Tag;
                    img.Tank[img.CurrentTankCount] = new gTank(fm1.Tank2, 1, img.TankRespawn[i].X, img.TankRespawn[i].Y);
                    img.Tank[img.CurrentTankCount].PrevVector = 2;
                    pictureBox1.Paint += img.Tank[img.CurrentTankCount].Paint;
                    img.Tank[img.CurrentTankCount].Bullet = new Shot(bullet);
                    pictureBox1.Paint += img.Tank[img.CurrentTankCount++].Bullet.Paint;
                    pictureBox1.Invalidate(new Rectangle(img.TankRespawn[i].X, img.TankRespawn[i].Y, 40, 40));
                    pictureBox1.Update();
                }
            }
        }
Кстати, у меня пуля летит вполне нормально; с легкой опаской, но можно попробовать убрать Thread.Sleep(5)
Возможно у вас более сильный компьютер. Thread.Sleep(5) нужен для того, чтобы после отрисовки движения на 1 пиксель была пауза, если его убрать, компьютер почти мгновенно пройдёт по всем пунктам и никакой плавной анимации не получится, пользователь просто не успеет разглядеть её(
Исправленная версия:
танчики.rar

upd: Кстати, может стоит посмотреть в сторону unsafe кода, он тут каким-нибудь образом ускорит дело?
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.08.2011, 14:10 8
Цитата Сообщение от somethingrotten Посмотреть сообщение
Надеюсь, WinForms еще поживут немного до тех пор, пока не исчезнут в никуда)
не исчезнут. просто применять их удобнее там, где не требуется "наворотов". а если нужны, то wpf для того и существует.
0
Mikant
06.08.2011, 15:17     .NET 4.x Проблема с рисованием.
  #9

Не по теме:

Цитата Сообщение от Maxwe11 Посмотреть сообщение
ссылки на файлообменники запрещены правилами форума, выложите проект сюда
Maxwe11, Almiqui, Петррр, пунткт правил 3.10 гласит "Запрещено давать ссылки на скачивание программ и книг с файлообменников (рапида, депозит и т.п.) и других сайтов (форумов), если есть возможность их скачать с сайтов фирм-производителей."

0
06.08.2011, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2011, 15:17
Привет! Вот еще темы с ответами:

Проблема с рисованием на PictureBox с увеличением
Делаю графический редактор на подобии Paint.net ломаю голову не 1 ин год уже и вот надеюсь получю...

Проблема с рисованием прозрачных текстур в OpenGL
Сначала объявил все параметры: glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); ...

что то не то с рисованием(
Здравствуйте, появился такой вопрос. То есть его не было до того момента пока я не выложил...

Непонятно с рисованием GDI
Рисую матрицу 8х8 в окне. В порядке, обратном шахматному (сменить местами белые и черные диагонали)...


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

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

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