как правильно взаимодействовать с объектами в играх

Предыдущая тема Следующая тема Перейти вниз

как правильно взаимодействовать с объектами в играх

Сообщение  electrik в Вт Фев 19, 2013 10:46 pm

начну грузить. хорошо писать не научился, будет много.
давно я поднимал этот вопрос в своей голове. года 2 назат вот что накатал- очень плохой исходник, но исправлять ни чего не стал. все компилиться, но сам код нелогичный. на эту тему и поговорим
http://svalka-spb.narod.ru/templates/g.rar
это не игрушка, а всего лишь комната со стеной, оборудованием и раковиной с водой.
что мне надо.
оговорюсь сразу, что я хочу сделать игру для незрячих, соответственно, в нутри компьютера объекты это не картинки, а какие-то условные обозначения, вобщем привязки к экрану нет.

после запуска моего примера, бродите стрелками. на экране будут лишь координаты игрока.
стены обозначены бипом, шаги и остальные звуки нормальные.\
сначала, я думал, проще сделать матрицу, скажем 2000 на 2000, туда понапихать объектов и все.
очень просто, и поиск объектов удобен,. но потом я подумал, а если мне нужен трехмерный объект, например 100000 на 100000 на 10000. какой массив должен быть. можно подгружать, но это не экономично как то. да и чем детальней местность, плавность поворота, тем больше нужна матрица.
а если космос, где вообще парсеками все измеряется...
вот и задумал я на ооп написать все хозяйство.
много теории по этому читал, да и так все знаю, что человек - это объект, который умеет что-то делать (методы) - ходить, бегать, ударяться в предметы,есть. так же он может обладать свойствами, черный, с кривым носом, слепой.
а вот взаимодействие, до сих пор не пойму.
нет, я понимаю, что человек, натолкнувшись на стену, от нее отскочит.
это связано с тем, что если его координаты, пересеклись с координатами стены, стена своей силой его отталкивает
мне не понятно другое, возьмем ту же матрицу, там все просто. я сделал шаг, проверил состояние текущей клетки, или окружающих, выяснил что за объект, если стена, значит через нее не пройти.
теперь ооп, у меня северная стена объект., южная тоже и т.д. а если у меня миллион объектов, что, после каждого шага, мне надо сравнивать свои координаты с миллионом объектов?
короче, я видимо еще не научился абстрагтно мыслить, но вот этот момент с кучей объектов и не понятен.
в моем исходнике сделаны "объекты", оочень с натяжкой они таковые, больше структуры, и там у меня сделано по принципу перебора объектов.
почему я отказался от матриц.
приведу пример:
пусть у нас будет двумерный массив, стена длиной 100 метров, толщина 2 метра.
каждый элемент один метр
представили. а вот как я это представляю в объекте.

Код:

type stone
pointx as integer ' начальная точка оси x
pointz as integer ' начальная точка оси z
sizex as integer ' длина стены
sizez as integer ' толщина стены
end type
естественно, все относительно, оси могутбыть как длинами стен, так и толщинами.
ненравиться мне этот метод с перебором объектов, если это сравнивать с жизнью, нет свободы. все предрешено.
ведь когда я хожу в лабиринт, и сталкиваюсь со 120 стеной, я же незнаю, что она 120-тая.
вслучае с перебором, получается как-будто я сразу и везде.
с точки зрения квантовойй теории это нормально, а компьютерной...- не экономично для ресурсов.
и еще один момент не нравиться. если я подошол к одному краю стены, она меня оттолкнула в ту сторону, если к другому краю- в другую.
много писанины получается в коде.
когда я натыкаюсь на стену, я даже незнаю, что я иду на запад, она меня просто отталкивает от себя.
короче, please, хоть простой квадрат 20 на 20, но только с нормальным взаимодействием объектов, и естественно на ооп.
пожалуйста, натыки на стену обозначти beep.
понимаю, что зрячему проще все к экрану привязывать. но какая разница как выражать объект. для себя сделайте, для понимания, высвечивание координат на экран.
если не пойму, буду дальше грузить. а чего, вдруг разработаем теорию создания игр для незрячих.
есть у нас такие игрописатели, но исходники не дают, говорят, мол все просто.
но не все же такие умные, я программирую с 2000 годов, а продвинулся по меркам нормального программера на грош. то что я в ассемблере шарю, мало что значит.
вот, простая задача и то запара.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как правильно взаимодействовать с объектами в играх

Сообщение  trew в Ср Фев 20, 2013 8:08 am

Привет Сергей!

Для меня создание игр тоже вопрос нелегкий (3D в частности), но я напишу как сделал бы я.
Представим себе площадь 5х5 в которой могут быть:

1) стены
2) вода
3) огонь
4) полуогонь ( сгораешь не сразу, но ущерб есть)
5) человек

Для простоты все объекты у нас квадратные. Размещаем карту и на ней объекты:

11111
10051
12041
10431
11111

свойства объектов (поля структуры):

Для каждого из первых четырех объектов должна быть примерна такая схема:

Код:
type
  x as integer ' координата x
  y as integer ' координата y
  Number as Integer ' номер на карте - идентификация самого объекта
  status as BOOL ' возможность пройти объект (для стены=0, для воды=1, для огня=1, для полуогня 1)
  dead as BOOL ' при прохождении смерть (для стены=0,для воды=0, для огня=1, для полуогня 1)
  speed as single ' скорость прохождения (для стены=0,для воды=0.5, для огня=1, для полуогня 1)
  declare function DEAD ' запускается банальная проверка (для стены просто возврат из метода со значением 0,  для огня смерть мгновенно возврат = 100, для полуогня смерть через 5 секунд , то есть запуск таймера и выход со значением 50)
  declare sub Effect '  свои звуковые и графические эффекты при прохождении объекта
end type

Нам не нужно сравнивать с миллионом объектов, достаточно знать что находится в координате в которую вступит человек. То есть вступив на координату (2,3), смотришь, что лежит на карте (тупо проверяешь массив на значение). По нашей карте там вода. Далее делается проверка на прохождение объекта воды (то есть запускается метод DEAD). Потом запускается метод эффектов для восприятия пользователя

Лучше сразу делать схему и в ней составлять какие объекты какими полномочиями обладают и только потом начинать писать код. Может я неправильно понял суть вопроса, если что извиняюсь.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как правильно взаимодействовать с объектами в играх

Сообщение  electrik в Ср Фев 20, 2013 1:44 pm

привет. в данном моменте все понятно. я так же сначала делал. обычный двумерный или трехмерный массив.
я же хочу представлять объект не в реальных масштабах, а лишь его координатное положение и размер, тип.
понятно, сначала надо карту нарисовать. представить как оно будет, а потом уже делать так как хочется.
этот метод сэкономит кучу памяти для больших объектов.
вот пример твоей 5x5 карты, как он в моей башке выглядит, не совсем точный., но:

type baseobj
objtype as integer ' стена, вода и т.д.
point x as integer ' начальная точка x
pointy as integer ' начальная точка y
sizex as integer размер объекта по x
sizey as integer ' размеры объекта по y
end type


dim objs(1 to 12 as baseobj

' построим южную стену
objs(1).objtype = 1 ' объект стена
objs(1).pointx=1
objs(1).pointy = 1
objs(1).sizex=5 ' длина стены
objs(1).sizey=1 ' толщина стены
' построим западную стену
objs(2).objtype = 1 ' объект стена
оbjs(2).pointx=1
objs(2).pointy=2
objs(2).sizex=1 ' толщина стены
objs(2).sizey=3 ' длина стены
' построим северную стену
objs(3).objtype = 1
objs(3).pointx=2
objs(3).pointy=5
objs(3).sizex=4
objs3.sizey=1
' построим восточную стену
objs(4).objtype=1
objs(4).pointx=5
objs4.pointy=2
objs(4).sizex=1
objs(4).sizey=3

' ' разместим человека внутри объекта
objs(5).objtype = 5 ' человек
objs(5).pointx=4
objs(5).pointy=4
objs(5).sizex=1
objs((5).sizey=1

вот подобно тому. только мне не нравиться, перечисление объектов.
видимо, придется с массивами мудрить. блин., сколько там предусматривать придется.
человек стоит на клетке 2. когда он шагнул на клетку 3, в клетку 3 пишется что туда встал человек, если возможно, в клетку 2 от куда он ушел, пишется 0 или другая информация об объекте. 0 в твоем примере я так понимаю, пол? а если он деревянный, битонный?
блин, а если я хочу передвинуть объект 10000x10000, сколько перезаписей в массиве.
понятно, если объект пустой, а если в нем есть еще объекты.
лалдно, будем учиться абстрактно мыслить, может чего-нибудь с ооп получится.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как правильно взаимодействовать с объектами в играх

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения