A Linguagem Lua e suas Aplicaes em Jogos

  • Slides: 75
Download presentation
A Linguagem Lua e suas Aplicações em Jogos Waldemar Celes Luiz Henrique de Figueiredo

A Linguagem Lua e suas Aplicações em Jogos Waldemar Celes Luiz Henrique de Figueiredo Roberto Ierusalimschy

Linguagens de script em jogos

Linguagens de script em jogos

Linguagens de script em Jogos q Pesquisa ð 72% na gamedev. net (set/2003) dos

Linguagens de script em Jogos q Pesquisa ð 72% na gamedev. net (set/2003) dos jogos usam linguagens de script

Pra quê? q q q Implementar o script do jogo Definir objetos e seus

Pra quê? q q q Implementar o script do jogo Definir objetos e seus comportamentos Gerenciar os algoritmos de inteligência artificial Controlar os personagens Tratar os eventos de entrada Descrever a interface com o usuário Criar protótipos Testar Depurar Analisar adequação Prover acesso programável para roteiristas e artistas ð Experimentar novas idéias e variações

Por quê? q Conjunto de características favoráveis ð Interpretada ð Tipagem dinâmica ð Gerência

Por quê? q Conjunto de características favoráveis ð Interpretada ð Tipagem dinâmica ð Gerência automática de memória ð Facilidade para estruturação de dados ð Facilidade para manipulação de strings ð Segura ð Facilidade para comunicação entre componentes

Linguagens de script (extensão) q Linguagens de configuração Selecionar preferências ð Tipicamente uma lista

Linguagens de script (extensão) q Linguagens de configuração Selecionar preferências ð Tipicamente uma lista de variáveis-valores ð Exemplo típico: arquivos. ini do Windows. ð q Linguagens de macros Automatizar tarefas ð Tipicamente uma lista de ações primitivas ð ² ð q Muito pouco ou nenhum controle de fluxo Exemplo típico: arquivos de automação de conexões via modem Linguagens embutidas ð Permitir acesso programável aos serviços da aplicação Controle de fluxo ² Definição de funções ² Estruturação de dados ²

Exemplos de linguagens de scripts q Lua q Python q Tcl q Perl q

Exemplos de linguagens de scripts q Lua q Python q Tcl q Perl q VBasic q. . .

Lua em jogos

Lua em jogos

Lua em Jogos q Mesma pesquisa na gamedev. net (set/2003) ð 20% usam Lua

Lua em Jogos q Mesma pesquisa na gamedev. net (set/2003) ð 20% usam Lua ð 7% usam Phyton

De fato. . . q Exemplos de jogos que usam Lua ð Levantamento ²

De fato. . . q Exemplos de jogos que usam Lua ð Levantamento ² Disciplina feito por Marcio Pereira de Araujo “Linguagem Lua”, DI / PUC-Rio

Grim Fandango – Lucasarts q Adventure ð Utiliza uma versão modificada de Lua 3.

Grim Fandango – Lucasarts q Adventure ð Utiliza uma versão modificada de Lua 3. 1 como linguagem de script

Escape from Monkey Island – Lucasarts q Adventure ð Também utiliza uma versão modificada

Escape from Monkey Island – Lucasarts q Adventure ð Também utiliza uma versão modificada de Lua 3. 1 como linguagem de script

Psychonauts – Double Fine q Action ð ð Toda lógica do jogo implementada em

Psychonauts – Double Fine q Action ð ð Toda lógica do jogo implementada em Lua Jogo controlado por entidades com scripts Lua ² Basicamente a engine começa o jogo, carregando um mundo estático, e os scripts Lua tomam o controle, tornando o mundo interativo e vivo.

Baldur’s Gate – Bioware q RPG ð ð Baldur's Gate utiliza scripts Lua em

Baldur’s Gate – Bioware q RPG ð ð Baldur's Gate utiliza scripts Lua em todo o jogo Em especial, para debug ² ² Comandos de debug mapeados para Lua Prompt Lua adicionado para debug em tempo real

Impossible Creatures – Relic q Estratégia ð Lua usada em ² ² ² Controle

Impossible Creatures – Relic q Estratégia ð Lua usada em ² ² ² Controle de IA Aparência de efeitos e de outros elementos gráficos Determinação das regras do jogo Edição dos atributos dos personagens Debug em tempo real

Far. Cry – Crytek q First Person Shooter (FPS) ð Lua usada em ²

Far. Cry – Crytek q First Person Shooter (FPS) ð Lua usada em ² ² Controle de IA Interfaces Edição de cenas e atributos em tempo real Criação de “Mod’s” – Criando e modificando arquivos Lua.

Por que Lua? q Pequena q Portátil q Eficiente q Fácil integração com C/C++

Por que Lua? q Pequena q Portátil q Eficiente q Fácil integração com C/C++ q Simples e flexível ð Sintaxe simples ð Facilidades para descrição de dados ð Mecanismos de extensão ð “Simple things simple, complex things possible”

História de Lua

História de Lua

Construção de Interfaces Gráficas q 1992: Projeto com a PETROBRAS/CENPES ð Construção de interfaces

Construção de Interfaces Gráficas q 1992: Projeto com a PETROBRAS/CENPES ð Construção de interfaces gráficas para diversos programas de simulação d

DEL Linguagem para Especificação de Diálogos q Definição de formulário ð Lista de parâmetros

DEL Linguagem para Especificação de Diálogos q Definição de formulário ð Lista de parâmetros ð Tipos e valores default d : e gasket "gasket properties" mat s # material d f 0 # distance y f 0 # settlement stress t i 1 # facing type

Limitações de DEL q Tomada de decisão ð Inclusão de predicados ð Necessidade de

Limitações de DEL q Tomada de decisão ð Inclusão de predicados ð Necessidade de maior poder de expressão d : e gasket "gasket properties" mat s # material d f 0 # distance y f 0 # settlement stress t i 1 # facing type : p gasket. m>30 gasket. m<3000 gasket. y>335. 8 gasket. y<2576. 8

Programa Gráfico Mestre q 1993: Projeto com a PETROBRAS Programa para visualização de perfis

Programa Gráfico Mestre q 1993: Projeto com a PETROBRAS Programa para visualização de perfis geológicos ð Configurável ð

SOL Simple Object Language q Linguagem para descrição de objetos q Sintaxe inspirada no

SOL Simple Object Language q Linguagem para descrição de objetos q Sintaxe inspirada no Bib. Te. X - defines a type `track', with numeric attributes `x' and `y', - plus an untyped attribute `z'. `y' and `z' have default values. type @track { x: number, y: number= 23, z: number=0} - defines a type `line', with attributes `t' (a track), - and `z', a list of numbers. - `t' has as default value a track with x=8, y=23, and z=0. type @line { t: @track=@track{x=8}, z: number*} - creates an object 't 1', of type `track' t 1 = @track { y = 9, x = 10, z="hi!"} - creates a line 'l', with t=@track{x=9, y=10}, - and z=[2, 3, 4] (a list) l = @line { t= @track{x=t 1. y, y=t 1. x}, z=[2, 3, 4] }

Limitações de SOL q Recursos para construção de diálogos q Mecanismos de programação procedural

Limitações de SOL q Recursos para construção de diálogos q Mecanismos de programação procedural

1994: Nasce Lua q Convergência das duas linguagens Suporte a programação procedimental ð Mecanismos

1994: Nasce Lua q Convergência das duas linguagens Suporte a programação procedimental ð Mecanismos para descrição de objetos ð q Necessidade de recursos mais poderosos Expressões aritméticas complexas ð Seleção ð Repetições ð q Linguagem de extensão extensível Extensão de aplicações ð Especializada para diferentes domínios ð

A linguagem Lua q Objetivos iniciais ð Simples e flexível ² ² ð Facilmente

A linguagem Lua q Objetivos iniciais ð Simples e flexível ² ² ð Facilmente acoplável Projetada também para programadores não profissionais Pequena DOS ² Implementação completa < 120 K, núcleo < 80 K ² ð Portátil Exigências dos projetos ² MS-DOS, Windows, Unix, Next, OS/2, Mac, EPOC, Palm. OS, Play. Station II, etc. ²

Lua no Tecgraf q Praticamente todos os projetos usam Lua

Lua no Tecgraf q Praticamente todos os projetos usam Lua

A Linguagem Lua

A Linguagem Lua

Como é Lua? q Sintaxe convencional function fat (n) if n == 0 then

Como é Lua? q Sintaxe convencional function fat (n) if n == 0 then return 1 else return n*fat(n-1) end q Unidade ð Chunk básica de execução: chunk = lista de comandos ð Arquivo ou string do programa hospedeiro

Execução de um chunk q Pré-compilado ð Pode-se q Máquina em bytecodes carregar arquivo

Execução de um chunk q Pré-compilado ð Pode-se q Máquina em bytecodes carregar arquivo compilado virtual executa seqüencialmente q Execução altera ambiente global

Tipos q Tipos associados a valores ð Variáveis armazenam qualquer tipo ² q Polimorfismo

Tipos q Tipos associados a valores ð Variáveis armazenam qualquer tipo ² q Polimorfismo natural Tipos existentes nil ð boolean ð number ð string ð table ð function ð userdata ð thread ð

Tipo nil q Propósito q Tipo maior: ser diferente dos demais do valor default

Tipo nil q Propósito q Tipo maior: ser diferente dos demais do valor default das variáveis q Também significa o falso booleano ð Qualquer ² Com valor de outro tipo significa verdadeiro exceção de false

Tipo boolean q Valor booleano ð Falso (false) ou verdadeiro (true)

Tipo boolean q Valor booleano ð Falso (false) ou verdadeiro (true)

Tipo number q Único tipo nativo para valores numéricos ð double (por default) local

Tipo number q Único tipo nativo para valores numéricos ð double (por default) local a = 3 local b = 3. 5 local c = 4. 5 e-8

Tipo string q Valores imutáveis q Sem limite de tamanho ðÉ comum ler arquivo

Tipo string q Valores imutáveis q Sem limite de tamanho ðÉ comum ler arquivo completo em uma string q Strings não usam ‘’ para terminação ð Podem armazenar dados binários quaisquer q Pattern-matching ð Implementado poderoso via biblioteca padrão

Tipo table q q Resultado da expressão {} Arrays associativos ð Qualquer valor como

Tipo table q q Resultado da expressão {} Arrays associativos ð Qualquer valor como chave ² q Valor de referência ð q São objetos dinâmicos Único mecanismo de estruturação de dados ð q Com exceção de nil São para Lua o que listas são para Lisp Implementadas como misto de array e hash Evolução permanente ð Excelente desempenho ð

Estruturas de Dados com tabelas q Implementação simples e eficiente q Records ð Açucar

Estruturas de Dados com tabelas q Implementação simples e eficiente q Records ð Açucar sintático t. x para t["x"]: t = {} t. x = 10 t. y = 20 print(t. x, t. y) print(t["x"], t["y"])

Estruturas de Dados com tabelas (2) q Arrays ð Inteiros como índices for i=1,

Estruturas de Dados com tabelas (2) q Arrays ð Inteiros como índices for i=1, n do print(a[i]) end q Conjuntos ð Elementos como índices t = {} t[x] = 1 -- t = t {x} if t[x] then. . . -- x t? q “Bags" ð Elementos como índices, contadores como valores

Tipo function q Valores de primeira classe function inc (x) return x+1 end q

Tipo function q Valores de primeira classe function inc (x) return x+1 end q Funções sugar inc = function (x) return x+1 end atribuídas a campos de tabelas w = { redraw = function (). . . end, pick = function (x, y). . . end, } if w. pick(x, y) then w. redraw() end

Tipo function (2) q Passagem ð Suporte por valor e retorno múltiplo a atribuições

Tipo function (2) q Passagem ð Suporte por valor e retorno múltiplo a atribuições múltiplas (x, y = y, x) a, b = f() print(f()) q Suporte function f() return 1, 2 end a número variável de argumentos ð Argumentos "empacotados" em uma tabela function f(. . . ) print(arg[1], arg[2]) end

Escopo léxico q Acesso a variáveis em escopos externos q Expressão cujo valor é

Escopo léxico q Acesso a variáveis em escopos externos q Expressão cujo valor é calculado quando a função que a contém é criada ð Quando o fecho é feito function add (x) return function (y) return y+x end add 1 = add(1) print(add 1(10)) --> 11 upvalue

Construtores q Origem da linguagem q Descrição de dados + semântica imperativa article{ author="F.

Construtores q Origem da linguagem q Descrição de dados + semântica imperativa article{ author="F. P. Brooks", title="The Mythical Man-Month", year=1975 } temp = {} temp["author"] = "F. P. Brooks" temp["title"] = "The Mythical Man-Month" temp["year"] = 1975 article(temp)

Objetos q Funções 1 a classe + tabelas = quase OO ð q Tabelas

Objetos q Funções 1 a classe + tabelas = quase OO ð q Tabelas podem ter funções como campos Sugar para definição e chamada de métodos Trata parâmetro implícito self ð Ainda falta herança. . . ð function a: foo (x). . . end sugar a. foo = function (self, x). . . end a: foo(x) sugar a. foo(a, x)

Tipo userdata q Armazena q Tipo um ponteiro void* de C opaco para a

Tipo userdata q Armazena q Tipo um ponteiro void* de C opaco para a linguagem ð Somente atribuição e teste de igualdade q Linguagem extensível em C ð “Esqueleto” para construção de linguagens de domínio específico

Extensão de Tipos q Lua permite a criação de novos “tipos” ð Sobre os

Extensão de Tipos q Lua permite a criação de novos “tipos” ð Sobre os tipos básicos table e userdata ð Associação de metatable q Operações básicas podem ser redefinidas ð Operações aritméticas ð Indexação (index, newindex) ð Operações de ordem (less-than)

Exemplo: tipo Point -- Metatable de Point local Point_metatable = { __add = function

Exemplo: tipo Point -- Metatable de Point local Point_metatable = { __add = function (p 1, p 2) return Point(p 1. x+p 2. x, p 1. y+p 2. y, p 1. z+p 2. z} end } -- Construtor function Point (self) self. x = tonumber(self. x) or 0. 0 self. y = tonumber(self. y) or 0. 0 self. z = tonumber(self. z) or 0. 0 setmetatable(self, Point_metatable) return self end -----------------------local p = Point{x=3. 0, y=1. 3, z=3. 2} local q = Point{x=4. 2, y=1. 0} local r = p+q -- {7. 2, 2. 3, 3. 2}

Herança Simples: mecanismo de delegação -- Métodos local Point_methods = { Print = function

Herança Simples: mecanismo de delegação -- Métodos local Point_methods = { Print = function (self) print(self. x, self. y, self. z) end, . . . } -- Metatable local Point_metatable = { __index = Point_methods, __add = function (p 1, p 2) return Point(p 1. x+p 2. x, p 1. y+p 2. y, p 1. z+p 2. z} end } ------------------------local p = Point{x=3. 0, y=1. 3, z=3. 2} local q = Point{x=4. 2, y=1. 0} local r = p+q r: Print()

Bibliotecas padrão q Basic q String q Table q Math q IO q OS

Bibliotecas padrão q Basic q String q Table q Math q IO q OS q Debug q Coroutine

Basic q Oferecem funções básicas ð print ð type ð setmetatable ð pairs

Basic q Oferecem funções básicas ð print ð type ð setmetatable ð pairs

String q Funções para manipulação de strings ð Casamento de padrões (pattern matching) ²

String q Funções para manipulação de strings ð Casamento de padrões (pattern matching) ² string. find – Permite buscar a ocorrência de um padrão numa string ² string. gsub – Permite substituir ocorrâncias de um padrão por uma sequência de caracteres dentro de uma string

Table q Funções para manipulação de tabelas ð table. insert ² Inserir um novo

Table q Funções para manipulação de tabelas ð table. insert ² Inserir um novo elemento ð table. remove ² Remover um elemento ð table. sort ² Ordenar os elementos em índices numéricos

Math q Funções matemáticas ð Semelhantes ² math. sqrt ² math. sin ² math.

Math q Funções matemáticas ð Semelhantes ² math. sqrt ² math. sin ² math. log às funções de C

IO q Funções de entrada e saída ð io. open ² Abertura de arquivo

IO q Funções de entrada e saída ð io. open ² Abertura de arquivo ð io. close ² Fechamento de arquivo ð io. read ² Leitura de arquivo ð io. write ² Escrita em arquivo

OS q Funções associadas ao sistema operacional ð os. clock ð os. date ð

OS q Funções associadas ao sistema operacional ð os. clock ð os. date ð os. execute

Debug q Facilidades de debug ð Acesso a pilha de execução ð Acesso a

Debug q Facilidades de debug ð Acesso a pilha de execução ð Acesso a variáveis locais ð Registro de hooks ² Line hook ² Call hook ² Count hook

Co-rotinas q Poderoso mecanismo de programação para jogos q Co-rotina x thread ð Ambos

Co-rotinas q Poderoso mecanismo de programação para jogos q Co-rotina x thread ð Ambos têm linhas de execução com seu próprio ambiente local ² ð Compartilham ambiente global Conceitualmente ² Threads executam simultaneamente – Exige tratamento de seções críticas ² Co-rotinas executam uma por vez – Transferência de controle explícita ð Execução de co-rotinas pode ser suspensa ² E retomada posteriormente

Co-rotinas q Criação local c = coroutine. create(function (). . . end) print(type(c)) -->

Co-rotinas q Criação local c = coroutine. create(function (). . . end) print(type(c)) --> "thread" q Estados ð ð ð q Suspensa Executando Inativa Troca de estado coroutine. resume(…) coroutine. yield(. . . ) q Comunicação entre co-rotinas ð ð resume “retorna” após um yield “retorna” quando execução é retomada (resume) Argumentos de yield são valores de retorno de resume Argumentos de resume são valores de retorno de yield

Exemplo: simulação de personagens local simulators = { coroutine. create(function (). . . end),

Exemplo: simulação de personagens local simulators = { coroutine. create(function (). . . end), -- simulação 1 coroutine. create(function (). . . end), -- simulação 2 coroutine. create(function (). . . end), -- simulação 3. . . } function manager () while true do for i, v in pairs(simulators) do coroutine. resume(v) end coroutine. yield() -- repassa para controlador externo end

Exemplos de Integração com C/C++

Exemplos de Integração com C/C++

Lua como linguagem de configuração -- começar no meio do jogo, usando Mickey. .

Lua como linguagem de configuração -- começar no meio do jogo, usando Mickey. . . LEVEL = 13 HERO = "Mickey"

Lua como linguagem de configuração #include "lua. h" #include "lauxlib. h" static int level=0;

Lua como linguagem de configuração #include "lua. h" #include "lauxlib. h" static int level=0; const char* hero="Minnie"; . . . int main(void) { lua_State *L=lua_open(); lua. L_loadfile(L, "init. lua"); lua_pcall(L, 0, 0, 0); lua_getglobal(L, "LEVEL"); level=lua_tonumber(L, -1); lua_getglobal(L, "HERO"); hero=lua_tostring(L, -1); play(level, hero); lua_close(L); return 0; }

Lua como linguagem de configuração -- começar no meio do jogo, usando Mickey. .

Lua como linguagem de configuração -- começar no meio do jogo, usando Mickey. . . LEVEL = 13 HERO = "Mickey" GREET = "Bom dia ". . HERO. . "! Como vai" SCORE = 1. 2 * LEVEL

Lua como linguagem de extensão weapons = { knife = { aggression = 0.

Lua como linguagem de extensão weapons = { knife = { aggression = 0. 3, attackrange = 0. 5, accuracy = 1. 0, }, sword = { aggression = 0. 5, attackrange = 1. 5, accuracy = 0. 8, }, . . . }

Lua como linguagem de extensão double accuracy; lua_getglobal(L, ”weapons”); lua_pushstring(L, ”sword”); lua_gettable(L, -2); lua_pushstring(L,

Lua como linguagem de extensão double accuracy; lua_getglobal(L, ”weapons”); lua_pushstring(L, ”sword”); lua_gettable(L, -2); lua_pushstring(L, ’accuracy’); lua_gettable(L, -2); accuracy = lua_tonumber(L, -1); lua_pop(L, 2);

Lua como linguagem de extensão weapons = { knife = Weapon { aggression =

Lua como linguagem de extensão weapons = { knife = Weapon { aggression = 0. 3, attackrange = 0. 5, accuracy = 1. 0, }, . . . } function Weapon (self) if not self. aggression then self. aggression = 0. 5 -- default value elseif self. aggression < 0. 0 or self. aggression > 1. 0 then Report. Error("Invalid aggression value"). . . return self end

Lua como linguagem de extensão weapons = { knife = Weapon{ aggression = 0.

Lua como linguagem de extensão weapons = { knife = Weapon{ aggression = 0. 3, attackrange = 0. 5, accuracy = 1. 0, getit = function (person) if person: Has. Enough. Weapon() then person: Speak("Não preciso dessa faca") return false else person: Speak("Essa faca será util") return true end, }, . . . }

Lua como linguagem de controle class CPerson {. . . public: CPerson (char* model_file);

Lua como linguagem de controle class CPerson {. . . public: CPerson (char* model_file); void Set. Name (char* name); void Set. Energy (double value); Add. Skill (Weapon* w); double Get. Energy (); Walk (); Run (); Jump (); Attack (); . . . };

Lua como linguagem de controle Hero = Person { name = "Tarzan", model =

Lua como linguagem de controle Hero = Person { name = "Tarzan", model = "models/tarzan. mdl", energy = 1. 0, skills = {knife, axe} } function Person (self) local cobj = CPerson: new(self. model) cobj: Set. Name(self. name) cobj: Set. Energy(self. energy) for i, v = ipairs(self. skills) do cobj: Add. Skill(v) end return cobj end

Lua como linguagem de controle . . . if Hero: Get. Energy() > 0.

Lua como linguagem de controle . . . if Hero: Get. Energy() > 0. 5 then Hero: Attack() else Hero: Run() end. . .

Ferramenta de integração automática

Ferramenta de integração automática

to. Lua q Ferramenta Variáveis Funções Classes Métodos para mapear C/C++ para Lua to.

to. Lua q Ferramenta Variáveis Funções Classes Métodos para mapear C/C++ para Lua to. Lua Código C/C++ usando API de Lua. c/. cpp . pkg Aplicação tolua. lib

to. Lua: exemplo de C #define FALSE 0 #define TRUE 1 enum { POINT

to. Lua: exemplo de C #define FALSE 0 #define TRUE 1 enum { POINT = 100, LINE, POLYGON } Object* create. Obejct (int type); void draw. Object (Object* obj, double red, double green, double blue); int is. Selected (Object* obj); . . . my. Line = create. Object(LINE). . . if is. Selected(my. Line) == TRUE then draw. Object(my. Line, 1. 0, 0. 0); else draw. Object(my. Line, 1. 0, 1. 0); end. . .

to. Lua: exemplo de C++ #define FALSE 0 #define TRUE 1 class Shape {

to. Lua: exemplo de C++ #define FALSE 0 #define TRUE 1 class Shape { void draw (void); void draw (double red, double green, double blue); int is. Selected (void); }; class Line : public Shape { Line (double x 1, double y 1, double x 2, double y 2); ~Line (void); }; . . . my. Line = Line: new (0, 0, 1, 1). . . if my. Line: is. Selected() == TRUE then my. Line: draw(1. 0, 0. 0) else my. Line: draw() end. . . my. Line: delete(). . .

Para saber mais. . . www. lua. org

Para saber mais. . . www. lua. org

www. lua. org q q q R. Ierusalimschy, Programming in Lua. org, December 2003.

www. lua. org q q q R. Ierusalimschy, Programming in Lua. org, December 2003. ISBN 85 -903798 -1 -7. R. Ierusalimschy, L. H. de Figueiredo, W. Celes. “Lua 5. 0 Reference Manual”. Technical Report MCC-14/03, PUC-Rio, 2003. R. Ierusalimschy, L. H. de Figueiredo, W. Celes. The evolution of an extension language: a history of Lua, Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14–B -28. R. Ierusalimschy, L. H. de Figueiredo, W. Celes. Lua—an extensible extension language. Software: Practice & Experience 26 #6 (1996) 635– 652. L. H. de Figueiredo, R. Ierusalimschy, W. Celes. Lua: an extensible embedded language. Dr. Dobb’s Journal 21 #12 (Dec 1996) 26– 33. L. H. de Figueiredo, R. Ierusalimschy, W. Celes. The design and implementation of a language for extending applications. Proceedings of XXI Brazilian Seminar on Software and Hardware (1994) 273– 83.