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

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

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

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

Выкладывайте код на форум
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.08.2011, 22:35
Ответы с готовыми решениями:

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

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

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

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

Решение

GhostlyAngel, ссылки на файлообменники запрещены правилами форума, выложите проект сюда
3
9 / 9 / 2
Регистрация: 05.08.2011
Сообщений: 18
05.08.2011, 23:15  [ТС]
Извините, не внимательно читал правила.
танчики.rar
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2011, 23:28
переключись на wpf, там это проще решается. въехать, правда, потребуется, но оно того стоит, и технология никуда не исчезнет, а будет развиваться, так что не зря потратишь время.
1
9 / 9 / 2
Регистрация: 05.08.2011
Сообщений: 18
05.08.2011, 23:32  [ТС]
Цитата Сообщение от novi4ok Посмотреть сообщение
переключись на wpf, там это проще решается. въехать, правда, потребуется, но оно того стоит, и технология никуда не исчезнет, а будет развиваться, так что не зря потратишь время.
Если других вариантов нет, то придётся wpf изучить. Спасибо за совет.
0
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
06.08.2011, 00:40
Надеюсь, 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
9 / 9 / 2
Регистрация: 05.08.2011
Сообщений: 18
06.08.2011, 07:17  [ТС]
А еще почему-то пуля только одна - так и должно быть? Не играл в танчики, может, это фича такая)
Да, в танчиках именно так, я решил оставить это как "фичу" танчиков и не усложнять себе жизнь)
Up. А, я так понял, это для других, пока не существующих танков.
Уровень может быть вообще без респаунов танков (пока не придумал зачем такой уровень, но пусть будет), кроме того, респаунов может быть несколько и соответственно таймеров таких будет тоже несколько.
Потому что при игре на втором уровне у меня здесь вываливается эксепшн на строке с Bullet.
Это уже я не долглядел, когда переделывал с помощью делегатов))
Code
1
pictureBox1.Paint += img.Tank[img.CurrentTankCount++].Paint;
Именно тут ошибка, раньше это было последнее действие в функции, и инкремент успешно увеличивал Count, когда нужно. А сейчас из-за этого функция обращается к танку, которого в массиве ещё нету.
Вот полный код исправленной функции:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        
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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.08.2011, 14:10
Цитата Сообщение от somethingrotten Посмотреть сообщение
Надеюсь, WinForms еще поживут немного до тех пор, пока не исчезнут в никуда)
не исчезнут. просто применять их удобнее там, где не требуется "наворотов". а если нужны, то wpf для того и существует.
0
06.08.2011, 15:17

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2011, 15:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru