2D-карта и объекты

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

2D-карта и объекты

Сообщение Bazilius » 18.08.2009 (Вт) 8:56

Подскажите пожалуйста, каким образом можно организовать хранение объектов на игровой карте и их взаимодействие с окружением. Мне приходит на ум только такая схема:

- карта представляет собой массив, скажем, 10х10 (myMap(9, 9) as Integer);
- каждая ячейка хранит в себе информацию о номере объекта;
- каждый объект относится к какому-то определенному типу, который представлен отдельным классом (т.е. двери – класс Doors, стены – класс Walls и т.д.).

Код: Выделить всё
'Массив объектов
Public myObjects(1023) As Object

'Описание объекта
Type ObjectType
    'Координаты на карте
    X As Single
    Y As Single
   
    'Номер объекта
    Number As Integer
   
    'Основной тип объекта (дверь, стена, т.д.)
    mainType As Integer
End Type
Public mapObject(1023) As ObjectType
   
'Карта
Public myMap(9, 9) As Integer

Public Sub Map_Init()
'Заполняем массив карты данными
    For n = 0 To 1023
        'Берем координаты объекта и вставляем его номер в массив карты
        myMap(mapObject(n).Y, mapObject(n).X) = mapObject(n).Number
       
        'Создаем соотвествующий объект из класса
        Select Case mapObject(n).mainType
            'Допустим объект - дверь
            Case Is = 1
                Set myObjects(n) = New Class1
            'Допустим объект - стена
            Case Is = 2
                Set myObjects(n) = New Class2
        End Select
    Next
   
End Sub

В последствии за каждой ячейкой закреплен объект, с которым мы можем выполнять какие-то действия (допустим это дверь, тогда myObjects(n).Open и т.д.).

Мне кажется, что я сильно мудрю. Есть ли какие-нибудь варианты более простой реализации?
In the grim darkness of the far future, there is only war!

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: 2D-карта и объекты

Сообщение VBTerminator » 18.08.2009 (Вт) 11:10

Размеры карты по осям X и Y известны? Тогда зачем тебе хранить координаты ячейки в массиве, если их можно вычислить?

Вот код попроще:
Код: Выделить всё
Enum CELL_TYPE_ENUM
    cteNothing = 0     'Ничего в ячейке нет
    cteWall = 1     'Стена
    cteDoor = 2     'Дверь
End Enum

Type CellDescribe
    ObjectType As CELL_TYPE_ENUM    'Тип объекта (дверь, стена, т.д.)
    State As Long                      'Состояние объекта (для двери это открыта/закрыта и т. д.)
End Type
Dim Map(99) As CellDescribe              'Наша карта (10 * 10 - 1)

Public Sub Map_Init()
'Заполняем массив карты данными
    For n = 0 To 99

        With  Map(n)
            'Задаём свойства объекта
            Select Case.ObjectType

                Case cteDoor               'Допустим объект - дверь
                    Map(n).State = 1     'Дверь открыта

               Case cteWall               'Допустим объект - стена
                    Map(n).State = 3     'Стена является железной
            End Select
        End With
    Next

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Re: 2D-карта и объекты

Сообщение Bazilius » 18.08.2009 (Вт) 14:35

Размеры карты известны, но это прямоугольник (будет примерно 80х50). Координаты ячейки в массиве служат указателем на объект, который необходимо будет вывести на экран. Принцип примерно следующий: у нас имеется список объектов, которые размещены на карте. При загрузке игры мы «шерстим» этот список и указываем в массиве карты номер объекта. Параллельно каждый из объектов приравнивается к своему классу.
Потом, при отображении карты, мы просто указываем на номер объекта (класса) который хотим отобразить.

Код: Выделить всё
Public Sub Map_Render()

    For y = 0 To 49
        For x = 0 To 79
                myObject(myMap(y, x)).Render
        Next
    Next

End Sub


Мне кажется, что если делать каждый объект через тип, то он будет избыточным, так как у каждого из объектов будут разные свойства. Например, стене не обязательно открываться как двери, или ее не надо поднимать как какой-нибудь предмет. Но все эти действия надо будет указывать в типе.
In the grim darkness of the far future, there is only war!

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: 2D-карта и объекты

Сообщение VBTerminator » 18.08.2009 (Вт) 16:02

Каждый объект уникален в том смысле, что каждый предмет может быть только на одной ячейке и наоборот, и изменив свойство одного предмета должна измениться только одна ячейка, следовательно, объектная переменная для описания предмета ещё более непригодна.

Bazilius писал(а):Мне кажется, что если делать каждый объект через тип, то он будет избыточным, так как у каждого из объектов будут разные свойства.

Все объекты почти однотипны, одной переменной можно выразить однотипные свойства у разных объектов, например, свойство Life у существа может выражать количество жизней, у стены, дерева и т. д. - прочность,..

Bazilius писал(а):Например, стене не обязательно открываться как двери, или ее не надо поднимать как какой-нибудь предмет. Но все эти действия надо будет указывать в типе.


А для чего у тебя поле State? Его ведь можно для каждого объекта использовать по разному, как говорилось выше, например:

Для двери:
0 - взорвана
2 - открыта
1 - закрыта

Для стены:
0 - взорвана
1 - деревянная стена
2 - кирпичная стена
3 - бетонная стена

Для живого существа:
0 - убит
1 - жив-здоров
2 - сражается
3 - горит

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Re: 2D-карта и объекты

Сообщение Bazilius » 18.08.2009 (Вт) 17:55

Доходит потихоньку. Спасибо огромное! :D
In the grim darkness of the far future, there is only war!


Вернуться в Мультимедиа

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

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

    TopList