Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 15.06.2008, 20:59   #16
jimon
 
Сообщений: n/a
Ответ: Парсинг скриптов

Этого я не знаю, знаю как в blitzmax получить указатель на переменную
 
Ответить с цитированием
Старый 19.07.2008, 03:52   #17
Dream
быдло
 
Регистрация: 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
jimon
 
Сообщений: n/a
Ответ: Парсинг скриптов

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

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

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

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

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Библиотека для подключения скриптов к .Net приложениям pax Visual Basic 3 30.01.2009 19:32
Нужны юзерлибы скриптов для PB 4.02 Manfred PureBasic 0 02.11.2007 13:04


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com