forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Парсинг скриптов (http://forum.boolean.name/showthread.php?t=5817)

jimon 15.06.2008 20:59

Ответ: Парсинг скриптов
 
Этого я не знаю, знаю как в blitzmax получить указатель на переменную

Dream 19.07.2008 03:52

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

я не говорю что это идеальный способ, но я зделал себе так) прикольно)) только иногда лень писать скрипты в блокноте))

jimon 19.07.2008 12:57

Ответ: Парсинг скриптов
 
DimasSup
не известно компилирует ли blitzmax\blitz3d select как переход по таблице или компилирует с кучей if'ов

я делал в blitzmax так что каждая команда ето отдельный тип у которого есть тип "do"
потом при загрузки скрипта все команды создают ети типы и заводятся в общий список
после етого идет простой проход по циклу с управляющей переменой
(та которая содержит номер исполняемой команды, нужна для реализации всяких функций, переходов и тд)

в идеале можно сделать нечто типа мета-программирования
у нас есть Engine.dll,Game.exe и Game.dll который реализует всю логику игры
пишем компилятор который переводит наш простой сриптовый язык
в тот язык который может скомпилироватся в dll'ку
и потом компилируем эту dll и подрубаем к игре

в принципе схожая вещь сделана в quake3,quake4,doom3
но там C/C++ код специально компилировался
и запускался на виртуальной машине

такой подход тоже можно реализовать, он называется
реал-тайм компиляцией в нативный код
тоесть при загрузки скрипта, встроенный компилятор просто
компилирует его в нативный код и запускает из программы )


Часовой пояс GMT +4, время: 13:44.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot