Desenvolvimento de Jogos em Python
Características de um jogo
●
Pessoas de áreas diferentes
–
Arte
–Design
–
Desenvolvimento
–Comercial
●
Não atende a necessidades, é um lazer
●
Projetos com tempo de desenvolvimento alto e
Partes do jogo
Sobre a programação envolvida em jogos, existem quatro áreas
principais e distintas da engine:
●
Inteligência Artificial: É responsável por toda e qualquer forma de
atitude diferenciada de algum NPC (personagem que não é do jogador,
ou Non-Player Character), de forma a tentar demonstrar a existência de
inteligência nestes seres.
●
Gráfico: Tudo o que o jogador vê no jogo é feito por essa parte da
engine.
●
Som: Tudo aquilo que o jogador ouve.
●
Input: Toda forma de interface entre o usuário e o jogo é lidada por
Linguagem
●
Usar linguagem compilada e ganhar
performance?
●
Usar linguagem interpretada e ganhar tempo
de desenvolvimento?
●
Escrever tudo do zero, otimizando o
desempenho pro meu jogo?
Linguagens de script
O que é?
Linguagem de script é uma linguagem
auxiliar, que contém dados que podem
ser modificados por uma equipe
diferente sem mexer em seu código.
Porque utilizar?
Devido a toda evolução computacional
que tivemos, há várias partes do
programa que não precisam ser muito
otimizados. E, como tempo é dinheiro,
economizar tempo de programação é o
que mais importa.
●
Simplicidade
●Consumo de recursos
●Agilidade
●Tempo de
desenvolvimento
●Tempo de compilação
●Tempo de aprendizado
Opções de linguagem
Quais são as opções?
Existem várias linguagens de script que poderiam ser utilizadas. Entre elas, as mais
famosas na área de jogos são Lua¹, desenvolvida pela PUC-Rio, e Python², desenvolvida por Guido van Rossum.
Nas duas é fácil criar uma extensão em C/C++ ou serem imbuídas em programas em C/C++. Além disso, as duas apresentam facilidades para implementação de inteligência artificial.
Afinal, porque Python?
A escolha entre estas duas linguagens é tão pessoal quanto a escolha entre utilizar
OpenGL ou DirectX. Utilizamos Python por que tem uma documentação mais vasta, uma comunidade maior e, por isso, várias ferramentas que podem facilitar a vida dos
programadores.
Entre estas ferramentas importantes, temos: pyOpenGL (que além de ser um binding do OpenGL para python, já tem classes para lidar com quaternions), Numeric ou numpy (pacote com ferramentas matemáticas) e pyOpenAL (binding do OpenAL para python).
Exemplos de linguagens
Imprimindo a frase “Hello World” em quatro linguagens diferentes:
Programa em C
#include <stdio.h>
main() {
printf("Hello World!");
}
Programa em Python
print “Hello World!”
Programa em Java
class myHelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
Programa em Lua
Projetos em Python
Veremos a seguir, alguns projetos que utilizam
Python em seu desenvolvimento.
Ferramentas, jogos e cinema
Engines:
Panda 3D, Crystal space e Ogre.
Ferramentas de modelagem:
Blender 3D e Maya.
Jogos:
Eve Online, Piratas do Caribe, PlaneShift, Civilization IV, etc.
Cinema:
Big Buck Bunny, Avatar: The last air beinder, Transformers, Iron Man,
Avatar, etc.
Outros:
NASA, Yahoo Groups, Yahoo Maps, Red Hat, IBM, ABN AMRO Bank –
Treasure System, Google, Nokia, Disney, etc.
Citações
Industrial Light & Magic
ILM uses Python in the production of their FX, as described in the RenderMan Course Notes from Siggraph 2001 (they name "The Phantom Menace", "The Mummy Returns" and other productions as ones where Python was used...).
Walt Disney Feature Animation
Walt Disney Feature Animation is also using Python to add scriptability to their animation production system.
The Temple of Elemental Evil and Vampire: The Masquerade: Bloodlines
"Greyhawk: The Temple of Elemental Evil" and "Vampire: The Masquerade: Bloodlines" use Python extensively for pretty much everything except the rendering engines - game logic, interface, etc. Both games have strong modding communities.
Exemplo
import os
import Image
colorkey = (255,255,255,255)
files = os.listdir(".")
for file in files:
if (file[-2:] != "py"):
new_filename = file[:-4]
img = Image.open(file)
img = img.convert("RGBA")
for i in range(img.size[0]):
for j in range(img.size[1]):
if (img.getpixel((i,j)) == colorkey):
img.setpixel((i,j), (255,255,255,0))
img.save(new_filename+".tga")
del img
Máquina de Estados
def onLocate(self,enemy): if (game.distance(self,enemy) < 30): self.setAttack(const.ATT_MELEE) else: if (enemy.type == const.MELEE): self.setAttack(const.ATT_MISSILE) self.setMove(const.MOVE_BACK) if (enemy.type == const.RANGED): self.setMove(const.MOVE_BACK)Máquina de Estados
self.combo.add_combo([],ATTACK_1,"att1") self.combo.add_combo([],ATTACK_2,"att2") self.combo.add_combo([],SPECIAL,"special") self.combo.add_combo([ATTACK_1],ATTACK_2,"att2",stun_time = 3.0) self.combo.add_combo([],ACTION_JUMP+ATTACK_1,"att1") self.combo.add_combo([],ACTION_JUMP+ATTACK_2,"att2") self.combo.add_combo([],MOVE_RUN+ATTACK_1,"att1",controller = scripts.BasicRunAttack(animation = "att1")) self.combo.add_combo([],MOVE_RUN+ATTACK_2,"att1",