Implementação de Aplicações Móveis e Jogos com Python - Aula 3

58
Implementação de Aplicações Móveis e Jogos com Python

description

Implementação de Aplicações Móveis e Jogos com Python

Transcript of Implementação de Aplicações Móveis e Jogos com Python - Aula 3

Implementação de Aplicações Móveis e Jogos com Python

Antes de Comecar

Interpretador Interativo Maquina de testes de código Python

Escolha uma IDE! http://www.python.org.br/wiki/IdesPython Ou o velho Notepad >:)

Review

2ª Aula Orientação a Objetos com Python

Classes Métodos (construtor) Atributos

Herança Módulos e Bibliotecas SDK s60 e Python Introdução ao pys60

Appuifw

Algumas Referências!

PyS60 – Estrutura de uma Aplicação appuifw

O Objeto appuifw.app

Estrutura

PyS60

Exemplo Titulo

import appuifw, e32

def quit(): app_lock.signal()

appuifw.app.exit_key_handler=quit

appuifw.app.title=u"Meu Titulo!"

app_lock=e32.Ao_lock()

app_lock.wait()

PyS60 – Estrutura de uma Aplicação appuifw

appuifw.app.body

Pode ser: Canvas Form Listbox Text

Área pode ser aumentada! appuifw.app.screen = 'full' appuifw.app.screen = 'large' appuifw.app.screen = 'normal'

PyS60

Exemplo Body

import appuifw, e32

def quit(): app_lock.signal()

appuifw.app.exit_key_handler=quit

t=appuifw.Text()appuifw.app.body=t

t.add(u"Texto aqui..")t.clear()t.set(u"Texto inteiro.")t.get()

PyS60

Menu

Podem ser de 2 tipos Popup Menu no key default Selection Lists

PyS60 Exemplo Menu

import appuifw, e32

def quit(): app_lock.signal()

appuifw.app.exit_key_handler=quit

def callback_A():print "A"

def callback_C():print "C"

def callback_D():print "D"

appuifw.app.menu=[(u"Item_A", callback_A), (u"Item_B", ((u"Item_C", callback_C), (u"Item_D", callback_D)))]

app_lock=e32.Ao_lock()app_lock.wait()

PyS60 Exemplo Menu

import appuifw, e32

def quit(): app_lock.signal()

appuifw.app.exit_key_handler=quit

def callback_A():print "A"

def callback_C():print "C"

def callback_D():print "D"

i=appuifw.popup_menu([u"Item1", u"Item2"])

app_lock=e32.Ao_lock()app_lock.wait()

PyS60 Exemplo Menu

import appuifw, e32

def quit(): app_lock.signal()

appuifw.app.exit_key_handler=quit

def callback_A():print "A"

def callback_C():print "C"

def callback_D():print "D"

i=appuifw.selection_list([u"Item1", u"Item2"])

app_lock=e32.Ao_lock()app_lock.wait()

PyS60 Exemplo Menuimport appuifw, e32

def quit(): app_lock.signal()

appuifw.app.exit_key_handler=quit

def callback_A():print "A"

def callback_C():print "C"

def callback_D():print "D"

i=appuifw.multi_selection_list([u"Item1", u"Item2"], style='checkbox', search_field=1)

app_lock=e32.Ao_lock()app_lock.wait()

PyS60 - Teclado

Exerc cio!í

Crie uma Agenda de Contatos. O usuário será capaz de escolher entre adicionar pessoas a agenda (onde o programa pede Nome e Telefone da pessoa) ou buscar pelo nome usando uma multi_selection list.

Ao selecionar o nome da pessoa, o programa deverá imprimir em um appuifw.Text() o Nome da pessoa e o Telefone dela. Ao selecionar o menu novamente o appuifw.Text() deverá ser apagado.

É desejável que o programa utilize Orientação a Objetos.

Teclado

PyS60 - Teclado

Keyboard

É preciso associar um canvas ao app.body Área drawable Captura eventos do teclado

canvas = appuifw.Canvas()

appuifw.app.body = canvas

PyS60 - Teclado Keyboard

Mapa de Teclas

PyS60 - Teclado

Exemplo de Usoimport appuifw, key_codes, e32

def keys(event): if event['keycode'] == key_codes.EKeyUpArrow: appuifw.note(u"Up arrow foi pressionado!") elif event['keycode'] == key_codes.EKeyDownArrow: appuifw.note(u"Down Arrow foi pressionado!")

def quit(): app_lock.signal()

canvas = appuifw.Canvas(event_callback = keys)appuifw.app.body = canvasappuifw.app.exit_key_handler = quitapp_lock = e32.Ao_lock()app_lock.wait()

PyS60 - Teclado

Exerc cio!í

Criar uma aplicação que capture eventos do teclado e chame funções da appuifw (query e note, por exemplo.)

É desejável que o programa utilize Orientação a Objetos, com bibliotecas de captura de eventos e de gerência dos callbacks.

Graphics e Canvas

Graphics e appuifw.Canvas

Gráficos 2d e 3d

Interface mais customizada

Gerencia Imagens (graphics.Image)

Desenhos Geométricos Elipse, linha, retângulo

appuifw.app.body = appuifw.Canvas()

Graphics e appuifw.Canvas

Gráficos 2d e 3d

Interface mais customizada

Gerencia Imagens (graphics.Image)

Desenhos Geométricos Elipse, linha, retângulo

appuifw.app.body = appuifw.Canvas()

appuifw.Canvas

appuifw.Canvas

Criação de um Canvas no body da aplicação

Callbacks de redraw e event

Dentro do Canvas pode-se criar:

Linhas Poligonos Retângulos Elipse Pontos Textos

O método blit()

Graphics e Canvas Exemploimport graphics, e32, appuifw

app_lock = e32.Ao_lock()

def quit():app_lock.signal()

appuifw.app.exit_key_handler = quit

canvas = appuifw.Canvas()appuifw.app.body = canvasappuifw.app.screen = 'full'canvas.clear(0x339900)

canvas.line((40,50,180,20),0)canvas.rectangle((30,45,110,100), fill=(255,255,255))canvas.ellipse((0,0,100,50), fill=(255,0,0))canvas.text((150,150),u”Texto”,(0,0,0),'title')

app_lock.wait()

Graphics e Canvas

Gerenciando Imagens

graphics.Image + appuifw.Canvas graphics.Image é um buffer Evita “flicks” na tela blit()

graphics.Image resize, transpose, save

Graphics e Canvas Exemplo

import e32,key_codes,graphicsfrom appuifw import *

def draw_rect(): img.rectangle((50,100,100,150), fill = (255,255,0))

def draw_point(): img.point((90,50), outline=(255,0,0),width=30)

def handle_redraw(rect):if img: canvas.blit(img)

def handle_event(event): ev = event[“keycode”] if event[“type”] == EEventKeyDown: img.clear((0,0,255)) if ev == key_codes.EKeyUpArrow: draw_point() elif ev == key_codes.EKeyDownArrow: draw_rect()

def quit(): app_lock.signal()

img = None

canvas = Canvas(redraw_callback = \handle_redraw, event_callback = \handle_event)

app.body = canvasapp.screen = 'full'

app.exit_key_handler = quit

w, h = canvas.size

img = graphics.Image.new((w,h))img.clear((0,0,255))

app_lock = e32.Ao_lock()app_lock.wait()

PyS60 - Teclado

Exerc cio!í

Criar uma aplicação que, a cada evento gerado do joystick, mude a cor do body.

Criar também um menu (popup_menu) com a escolha de escrever um nome (query). Esse nome escrito irá aparecer no meio da tela com a cor preta (usando canvas.text ao invés de appuifw.text).

Hora do Lanche!

Data Handling

Data Handling

Gerenciamento de Arquivos e Dados

Data Handling

Gerenciamento de Arquivos e Dados

C: → Memória Interna do Dispositivo D: → RAM (read-only) E: → Cartão de Memória Z: → ROM (read-only)

Fotos C:\Images ou E:\Images

Músicas C:\Sounds ou E:\Sounds

Arquivos C:\Data ou E:\Data

Data Handling

Criando um Diretório para sua Aplicação

import os, os.path

PATH = u”C:\\Data\\MinhaAplicação”if not os.path.exists(PATH): os.makedirs(PATH)

Criando Arquivos

Os modos podem ser:

a → append w → write r → read

Arquivo = open(“C:\\Data\\nomedoarquivo.txt”,”w”)

wb → Escreve binário

Data Handling

Escrevendo e lendo de um Arquivo

arquivo = open(“C:\\Data\\contatos.txt”,”w”)

arquivo.write(“Essa linha será escrita no arquivo.”)arquivo.write(“Essa aqui já sera a segunda linha do arquivo.”)

arquivo.close()

arquivo = open(“C:\\Data\\contatos.txt”,”r”)

for linha in arquivo:print linha

Data Handling

O módulo e32dbm

“Banco de Dados” para Dispositivos Symbian Tratamento semelhante ao de objetos File Trata Dicionários Gerencia arquivos maiores e mais rapidamente

e32dbm.open(DB_FILE, modo)

Modo pode ser:

r → Abre a DB pra leitura w → Abre a DB para escrita c → Leitura e Escrita (Se não existir, cria)

Se 'f' for colocado a frente do modo, as modificações no banco ficam em memória até o close() do db

Data Handling

Exemplo

Import e32dbm

db = e32dbm.open(“C:\\Data\\database.db”,”cf”)

db[“Nome”] = u”Flávio Ribeiro”db[“Idade”] = 21

for key, value in db.items():print “Chave: “, key

print “Valor:”, value

db.close()

Módulo responsável por informações do sistema

sysinfo.battery() Retorna o nivel da bateria (entre 0 e 7)

sysinfo.imei() Retorna o número de identificação do celular

sysinfo.active_profile() Retorna o perfil utilizado no momento (Silencioso, Reunião,

etc)

sysinfo.display_pixels() Retorna o tamanho da tela em pixels (muito importante)

Sysinfo

Módulo responsável por informações do sistema

sysinfo.free_drivespace() Retorna o espaço livre em bytes em cada drive {u'C:': 58463232, u'D:': 9494528, u'Z:': 0}

sysinfo.total_ram() Retorna o tamanho da memória RAM

sysinfo.free_ram() Retorna a memória RAM livre

sysinfo.signal_bars() Retorna o sinal da antena (de 0 a 7)

sysinfo.sw_version() Versão do firmware

Sysinfo

Jogos com Python

Jogos com Python

Jogos com Python

Exemplos de Jogos com Python

Frets on Fire

Civilization

Battlefield 2

InterZone

Jogos com Python

API's e Frameworks

PyGlet

PyOpenGL

Panda3D

Pygame Mais popular (também mais difundida) SDL (Simple DirectMedia Layer) Sprites, Actions, Effects Linux, Windows, Mac, XO-OLPC, Maemo, s60

Jogos com Python

Definições

Surface Superfícies a serem desenhadas 2d ou 3d (transparência Em memória ou placa de vídeo

Rect Retângulos Delimitam sprites

Display Manipula a tela pygame.display.flip() Dirty Rect

Jogos com Python

Definições

Draw Desenha no display Linhas, Circulos, Polígonos

Event Recupera eventos do Input (Teclado, Joystick) Delimitam sprites

Clock Define os frames por segundo pygame.clock.tick()

Jogos com Python

Definições

Sprite Agente ativo pygame.sprite.Sprite e pygame.sprite.Group

Colisões Comparação de retângulos dos sprites

Game Loop Loop Infinito

Captura eventos do input Trata os eventos 'Pinta' os sprites nas novas localizações Atualiza a tela (flip() ou update())

Jogos com Python

Demo!

Jogos com Python

Jogos com Python

Jogos com Python

Jogos com Python

Dicas de Organizaçãode um Projeto

Várias funções em um só arquivo Arquivo: operacoes.py Funções:

soma(x,y) subtrai(x,y) divide(x,y)

Namespace e Dicas de um projeto Python

import operacoes

operacoes.soma(10,20)operacoes.divide(100,2)

Várias Classes em um só arquivo Arquivo: funcionarios.py Classes:

Presidente Diretor Estagiario

Namespace e Dicas de um projeto Python

import funcionarios

flavio = funcionarios.Estagiario()

lucas = funcionarios.Presidente()

flavio.trabalha()lucas.toma_cafe()

Métodos trabalha() toma_cafe()

Várias Classes em um só arquivo (Exemplo II) Arquivo: funcionarios.py Classes:

Presidente Diretor Estagiario

Namespace e Dicas de um projeto Python

from funcionarios import *

flavio = Estagiario()

lucas = Presidente()

flavio.trabalha()lucas.toma_cafe()

Métodos trabalha() toma_cafe()

Pacotes Pasta: conexoes/ Arquivo __init__.py (vazio) Arquivos:

bluetooth.py → Classes Server e Client wireless.py → Classes AccessPoint e Client

Namespace e Dicas de um projeto Python

import conexoes.bluetoothimport conexoes.wireless

bt = conexoes.bluetooth.Client()

wifi = conexoes.wireless.AccessPoint()

Pacotes (Exemplo II) Pasta: conexoes/ Arquivo __init__.py (vazio) Arquivos:

bluetooth.py → Classes Server e Client wireless.py → Classes AccessPoint e Client

Namespace e Dicas de um projeto Python

from conexoes import bluetooth

bt = bluetooth.Client()

Pacotes (Exemplo III) Pasta: conexoes/ Arquivo __init__.py (vazio) Arquivos:

bluetooth.py → Classes Server e Client wireless.py → Classes AccessPoint e Client

Namespace e Dicas de um projeto Python

from conexoes.bluetooth import Server

bt = Server()

Dicas: Crie uma pasta pra seu programa:

Deixe uma pasta do seu programa para os códigos (src) Deixe outra pasta para Arquivos no geral (files) Crie outras necessárias

Namespace e Dicas de um projeto Python

import os, os.path

PATH = u”C:\\Data\\MinhaAplicação”if not os.path.exists(PATH): os.makedirs(PATH)

import os, os.path

Sources = u”C:\\Data\\MinhaAplicação\\src”if not os.path.exists(Sources): os.makedirs(Sources)

Dicas: Coloque a pasta de códigos no seu Python Path

Assim ele será visível e poderá ser incluído nos seus códigos.

Namespace e Dicas de um projeto Python

import sys

Sources = u”C:\\Data\\MinhaAplicação\\src”sys.path.append(Sources)

Projetos!