Programação de Jogos em Python

Documentos relacionados
Curso de Python em 5 Horas

Gustavo Sverzut Barbieri. 28 de abril de 2005

Python: Exceções, Iteradores e Geradores. Claudio Esperança

VITOR DO PRADO FERREIRA

Programação de Computadores

Programação I Aula 3 Primeiros programas

A Linguagem Python: Uma visão geral. Prof. Alberto Costa Neto Programação em Python

Computação II (MAB 225)

Introdução à Programação / Programação I

AULA 2: INTRODUÇÃO A PYTHON. Luís Feliphe Silva Costa

Introdução à Programação Aula 3 Primeiros programas

Padrão para a codificação em Python

Python para quem sabe Python

Computação II (MAB 225)

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

Programação com objectos

Introdução a Programação de Jogos

PROGRAMAÇÃO E PYTHON. Laboratórios de Informática João Paulo Barraca, André Zúquete, Diogo Gomes

Algoritmos e estrutura de dados

1 Da aula teórica ao Java

Programação de Computadores

Prova Final de Linguagens de Programação - DCC024B -

Aula 13: Detecção de colisão e entradas do usuário

Programação I Aula 19 Aritmética com racionais Pedro Vasconcelos DCC/FCUP

Eventos do mouse p g y a g me.mo m use s. e ge g t_pos() R torn r a u ma tupl p a (x, x , y) y re r fe f re r nte à po p si s ção p g y a g me.

CONTEÚDO PROGRAMÁTICO

CURSO DE INTRODUÇÃO À PROGRAMAÇÃO DE JOGOS EM PYTHON

MCG126 Programação de Computadores II

Aula de hoje. Tipos de Dados e Variáveis. Constantes literais. Dados. Variáveis. Tipagem dinâmica. SCC Introdução à Programação para Engenharias

Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Aula 14: Sons e imagens

Introdução à Computação

Mini apostila de Python - Oficina de Vestibulandos. PET Computação - UFPR September 2016

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Curso de Python em 5 Horas

13 a Aula - Instruções Condicionais. Ciclos. Pré-processador. Variáveis de ambiente. Mestrado em Engenharia Física Tecnológica

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

Abaixo iremos pormenorizar cada um de seus atributos:

Pedro Vasconcelos DCC/FCUP. Programação Funcional 11 a Aula Gráficos usando Gloss

Ensine Seus Filhos A Programar

Descritores de atributos em Python

DURAÇÃO DA PROVA: 2 horas

MAC2166 Introdução à Computação

Orientação a Objetos parte 2 ENCAPSULAMENTO, CLASSES, HERANÇAS

Introdução à Engenharia ENG1000

Fundamentos da Programação

Módulo: PYTHON. Felipe Oliveira

*Exercícios de provas anteriores escolhidos para você estar preparado para qualquer questão na prova. Resoluções em simplificaaulas.

Fundamentos da Programação

Fundamentos de Lógica e Algoritmos. Aula 3.2 IDLE, Variáveis e Tipos. Prof. Dr. Bruno Moreno

Estruturas de Dados Pilhas, Filas, Listas

Introdução ao HTML5 Canvas

Prova Final de Linguagens de Programação - DCC024 - Sistemas de Informação

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Aula de hoje. Comandos. Comandos simples. Comandos. Comandos de controle. Bloco de comandos. SCC Introdução à Programação para Engenharias

Fundamentos da Programação

if not(isinstance(a, int)) or a < 0: raise ValueError ( misterio: arg devia ser inteiro nao negativo ) else: return misterio_aux(a, a + 1)

Funções Compostas. Fundamentos de Algoritmos. Projeto de programas complexos. Roteiro. Um programa é composto por definições de funções e variáveis

PRIMEIROS PASSOS COM PYTHON. Prof. Msc. Luis Filipe Alves Pereira 2015

Introdução à Ciência da Computação Disciplina:

Computação II (MAB 225)

Tutorial Klogo Turtle

Programação de Computadores

Python. Resumo e Exercícios P3

Produtividade e qualidade em Python através da metaprogramação

Prova de Recuperação PMR3201 1o. semestre 2017 Prof. Thiago Martins

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Professor Jefferson Chaves Jefferson de Oliveira Chaves

Objetivos do mini curso. Conhecer a linguagem. Noção de programação utilizando Python. Aprender o báscio.

Laboratório de Programação com Games. Conteúdo: Professor: - Conceitos de programação com Python. Instituto de Computação - UFF

Subprogramação. Vanessa Braganholo

Projeto de Linguagem. Linguagens de Programação

azevedolab.net 2015 Dr. Walter F. de Azevedo Jr. Programação Orientada a Objetos em Processing

Fundamentos da Programação

Recursão. Dados recursivos

Análise de Programação

Programação Orientada a Objetos

Aula 12: Funções. CI208 - Programação de Computadores. Prof. MSc. Diego Roberto Antunes

Aula passada. Aula passada... Sequências Funções puras e modificadores. Listas Tuplos

Lista de Linguagens de Programação 7

Introdução à Programação Aula 17 Deteção e correção de erros

aula05 September 6, 2018

Computação II (MAB 225)

Microservices com

Programação Orientada a Objetos em Python

Desenvolvendo Jogos 2D-Android

Programação I Aula 11 Mais sobre ciclos e iteração

Programação Gráfica Parte 3 Versão em Java 2006 PUCPR Tutoria de Jogos 1º Ano

Algoritmos e estrutura de dados

Projeto de funções e instruções condicionais

Linguagens de Programação

Aula 4 Introdução ao C

String. Demonstrar a utilização e manipulação com os métodos da classe String.

Computação 2. Aula 8 Teórica professor: Leonardo Carvalho

Errata* do livro Programação em Python Fundamentos e Resolução de Problemas

Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2003/2004

Computação 2. Aula 5 Teórica professor: Leonardo Carvalho

Introdução à Programação Aula 4 Definição de funções

Transcrição:

Programação de Jogos em Python Exemplo Prático - Resolvedor de Labirintos Gustavo Sverzut Barbieri GPSL - UNICAMP 28 de abril de 2005 ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 1 / 14

Esta apresentação é uma explicação mais detalhada sobre o código que pode ser encontrado em: http://www.gustavobarbieri.com.br/labirinto_grafico.py Nem todas as partes do código original estão incluídas aqui. Gustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 2 / 14

Importando módulos necessários import pygame from pygame. locals import * from pygame. sprite import Sprite, RenderUpdates Incluímos todos os símbolos de pygame.locals para o espaço de nomes (namespace) atual. Também importamos o Sprite e RenderUpdates para economizar digitação. ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 3 / 14

Função para desenhar retângulos def desenha_quadrado ( tamanho, cor ): img = pygame. Surface ( tamanho ) cinza = Color ( " #808080 " ) cor1 = pygame. color.add ( cor, cinza ) cor2 = pygame. color. subtract ( cor, cinza ) r = Rect ( ( 0, 0 ), tamanho ) r. inflate_ip ( -2, -2 ) r. topleft = ( 1, 1 ) img. fill ( cor ) line = pygame. draw. line line ( img, cor1, r.topleft, r. topright ) line ( img, cor1, r.topleft, r. bottomleft ) line ( img, cor2, r. bottomleft, r. bottomright ) line ( img, cor2, r. bottomright, r. topright ) return img # desenha quadrado () ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 4 / 14

Objeto do jogo Quadrado class Quadrado ( Sprite ): grupos = None # Grupos ao qual este s p r i t e pertence # depois esta variavel de classe sera atribuida # para lembrar dos objetos nao desenhados tamanho = ( 50, 50 ) def init ( self, pos =( 0, 0 ) ): Sprite. init ( self, self. grupos ) self.rect = Rect ( pos, self. tamanho ) # i n i t () # Quadrado Nunca se esqueça de chamar Sprite. init! Sprite. init pode receber uma lista de grupos a qual este Sprite pertence. Nós usaremos o atributo de classe 1, que será atribuído mais tarde, assim todos os Sprites se adicionam automaticamente ao grupo correto. 1 Apesar de usarmos self.grupos, isso foi feito devido ao método de resolução de atributos do Python, primeiro procura-se na instância, depois nas classes que compõe a instância. ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 5 / 14

Objetos do jogo Parede, Vazio,... class Parede ( Quadrado ): pass class Vazio ( Quadrado ): pass class Caminho ( Quadrado ): pass class Entrada ( Quadrado ): pass class Saida ( Quadrado ): pass class CaminhoErrado ( Caminho ): pass class CaminhoCerto ( Caminho ): pass class CaminhoPercorrido ( Caminho ): pass Usa-se uma hierarquia de classes para facilitar mais tarde: Um caminho errado ainda é um caminho, um caminho certo também. ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 6 / 14

Lendo imagens para o labirinto def le_imagens ( self ): """L^e as imagens para cada tipo de peça. Usa -se variavel de classe para evitar que cada objeto tenha uma copia da mesma imagem, economizando memoria. """ t = self. tam_peca if t is None : raise Exception ( " Voc^e deve usar arruma_posicoes () primeiro!" ) Quadrado. tamanho = t # Lê imagens : Parede. image = desenha_quadrado ( t, Color ( " gray35 " ) ) Caminho. image = desenha_quadrado ( t, Color ( " wheat " ) ) Entrada. image = desenha_quadrado ( t, Color ( " magenta " ) ) Saida. image = desenha_quadrado ( t, Color ( " green " ) ) CaminhoCerto. image = desenha_quadrado ( t, Color ( "cyan " ) ) CaminhoErrado. image = desenha_quadrado ( t, Color ( "red " ) ) CaminhoPercorrido. image = desenha_quadrado ( t, Color ( " yellow " ) ) Vazio. image = pygame. Surface ( t ) Vazio. image. set_colorkey ( Color ( " black " ) ) Vazio. image.fill ( Color ( " black " ) ) # le imagens () As atribuições de imagens são feitas para a classe pois... ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 7 / 14

Lendo imagens para o labirinto Usamos variáveis de classe para evitar que cada instância carrege uma cópia, economizando memória Se precisarmos mudar de todas as instâncias, é só mudar esta variável de classe. Se quisermos que uma certa instância tenha uma imagem diferente, é só atribuir à instância e este valor se sobrepõe ao da classe na resolução dos atributos. (Maior Flexibilidade) ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 8 / 14

Desenhando o Labirinto def desenhe ( self, tudo=false ): tela = self. tela nao_desenhados = self. nao_desenhados if tudo : for l in self. mapa : for p in l: tela. blit ( p. image, p ) else : nao_desenhados. draw ( self. tela ) nao_desenhados. empty () # desenhe () O uso de sprites e grupos facilita operações como desenhar apenas o que mudou. Uma instância de Quadrado, quando criada, vai automaticame para o grupo de não desenhados, pois atribuímos este grupo a Quadrado.grupos. Como sempre desenhamos todos os quadrados não desenhados, após a operação esvaziamos o grupo. ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 9 / 14

O Jogo class Jogo ( object ): FPS = 24 RESOLVE_PASSOS_POR_SEG = 0 def init ( self, mapa, tamanho =( 800, 600 ) ): self. clock = pygame.time. Clock () self.tela = pygame. display. set_mode ( tamanho ) self. mapa = mapa self. le_labirinto () # i n i t () def le_labirinto ( self ): self. labirinto = Labirinto ( self.tela, self.mapa ) # l e l a b i r i n t o () ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 10 / 14

O Jogo: Parando e Atualizando a tela def termine ( self ): raise StopIteration # termine () def atualize ( self, tudo=false ): if tudo : pygame. display.flip () else : pygame. display. update () # atualize () Note que devido à falta de argumentos para pygame.display.update(), este tem o mesmo efeito que pygame.display.flip(): atualiza a tela inteira. Em uma implementação futura poderíamos lembrar as áreas que mudaram, resultantes do nao_desenhados.draw() e passar como argumento para o pygame.display.update(), economizando ciclos do processador. ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 11 / 14

Tratando Eventos def trata_eventos ( self ): for e in pygame. event.get ( [ KEYDOWN, QUIT, ACTIVEEVENT ] ): if e. type == QUIT : self. termine () elif e. type == KEYDOWN : if e. key == K_F2 : self. le_labirinto () elif e. key == K_F3 : def callback ( estagio ): pass # removido para caber no s l i d e # callback () self. labirinto. resolve ( callback ) self. labirinto. desenhe () self. atualize () elif e. key == K_ESCAPE : self. termine () elif e. type == ACTIVEEVENT : self. labirinto. desenhe ( True ) self. atualize ( True ) # trata eventos () ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 12 / 14

O Jogo: Laço Principal def rode ( self ): try : # ActiveEvent faz desenhar a t e l a de novo pygame. event.post ( pygame. event. Event ( ACTIVEEVENT ) ) while True : self. clock.tick ( self.fps ) self. trata_eventos () #s e l f. l a b i r i n t o. desenhe () self. atualize () except StopIteration : return # rode () # Jogo ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 13 / 14

E assim se faz um jogo... Dúvidas??? Gustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 14 / 14

Contato Gustavo Sverzut Barbieri Email: barbieri@gmail.com Website: http://www.gustavobarbieri.com.br ICQ: 17249123 MSN: barbieri@gmail.com Jabber: gsbarbieri@jabber.org Obtenha esta palestra em: http://palestras.gustavobarbieri.com.br/pygame/ ustavo Sverzut Barbieri (GPSL - UNICAMP) Programação de Jogos em Python 28 de abril de 2005 15 / 14