RPGEditor помощь при создании редактора

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

RPGEditor помощь при создании редактора

Сообщение SlaDER » 31.12.2007 (Пн) 15:26

Привет всем! С Наступающим! Делаю небольшую rpg на j2me, а редактор решил сделать в VB.NET. То что уже получилось в аттаче.

Но есть проблемы, у меня карта стирается, т.к. я её просто рисую при помощи GDI+, пробовал все время перерисовывать получается плохо.
Прочитал, что нужно рисовать "в память", но там в примере все по другому.

+ Хотелось бы узнать про слои, как их можно реализовать в редакторе.
Вложения
RPGEditor.rar
(46.45 Кб) Скачиваний: 129

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 31.12.2007 (Пн) 17:10

пробовал все время перерисовывать получается плохо.
Обьясни, что ты подразумеваешь под 'плохо'.

Прочитал, что нужно рисовать "в память", но там в примере все по другому
Речь идет о рисовании в Bitmap. Этот битмэп присваиваешь свойству панели "BackgroundImage". Обьект Graphics создаешь не из панели, а из битмэпа. При этом, нужда в событии Paint отпадает.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 01.01.2008 (Вт) 10:12

Обьясни, что ты подразумеваешь под 'плохо'.

Ну все маргает, вот у меня там есть метод в котором сетка перерисовывается все время, если я там еще и тайлы добавляю, то получается моргание.

Про BitMap примерно понял спасибо!

+ А может мне слои через PictureBox реализовать, ну т.е. 1 PB = 1 слой в них и прозрачность можно выбирать, как это реально?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.01.2008 (Вт) 12:20

Обьясни подробнее, зачем нужны слои и прозрачность в них.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4161
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 01.01.2008 (Вт) 14:43

SlaDER
Может это подойдет:
http://bbs.vbstreets.ru/viewtopic.php?t=32517

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 01.01.2008 (Вт) 16:05

Nord777 писал(а):Обьясни подробнее, зачем нужны слои и прозрачность в них.


Например:
1- слой это просто тайлы карты
2- персонаж, враги, NPC
3- Специальные объекты

А прозрачность чтобы можно было смотреть на несколько слоев.

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 01.01.2008 (Вт) 16:07

Mikle я посмотрю спасибо!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.01.2008 (Вт) 17:10

Например:
1- слой это просто тайлы карты
2- персонаж, враги, NPC
3- Специальные объекты
Совсем необязательно (и даже вредно) городить для этого полупрозрачные пбоксы.

Пример простейшей реализации.
Создаёшь три массива.
При размере карты 10х10
1) MapObjects(9,9) - здесь будут храниться идентификаторы обьектов карты (тайлы карты )

2) PersonObjects(9,9) - здесь будут храниться идентификаторы персонажей (персонаж, враги, NPC )

3) SpecialObjects(9,9) - здесь будут храниться идентификаторы специальных обьектов.

При отрисовке определенного квадрата на карте (к примеру квадрата 5-2), сначала будет отрисовываться картинка, id которой содержится в массиве MapObjects(5,2).
Затем из массива PersonObjects(5,2) (если он не пуст. т.е к примеру, если его значение не равно -1).
Ну и затем SpecialObjects(5,2)

Это вкратце. А вообще советую почитать литературу по созданию 2D игр. Там много интересных приёмов.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 02.01.2008 (Ср) 11:11

Хоршо спс!

Вот тот пример:

Код: Выделить всё

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim myBitmap As New Drawing.Bitmap(32, 32)
  Dim myGraphics As Drawing.Graphics = Graphics.FromImage(myBitmap)
  'прямая линия начиная с 15 пикселя с верху до левого угла размером 32 пикселя
  'черного цвета, толщиной 2 пикселя
  Dim myPen As New System.Drawing.Pen(Color.Black, 2)
  myGraphics.DrawLine(myPen, 0, 15, 32, 15)
  'линия синего цвета, проходящая по-диоганали с верхнего
  'левого угла в нижний правый размером 32 пискселя
  myGraphics.DrawLine(Pens.Blue, 0, 0, 32, 32)
  'линяя красного цвета, проходящая по-диоганали с нижнего
  'левого угла в верхний правый угол размером 32 пискселя
  myGraphics.DrawLine(Pens.Red, 0, 32, 32, 0)
  'круг зеленого цвета
  myGraphics.DrawEllipse(Pens.DarkGreen, 0, 0, 32, 32)
  'квадрат цветом Aqua
  myGraphics.DrawRectangle(Pens.Aqua, 2, 2, 28, 28)
  'вставляем данные в Form
  Me.BackgroundImage = myBitmap
End Sub


Nord777 ты про это говоирл? Я что-то никак не соображу, как его к редактору приделать, если можно то хотя бы "на пальцах расскажи".

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.01.2008 (Ср) 23:22

Я не могу понять, что именно тебе непонятно. Но возникло подозрение, что непонятно всё.
Проблемы с созданием битмэпа нужных размеров?
Проблемы с созданим обьекта графикс из созданного битмэпа?
Проблемы с массивами?
Проблемы с самой концепцией?

http://www.pmg.org.ru/galaxy2d/index.html
http://www.pmg.org.ru/galaxy2d/tilefaq.htm
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 03.01.2008 (Чт) 14:04

Nord777 писал(а):Я не могу понять, что именно тебе непонятно. Но возникло подозрение, что непонятно всё.
Проблемы с созданием битмэпа нужных размеров?
Проблемы с созданим обьекта графикс из созданного битмэпа?
Проблемы с массивами?
Проблемы с самой концепцией?

http://www.pmg.org.ru/galaxy2d/index.html
http://www.pmg.org.ru/galaxy2d/tilefaq.htm


С самой концепцией. Сейчас у меня все происходит так:

Есть панель panelMap, при событии panelMap_Paint отрисовывается сетка.

При panelMap_MouseClick получаю g = panelMap.CreateGraphics()

А как делать все это с BitMap?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.01.2008 (Чт) 17:26

А как делать все это с BitMap


bmp = new Bitmap(W,H)
panel1.BackgroundImage=bmp
G = Graphics.FromImage(bmp)
======================
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 03.01.2008 (Чт) 20:09

Код: Выделить всё
    Private Sub panelMap_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles panelMap.MouseClick
        Dim xMap, yMap As Integer
        Dim img As Image
        xMap = Int(e.X / cellSize)
        yMap = Int(e.Y / cellSize)

        'g = panelMap.CreateGraphics()
        g = Graphics.FromImage(myBitmap)

        Try
            img = Image.FromFile(Application.StartupPath + "\images\" + nameCollectionT + "\" + val)
            g.DrawImage(img, xMap * cellSize, yMap * cellSize)
            field(xMap, yMap) = Replace(val, ".png", "")
        Catch ex As Exception
            MsgBox("Не выбран тайл!", MsgBoxStyle.Critical, "Ошибка!")
        End Try
        panelMap.Refresh()
    End Sub


Вообщем сделал по описанию, но приходится в конце panelMap.Refresh() делать, так как не выдно что нарисовал и все обновляется и моргает. Может есть другой способ?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.01.2008 (Чт) 22:53

Вообщем сделал по описанию, но приходится в конце panelMap.Refresh() делать, так как не выдно что нарисовал и все обновляется и моргает. Может есть другой способ?

Другой способ не поможет. С таким подходом моргать будет всё и всегда. Начни уже оптимизировать. Новый год закончился, включи мозг. ))
Для начала создай свой класс, унаследованный от панели и включи двойную буферизацию.
Код: Выделить всё
Public Class myPanel
  Inherits Panel

  Private Sub myPanel_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated
    Me.DoubleBuffered = True
  End Sub
End Class


Код: Выделить всё
img = Image.FromFile(Application.StartupPath + "\images\" + nameCollectionT + "\" + val)
Не надо при каждом клике или отрисовке считывать картинку с диска, загрузи заранее.

Код: Выделить всё
field(xMap, yMap) = Replace(val, ".png", "")
Эту строку вообще не понял.

Код: Выделить всё
panelMap.Refresh()
зацени метод
Public Sub Invalidate(ByVal rc As System.Drawing.Rectangle)
Member of: System.Windows.Forms.Control

И это не прибегая к жестокой оптимизации.....
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 04.01.2008 (Пт) 18:51

Вот что получилось с Invalidate

Код: Выделить всё
Private Sub panelMap_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles panelMap.MouseClick
        Dim rc As Drawing.Rectangle
        Dim xMap, yMap As Integer
        Dim img As Image
        xMap = Int(e.X / cellSize)
        yMap = Int(e.Y / cellSize)

        g = Graphics.FromImage(myBitmap)

        rc.Size = New System.Drawing.Size(cellSize, cellSize)
        rc.Location = New System.Drawing.Point(xMap * cellSize, yMap * cellSize)

        Try
            img = Image.FromFile(Application.StartupPath + "\images\" + nameCollectionT + "\" + val)
            g.DrawImage(img, xMap * cellSize, yMap * cellSize)
            field(xMap, yMap) = Replace(val, ".png", "")
        Catch ex As Exception
            MsgBox("Не выбран тайл!", MsgBoxStyle.Critical, "Ошибка!")
        End Try
        panelMap.Invalidate(rc)
    End Sub


Я так понимаю что это метод для обновления определенной области, т.е. не весь элемент управления, а его часть.

Можно даже 2-ную буффиризацию не использовать с Invalidate, все отображается отлично.

Этот кусок для того, чтобы заносить значение в массив. У каждой картинки есть имя 1.png, 2.png которое и является ID, которое я заношу в массив. А здесь я просто убираю расширении .png
Код: Выделить всё
field(xMap, yMap) = Replace(val, ".png", "")


Согласен что это не самое лучшее решение.

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 04.01.2008 (Пт) 19:25

Возник еще один вопрос про Scroll. Если я делаю размер карты который не помещается в размеры панели.

У меня есть идея нужно при создании карты смотреть помещается ли она в размер панели, если нет то включить scroll в зависимости от размера карты.

Есть свойства AutoScroll, AutoScrollMargin, AutoScrollMinSize, как мне задать размеры Scroll?

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Сообщение 1Steps » 05.01.2008 (Сб) 2:23

размера карты-размер панели=размеры Scroll
Удалена за ненадобностью.

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 05.01.2008 (Сб) 13:58

Не ну а как задавать то размеры самого Scroll?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron