purebasic.info

PureBasic forum
Текущее время: Вт июл 17, 2018 6:23 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 365 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 11:41 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6321
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
MrApple писал(а):
1. Герой 1 подошёл к пункту А.

как именно-
короткой дорогой
обходя препятствия
по заданной траектории
В зависимости от условий и скорости прибавляешь к текущим координатам героя число, пока его координаты не сравняются с А
MrApple писал(а):
2. Проиграла музыка.

Как координаты сравнялись ( см п1) включай музыку. В зависимости от вида музыкального файла способ воспроизведения.
MrApple писал(а):
3. Герой 2 подошёл к пункту Б.

см п1
MrApple писал(а):
Герой 2 проиграл анимацию.


В зависимости от способа задания анимации, но обычно сводиться к циклическому выведению на экран всех кадров данной анимации

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 1:22 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 12:46 pm
Сообщений: 44
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy, спасибо. Но немного не поняли :) Это я просто пример привёл. Дело в том, что этих действий может быть очень много, и они могут варьироваться в разных последовательностях.
Вот и требуется определить алгоритм, который бы позволял выставлять ЛЮБЫЕ действия в ЛЮБОЙ очереди. Навроде скриптов поведения. Одно действие заканчивается (любое - звук ли, движение) - другое начинается.
Как, например, это делается в RPG-играх: когда подводишь одного героя к другому, они начинают поочерёдно говорить, менять анимацию по контексту, передавать друг другу предметы и т. д.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 1:50 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6321
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
MrApple писал(а):
Как, например, это делается в RPG-играх: когда подводишь одного героя к другому, они начинают поочерёдно говорить, менять анимацию по контексту, передавать друг другу предметы и т. д.
Ну это и называется логикой игры, поведение согласно сценарию игры, искусственным интеллектом - называй как хочешь. Смысл сводиться опять же к одному
"если произошло какое то событие-сделать то-то".
Как это происходит наверно все видели, опять же не понятно, а в чем вопрос то?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 5:34 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 12:46 pm
Сообщений: 44
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вот про задание сценария в игре я и спрашиваю: как его осуществить?

Например, есть набор действий героя:
HeroWalk(), HeroStand(), HeroTakeThing(), HeroTalk()
Требуется сделать, чтобы герой на разных уровнях игры поочерёдно выполнял эти свои действия. Например, на 1 уровне - таким порядком:
HeroStand(), HeroTakeThing(), HeroWalk()
на 2 уровне - таким:
HeroJump(), HeroWalk(), HeroTakeThing()
на 3 уровне - таким:
HeroTalk(), HeroWalk(), HeroStand()
и т. д.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 6:02 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11205
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Проверяешь номер уровня и выполняешь требуемые действия.
Код:
1
2
3
4
5
6
7
8
Select Number
  Case 1
    HeroStand() : HeroTakeThing() : HeroWalk()
  Case 2
    HeroJump() : HeroWalk() : HeroTakeThing()
  Case 3
    HeroTalk() : HeroWalk() : HeroStand()
EndSelect


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 10:05 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 29, 2011 9:37 pm
Сообщений: 163
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ага, игрок конечно обязательно в такой последовательности и будет выполнять эти действия)
Я предлагаю обрабатывать условия, и в зависимости от резаульта вызывать процедуру\поток.
Например - при нажатии на кнопку W вызываем walk() с параметрами движения.

_________________
Windows Xp | Ubuntu 11.04 | Linux Mint 9 || PB 4.51 x86


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 29, 2011 11:11 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 12:46 pm
Сообщений: 44
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Хотелось бы составить нечто универсальное, что проверяло бы выполнение текущего действия и переключалось на следующее. Потому как действий может быть очень много. (Например, герой должен не просто зайти в дверь, а сначала прыгнуть, что-то произнести с музыкой, махнуть мечом, и уж потом зайти.)

Есть вариант: все функции действий составлять с выходным результатом. То есть, если действие выполнено - его функция возвращает 1.
Затем составить общую функцию с двумя входящими значениями n1, n2 (текущее действие и следующее). Она будет проверять: если n1 возвращает 1, то запускается n2. И таким образом копировать эту функцию, подставляя функции действий как значения:
CheckAction ( HeroStand(), HeroTakeThing() )
CheckAction ( HeroTakeThing(), HeroWalk() )

и т. д.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 02, 2011 1:14 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб авг 18, 2007 6:26 pm
Сообщений: 605
Откуда: Северодвинск/Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
MrApple, запихивай все действия(описываемые структурой) в связанный список, и при выполнении требуемых условий выкидывай первый элемент, получится очередь.

Грустно всё-таки, что в пурике нет ООП, вставить в структуру функцию в стиле IsCompleted() - милейшее дело...
Но по идее можно извратиться и запихнуть в одну область памяти и структуру и интерфейс, и получится почти полноценный класс, с наследованием и полиморфизмом, вот только много лишнего кода получится.

_________________
http://www.youtube.com/watch?v=XHosLhPEN3k


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 3:05 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 12:46 pm
Сообщений: 44
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо всем за предложения! На мой взгляд, если не можешь составить универсальный алгоритм, то следует так прямо и составлять: If..Then, If..Then, либо Select..EndSelect.
Конечно, набирается много похожего кода. Зато будет и проще, и время, и нервы сбережёшь. К тому же, тогда и система становится гибче: легче вставлять дополнительные условия и значения.
Есть такой вариант. Поскольку действия зачастую имеют схожий характер, то номер каждого следует занести в массив: hero_walk(0), hero_walk(1) или в константу: #HeroWalk1, #HeroWalk2 и т. д. - как удобнее перечислять. И потом выбираем, какое закончилось - какое начинается.


Последний раз редактировалось MrApple Пт окт 21, 2011 12:25 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 09, 2012 6:52 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
В связи с потерей встроенного движка функции terrain. Попытался
создать испытательный полигон на n3xtd. Вот, что получилось.
Код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
; ------------------------------------------------------------
;  Типа сцена на N3XTD
; ------------------------------------------------------------
; Include files
IncludePath "include"   :   IncludeFile "n3xtD_PB.pbi" ; тут лежит враппер
;____________________________________________________________
; Globales
Global *app.l, Quit.l
;----------------------------------------------------------
*app=_CreateGraphics3D(1600,900)                          ; разрешение монитора
If *app= #Null
  End
EndIf
;------------------------------------------------------------
; set the curent folder
  SetCurrentDirectory("data/")                             ;тут лежат модели, текстуры и всякая нужная дребедень
;------------------------------------------------------------------------------------
 ; create light and set position                             ; это свет, но он включен по умолчанию
  ;*light.LightNode = _CreateLight($ffffffff, 256.0)
  ;_PositionNode(*light, 50,100,50)
  ;------------------------------------------------------------------------------------
 
 
 
Global *terrain.TerrainNode = _CreateTerrain("rail.bmp", 1, 8.0, 0.70,8.0, 32); создаем землю
;_SplattingTerrain(*terrain,-500.0,$fffff)
;_FogTerrain(*terrain,5)
;_FogColorTerrain(*terrain,$C48A3F)
_TextureTerrain(*terrain, 0 , "rail.jpg")                                      ; текстурируем
_TextureTerrain(*terrain, 1 , "level3.jpg")                                    ; детализируем
_MaterialTypeNode(*terrain,  #EMT_LIGHTMAP)
_MaterialFlagNode(*terrain,EMF_FOG_ENABLE,1);
;_DebugModeNode(*terrain, #True)
;------------------------------------------------------------------------------------
Global *obj.Mesh = _LoadMesh("1.x")                                            ; кинем старый, ржавый паровоз для разнообразия
; create a mesh with one of the 3D object loaded
Global *sphere.EntityNode =_CreateEntityNode(*obj);                            ; здесь он стал узлом и к нему можно привязать звук, наверное
_PositionNode(*sphere, 100,60,200)                                              ; по указанным координатам
;-----------------------------------------------------------------------------------------
; grass zone
Global *spritemesh.Mesh = _LoadMesh("grass1.3ds")                               ; грузим траву, типа деревья
_ScaleMesh(*spritemesh, 0.15, 0.4, 0.15)                                         ; ее размеры
  Global *staticArea.EntityNode
  *staticArea = _CreateBatchNode(*spritemesh, #EMT_TRANSPARENT_ALPHA_CHANNEL_REF, #True)
  _WindValueBatchZone(*staticArea, 0.10, 30)
 
  For k = 0 To 10000                                                              ; генерим случайное место для типа деревьев
    x.f = Random(1560)
    z.f = Random(1560)
    th=_TerrainHeight(*terrain,x,z)                                                ; высота земли в месте посадки, чтоб дерево не зависло в воздухе
    If th < 40 :x=0:z=0
   
    EndIf
    sac.f = 0.65 + (Random(550)/1000.0)
    _AddBatchElement(*staticArea, x, th ,z, 0,0,0, sac,1,sac)
  Next
  ;_DebugModeNode(*staticArea, #DEBUG_BBOX )
  ;------------------------------------------------------------------------------------
; create Skybox--- Небеса
*sky.EntityNode = _CreateSkybox( _LoadTexture("up.jpg"),_LoadTexture("dn.jpg"),_LoadTexture("lf.jpg"),_LoadTexture("rt.jpg"),_LoadTexture("ft.jpg"),_LoadTexture("bk.jpg"))
;----------------------------------------
; create one water plan
_DataWaterAR("waterNormal.png", "waterDUDV0.png", 0.025)                            ; Создаем водичку
 
*water.EntityNode = _CreateWaterAR(47.0, 47, #True, #True)
_PositionNode(*water, 1010,40,1010)                                                   ; позиционируем
_HeightWaterAR(*water.EntityNode,  2)                                                 ; волны
 
_ColorWaterAR(*water, $8866b7ff)
_SpeedWaterAR(*water,  10000)
_ClipPlaneOffsetWaterAR(*water, 0.0)
;------------------------------------------------------------------------------------------------
_Fog($00ff, #True,  10.0, 60.0,10.0,1,1)
 ;_Fog( $00ff, #False,  0, 0, 0.0051)
 
  ; create a camera                                                                  ; око, без которого на экране ни чего не будет
  Global *cam.CameraNode = _CreateCameraFPS(70, 0.05 )
  ;_FarValueCamera(*cam,200.0)
  ;_FOVCamera(*cam, -500)
_PositionNode(*cam, 100,80,100)
 
;_TurnNode(*cam,0,45,0)
;-----------------------------------
; load font png                                                                      ;грузим шрифт для вывода интересующей нас инфы на экран
_LoadFont("courriernew.png")
Global *font.IGUIFont = _GetFont()
; ---------------------------------------
;           main loop                                                                 ; понеслось, завертелось
; ---------------------------------------
Global hh.f=0
Global zz.f=15
Repeat
 
  If _GetMouseWheel     ()=1                                                              ; определяем состояние колесика мыши
    zz=zz+2
    _PositionNode(*cam, _NodeX(*cam), zz, _NodeZ(*cam))                               ; и поднимаем или опускаем камеру над землей
  EndIf
  If _GetMouseWheel     ()=-1
    zz=zz-2: If zz < 40:zz=40:EndIf
    _PositionNode(*cam, _NodeX(*cam), zz, _NodeZ(*cam))
    EndIf
;-----------------------------------------------------------------
  ; move camera with dir key and mouse (left click)                                     ; двигаем камеру стрелками
  If _GetKeyDown(#KEY_ARROW_LEFT)
    hh= _TerrainHeight(*terrain,  _NodeX(*cam),  _NodeZ(*cam))+zz
    _PositionNode(*cam, _NodeX(*cam), hh, _NodeZ(*cam))
  EndIf
  If _GetKeyDown(#KEY_ARROW_RIGHT)
    hh= _TerrainHeight(*terrain,  _NodeX(*cam),  _NodeZ(*cam))+zz
    _PositionNode(*cam, _NodeX(*cam), hh, _NodeZ(*cam))
  EndIf
  If _GetKeyDown(#KEY_ARROW_UP)
    hh= _TerrainHeight(*terrain,  _NodeX(*cam),  _NodeZ(*cam))+zz
    _PositionNode(*cam, _NodeX(*cam), hh, _NodeZ(*cam))
  EndIf
  If _GetKeyDown(#KEY_ARROW_DOWN)
    hh= _TerrainHeight(*terrain,  _NodeX(*cam),  _NodeZ(*cam))+zz
    _PositionNode(*cam, _NodeX(*cam), hh, _NodeZ(*cam))
  EndIf
 
        ; if Escape Key, exit   --- Выход :(
  If _GetKeyDown(#KEY_ESCAPE)
    Quit=1
  EndIf
        ; ---------------
        ;      Render                                                                      ;  а тут рисуем на экране монитора все, что на мутили
        ; ---------------
  _BeginScene(1,128,128)
      _DrawScene()  
     _DrawText(*font, "FPS : "+Str(_FPS()),  10,25,0,0, $ffffffff)
     _DrawText(*font, "Primitives: "+Str(_PrimitiveCountDrawn())  ,  10,45,0,0, $ffffffff)
     _DrawText(*font, "vhile:"+Str(_GetMouseWheel       ()),10,65,0,0,$ffffffff)
  _EndScene()
Until Quit=1
; end
_FreeEngine()


Повторяю, этот кривой код испытательный полигон.
Выглядит он так Изображение
Если кого заинтересует все что нужно здесьhttp://narod.ru/disk/52251332001.27efb05f1426d9441b0da6d5100a2975/Poligon.rar.html
Вот не удается тумана напустить, может кто разберется.

_________________
CQ DX...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 09, 2012 8:33 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2278
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
pentod65 писал(а):
В связи с потерей встроенного движка функции terrain.

Интересно, а разработчики вообще в курсе про эту потерю?

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 09, 2012 10:53 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
да там, что то писалось по этому поводу, вот
http://www.purebasic.fr/english/viewtop ... terrain.pb

_________________
CQ DX...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 09, 2012 11:28 am 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Цитата:
pentod65
Вот не удается тумана напустить, может кто разберется.


Как-то так.

;R,G,B - цвет тумана
;near.f - минимальное расстояние от камеры
;far.f - максимальное расстояние от камеры

_Fog(RGBColor(R,G,B),#EFT_FOG_LINEAR,near.f,far.f,0.01,1,0)

;#True - разрешаем модели прятаться в тумане или #False - запретить модели окутываться туманом.
_MaterialFlagNode(handleMesh,#EMF_FOG_ENABLE,#True)

Я уже давненько N3XTD не занимался, но должно работать.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 10, 2012 11:22 am 
Не в сети
eternal student
Аватар пользователя

Зарегистрирован: Ср ноя 05, 2008 1:35 am
Сообщений: 447
Откуда: Екатеринодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
После таких танцев появился туман.
Код:
1
2
3
4
5
 _MaterialFlagNode(*terrain,#EMF_FOG_ENABLE,#True)
  _MaterialFlagNode(*water,#EMF_FOG_ENABLE,#True)
  _MaterialFlagNode(*sky,#EMF_FOG_ENABLE,#True)
  _MaterialFlagNode(*staticArea,#EMF_FOG_ENABLE,#True)
  _Fog($9C664Eff,0,100.0,150.0,0.01,1,0)


Вода туманится не хочет. Возможно, я что то не так делаю. В документах
не все функции указаны, да и примеров маловато.
MishanayCool если есть рабочий пример выложи.
Кстати любителям долгих путешествий по террейну добавляем строчку(и)
Код:
1
Global *terrain1.TerrainNode = _CreateTerrain("nnn.bmp", 1, 8.0, 0.70,8.0, 32)


текстурим и добавляем к terrain.TerrainNode в пространстве.

_________________
CQ DX...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 11, 2012 6:13 pm 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Вода там вроде шейдером реализована, поэтому и не туманится.
Может и ошибаюсь. Как уже говорил, давно на этом движке не работал.

Я кстати движок для Blitz3D на нём писал.
Скачать Blitz3D_x9.rar 8,18 МБ
Тут список команд, что я уже наклепал.
Посмотреть Blitz3Dx9.txt


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 365 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB