|
2D-программирование Вопросы, касающиеся двумерного программирования |
15.06.2008, 20:59
|
#16
|
|
Ответ: Парсинг скриптов
Этого я не знаю, знаю как в blitzmax получить указатель на переменную
|
|
|
19.07.2008, 03:52
|
#17
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Re: Парсинг скриптов
есть 2 варианта по моему мнению( всё завист от того как именно ты хочеш грузить скрип)
1 первый, если скрипт утебя должен идти вместе с игрой.
Тогда проще передать ссылку и файл со скритом в функцию обработки скрипта, которая каждый цикл будет выполнять каждый пункт скрипта.
2 вариант, если на время выполнения скрипта всё останавливается.
тогда всё проще с одной стороны, но... Скорее всего прийдётся знать зарание что именно юудет сриптоватся и написать функцию типа этой
Function Script_Run(script$)
countr=0
howr=0
phowr=0
delscr=0
proy=0
nscript=0
d=OpenFile (script$)
If d=0
Return
EndIf
While Not Eof( d )
scr.scrtext=New scrtext
scr\scr=ReadLine$(d)
nscript=nscript+1
scr\nscript=nscript
Wend
scr.scrtext = First scrtext
countr=0
howr=0
Repeat
phowr=howr
If delscr=0
Select Upper( scr\scr)
Case "CSPHERE"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
objects.objectscript=New objectscript
scr=After scr
objects\model=CreateSphere(Float(scr\scr))
scr=After scr
objects\name=scr\scr
NameEntity objects\model,objects\Name
If scr\nscript<>nscript scr=After scr
Case "MOVE"
ip=i
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
scr=After scr
For objects.objectscript=Each objectscript
If objects\name$=scr\scr
scr=After scr
x#=Float(scr\scr)
scr=After scr
y#=Float(scr\scr)
scr=After scr
z#=Float(scr\scr)
MoveEntity objects\model,x,y,z
If scr\nscript<>nscript scr=After scr
EndIf
Next
Case "PLR"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
objects.objectscript=New objectscript
objects\model=plr
f=objects\model
scr=After scr
NameEntity objects\model,scr\scr
objects\name=scr\scr
If scr\nscript<>nscript scr=After scr
Case "ANMD2"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
scr=After scr
For objects.objectscript=Each objectscript
If objects\name$=scr\scr
scr=After scr
mode=scr\scr
scr=After scr
speeda#=Float(scr\scr)
scr=After scr
type_anm$=scr\scr
plr_animate(type_anm$,mode,speeda#)
If scr\nscript<>nscript scr=After scr
EndIf
Next
Case "DELAY"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
If delscr<>0
delscr=delscr-1
Else
scr=After scr
delscr=Float(scr\scr)
EndIf
If scr\nscript<>nscript scr=After scr
Case "TURN"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
scr=After scr
For objects.objectscript=Each objectscript
If objects\name$=scr\scr
scr=After scr
x#=Float(scr\scr)
scr=After scr
y#=Float(scr\scr)
scr=After scr
z#=Float(scr\scr)
TurnEntity objects\model,x,y,z,1
If scr\nscript<>nscript scr=After scr
EndIf
Next
Case "PLRMOVETONPC"
npc.npc=Object.npc(player\npc)
sx=EntityX(npc\Model)-EntityX(plr)
sz=EntityZ(npc\Model)-EntityZ(plr)
AlignToVector plr,sx,0,sz,0,1
dista=EntityDistance (plr,npc\model)-15
If dista>0
MoveEntity plr,0,0,player\h_speed#
Else
plr_animate("stay",1,0.1)
EndIf
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
If scr\nscript<>nscript scr=After scr
Case "CAMPOSITION"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
scr=After scr
x#=Float(scr\scr)
scr=After scr
y#=Float(scr\scr)
scr=After scr
z#=Float(scr\scr)
PositionEntity cam,x,y,z,1
If scr\nscript<>nscript scr=After scr
Case "CAMMOVE"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
scr=After scr
x#=Float(scr\scr)
scr=After scr
y#=Float(scr\scr)
scr=After scr
z#=Float(scr\scr)
MoveEntity cam,x,y,z
If scr\nscript<>nscript scr=After scr
Case "CAMTURN"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
scr=After scr
x#=Float(scr\scr)
scr=After scr
y#=Float(scr\scr)
scr=After scr
z#=Float(scr\scr)
TurnEntity cam,x,y,z,1
If scr\nscript<>nscript scr=After scr
Case "CAMPOINTTONPC"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
npc.npc=Object.npc(player\npc)
PointEntity cam,npc\model
If scr\nscript<>nscript scr=After scr
Case "CAMMOVETONPC"
npc.npc=Object.npc(player\npc)
dista=EntityDistance (cam,npc\model)-15
If dista>0
wag#=(dista*1000)/howr
npcpiv=CreatePivot (npc\model)
MoveEntity npcpiv,0,25,0
PointEntity cam,npcpiv
MoveEntity cam,0,0,wag#/1000
FreeEntity npcpiv
EndIf
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
If scr\nscript<>nscript scr=After scr
Case "NPCMOVE"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
npc.npc=Object.npc(player\npc)
scr=After scr
x#=Float(scr\scr)
scr=After scr
y#=Float(scr\scr)
scr=After scr
z#=Float(scr\scr)
MoveEntity npc\model,x,y,z
If scr\nscript<>nscript scr=After scr
Case "NPCPOINTPLR"
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
npc.npc=Object.npc(player\npc)
sx=EntityX(plr)-EntityX(npc\Model)
sz=EntityZ(plr)-EntityZ(npc\Model)
AlignToVector npc\Model,sx,0,sz,0,1
If scr\nscript<>nscript scr=After scr
Case "NPCMOVETOPLR"
npc.npc=Object.npc(player\npc)
dista=EntityDistance (plr,npc\model)-15
If dista>0
wag#=(dista*1000)/howr
sx=EntityX(plr)-EntityX(npc\Model)
sz=EntityZ(plr)-EntityZ(npc\Model)
AlignToVector npc\Model,sx,0,sz,0,1
MoveEntity npc\model,0,0,wag#/1000
EndIf
If howr<>0
proy=proy+1
If proy=countr
howr=howr-1
EndIf
EndIf
If scr\nscript<>nscript scr=After scr
Case "REPEAT"
scr=After scr
countr=Float(scr\scr)
scr=After scr
howr=Float(scr\scr)
scr=After scr
nachalo=Handle (scr)
proy=0
Case "ENDSCRIPT"
For scr.scrtext =Each scrtext
Delete scr
Next
plr_animate("stay",1,0.1)
CloseFile (d)
Return
Default
If scr\nscript<>nscript scr=After scr
End Select
If howr<>0 And proy=countr
scr.scrtext=Object .scrtext (nachalo)
proy=0
EndIf
Else
delscr=delscr-1
EndIf
If howr=0 Or howr<>phowr
npc.npc=Object.npc(player\npc)
PositionEntity npc\model,EntityX(npc\model),EntityY(npc\model)-1,EntityZ(npc\model)
PositionEntity plr,EntityX( plr),EntityY( plr)-1,EntityZ( plr)
UpdateWorld
RenderWorld
Text 1,20,delscr
Flip
End If
Forever
CloseFile (d)
End Function
Function plr_animate(type_anim$,mode_anim,speed_anim#)
Select Upper( type_anim$)
Case "STAY"
AnimateMD2 plr,mode_anim,speed_anim#,0,37
Case "RUN"
AnimateMD2 plr,mode_anim,speed_anim#,40,45
Case "ATAK"
AnimateMD2 plr,mode_anim,speed_anim#,72,83
Case "CAST"
AnimateMD2 plr,mode_anim,speed_anim#,107,134
End Select
End Function
а это файл скрипта ( например script1.gscr)
PLR
tris
AnMd2
tris
1
0.1
run
repeat
1
40
plrmovetonpc
AnMd2
tris
1
0.1
stay
delay
40
repeat
1
100
cammovetonpc
delay
200
EndScript
я не говорю что это идеальный способ, но я зделал себе так) прикольно)) только иногда лень писать скрипты в блокноте))
|
(Offline)
|
|
19.07.2008, 12:57
|
#18
|
|
Ответ: Парсинг скриптов
DimasSup
не известно компилирует ли blitzmax\blitz3d select как переход по таблице или компилирует с кучей if'ов
я делал в blitzmax так что каждая команда ето отдельный тип у которого есть тип "do"
потом при загрузки скрипта все команды создают ети типы и заводятся в общий список
после етого идет простой проход по циклу с управляющей переменой
(та которая содержит номер исполняемой команды, нужна для реализации всяких функций, переходов и тд)
в идеале можно сделать нечто типа мета-программирования
у нас есть Engine.dll,Game.exe и Game.dll который реализует всю логику игры
пишем компилятор который переводит наш простой сриптовый язык
в тот язык который может скомпилироватся в dll'ку
и потом компилируем эту dll и подрубаем к игре
в принципе схожая вещь сделана в quake3,quake4,doom3
но там C/C++ код специально компилировался
и запускался на виртуальной машине
такой подход тоже можно реализовать, он называется
реал-тайм компиляцией в нативный код
тоесть при загрузки скрипта, встроенный компилятор просто
компилирует его в нативный код и запускает из программы )
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:05.
|