Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
1

Не правильно перерисовывается "уровень". Вообще с отрисовкой и обновлением картинки беда.

01.01.2011, 21:19. Показов 1182. Ответов 6
Метки нет (Все метки)

Решил впервые в жизни попробовать написать какую нибудь маленькую игрушку на Windows Forms. Да вот уже столкнулся с проблемой отрисовки уровня. В начале после загрузки вообще не отрисовывается, только если форму занести за экран и обратно, то уровень отрисуется и то не полностью. Помогите разобраться в чём проблема? Проект VS 2010 - WindowsForms.

Лучше смотреть проект, так как это код рисовальщика уровня, который находится в классе Level в качестве поля:
Код рисовальщика уровня (клик, чтобы развернуть - это не ссылка)
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using WinFormsMiniGame.Objects;
 
namespace WinFormsMiniGame
{
    public class LevelPainter
    {
        Graphics gr;
        BufferedGraphics bufferGraphics;
        BufferedGraphicsContext bufferGraphicsContext;
        int pictureWidth;
        int pictureHeight;
        List<Block> blocks;
        TextureKit textureKit;
 
        public LevelPainter(IntPtr handle, int pictureWidth, int pictureHeight, List<Block> blocks, TextureKit textureKit)
        {
            bufferGraphicsContext = new BufferedGraphicsContext();
            bufferGraphicsContext = BufferedGraphicsManager.Current;
            this.blocks = blocks;
            this.pictureWidth = pictureWidth;
            this.pictureHeight = pictureHeight;
            this.textureKit = textureKit;
 
            gr = Graphics.FromHwnd(handle);
            //выставляем размер буфера
            bufferGraphicsContext.MaximumBuffer = new Size(pictureWidth, pictureHeight);
            bufferGraphics = bufferGraphicsContext.Allocate(gr,
                 new Rectangle(0, 0, pictureWidth, pictureHeight)); //создаём буфер
        }
 
        /// <summary>
        /// Отрисовываем всё в буфере
        /// </summary>
        public void DrawToBuffer()
        {   
            Rectangle rect = new Rectangle(0, 0, pictureWidth, pictureHeight);
            for (int i = 0; i < blocks.Count; i++)
            {
                bufferGraphics.Graphics.DrawImage(textureKit.Textures[blocks[i].TextureNumber], blocks[i].RectBlock.X,
                    blocks[i].RectBlock.Y, rect, GraphicsUnit.Pixel);
            }
 
            bufferGraphics.Render();
        }
    }
}
Вложения
Тип файла: rar WinFormsMiniGame.rar (33.1 Кб, 20 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.01.2011, 21:19
Ответы с готовыми решениями:

Уровень для игры "Парные картинки"
привет всем! Сделал игру, парные картинки(надо угадать 2 одинаковые картинки и они исчезнут), но...

Вывести на экран фразу "Мне k лет" правильно заменяя слово "лет" на "год" или "года"
Дано целое k. Вывести на экран фразу &quot;Мне k лет&quot; правильно заменяя слово &quot;лет&quot; на &quot;год&quot; или...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания английских букв и...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

6
637 / 498 / 77
Регистрация: 28.07.2010
Сообщений: 895
01.01.2011, 23:22 2
Да уж... Уровень рендериться "сверх быстро". Есть одно замечание по этому куску кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics gr = Graphics.FromHwnd(this.pictBoxLevel.Handle);
            gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
            for (int i = 0; i < level.blocks.Count; i++)
            {
                gr.DrawImage(textureKit.Textures[level.blocks[i].TextureNumber], level.blocks[i].RectBlock.X,
                    level.blocks[i].RectBlock.Y, new Rectangle(0, 0, level.width, level.height),
                    GraphicsUnit.Pixel);
            }
        }
Лучше написать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(level.width, level.height);
            Graphics gr = Graphics.FromImage(bmp);
            gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            for (int i = 0; i < level.blocks.Count; i++)
            {
                gr.DrawImage(textureKit.Textures[level.blocks[i].TextureNumber], level.blocks[i].RectBlock.X,
                    level.blocks[i].RectBlock.Y, new Rectangle(0, 0, level.width, level.height),
                    GraphicsUnit.Pixel);
            }
            pictBoxLevel.Image = bmp;
        }
Это пока все что я могу сказать.
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
01.01.2011, 23:51  [ТС] 3
Вообще это был тестовый кусок кода. Уровень рендерится в
C#
1
2
3
4
5
        private void pictBoxLevel_Paint(object sender, PaintEventArgs e) //аналог Draw()
        {
            if (gameState == GameState.GameLevel)
                level.Draw();
        }
А так я рисую впринципе аналогичным образом в буфере. Надо было всё-таки удалить этот кусок кода. Народ не смотрите этот (private void создатьToolStripMenuItem_Click(object sender, EventArgs e)) метод. Смотрите то, что я выше написал.

Добавлено через 18 минут
Если даже сделать так:
C#
1
2
3
4
5
6
7
8
9
10
        private void pictBoxLevel_Paint(object sender, PaintEventArgs e) //аналог Draw()
        {
            //if (gameState == GameState.GameLevel)
            //    level.Draw();
        }
 
        private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
              level.Draw();
        }
И попробовать нажатием по кнопке "Создать", результат тот-же, что и предложил Alex Sabaka. Вроде даже быстрее.
0
637 / 498 / 77
Регистрация: 28.07.2010
Сообщений: 895
02.01.2011, 00:54 4
Если вам интересно, то вот сырой проект дизайнера уровней. Посмотрите как там рисуются уровни.
Вложения
Тип файла: 7z SimplyLevelDesigner.7z (42.6 Кб, 17 просмотров)
1
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
02.01.2011, 01:14  [ТС] 5
Офигенно! =)
Надо будет хорошенько всё переписать, а то я там намудрил. Просто сначала в XNA игру делать пытался. Потом вдруг надумал сделать как раз дизайнер уровней на формах, так как там есть кнопки, менюшки и т.д. Свои писать на XNA не охота.

Но всё равно, попробую сделать с отрисовкой в буфере так-же.

Добавлено через 2 минуты
Кстати, что делает метод Clamp? Я что-то смотрел, смотрел и не особо въехал...
0
637 / 498 / 77
Регистрация: 28.07.2010
Сообщений: 895
02.01.2011, 01:20 6
Этот метод из XNA, MathHelper. Он "обрезает" значение входной переменной value та что если она меньше min, то value = min; а если она больше max, то value = max.
0
637 / 498 / 77
Регистрация: 28.07.2010
Сообщений: 895
03.01.2011, 01:40 7
Немного допилил редактор. Теперь можно поиграть на сотворенной карте.
P.S. В игре используется "вид сверху"
Вложения
Тип файла: 7z SimplyLevelDesigner.7z (52.1 Кб, 19 просмотров)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2011, 01:40
Помогаю со студенческими работами здесь

Получить значение из {"text1":"val1","text2":"val2","text3":{"text":"val"}}
Есть такая строка var my = '{&quot;text1&quot;:&quot;val1&quot;,&quot;text2&quot;:&quot;val2&quot;,&quot;text3&quot;:{&quot;text&quot;:&quot;val&quot;}}'; Как из...

Как правильно написать формулу учёта "0" "пустоты" и "1"
Есть формула {=И(H4:K4=0;H4:K4&lt;&gt;&quot;&quot;;O4:R4=0;O4:R4&lt;&gt;&quot;&quot;)} - которая в ячейках H4:K4, O4:R4 - выбирает...

Как найти размер текста для точек "480px", "768px", да и вообще для любой произвольной точки
Приветствую всех. Думаю суть моего глупого(?) вопроса ясна из картинки. Но поясню: занимаюсь...

Добавление Картинки в БД из PictureBox. Ошибка "не удается преобразовать из "System.Drawing.Image" в byte[]"
Я понимаю что надо преобразовать, но я не знаю как. Код добавления. Ошибка на...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru