O Python para S60 é uma linguagem robusta, simples e bastante poderosa. Apesar de não prover API's nativas para desenvolvimento de games, como as existentes no PyGame, podemos facilmente criar algumas destas classes.
O exemplo a seguir serve apenas como base para o desenvolvimento da classe Sprite existente no MIDP 2.0 do Java ME. A criação de um framework para games ajudaria a simplificar o desenvolvimento de aplicações com o Python para S60.
Se você está iniciando em Python para S60, aconselho a leitura prévia de materiais de introdução.
Caso este seja seu primeiro contato com o Python para S60, faça o download do runtime e do python script shell.
Após a instalação, crie um diretório com o nome Python no seu cartão de memória e copie o código abaixo em um novo arquivo com a extensão .py
A imagem também deve ser copiada para a pasta Python recém-criada no cartão de memória.
import appuifw
import e32
from graphics import Image
## Sprite
# Similar a classe Sprite do pacote game disponível na MIDP 2.0
# Este trecho de código foi criado em apenas 30 minutos, e nao foi exaustivamente testado
# podendo existir diversas falhas em sua implementacao, qualquer melhoria é bem vinda.
class Sprite:
## Construtor da classe
# @param self The object pointer.
def __init__( self, aImg, aFrWidth, aFrHeight ):
self._iImg = aImg
self._iFrWidth = aFrWidth
self._iFrHeight = aFrHeight
self._iCurrentFrame = 1
self._iIndFrame = 0
self._iWidth, self._iHeight = self._iImg.size
self._iMaxWidthFrames = self._iWidth / self._iFrWidth
self._iMaxHeightFrames = self._iHeight / self._iFrHeight
self._iFrameSequence = [0]
self._iPosX = 0
self._iPosY = 0
# end __init__
## Seta a sequencia de frames
# @param self The object pointer.
# @param aSeq Sequencia dos frames.
def set_frame_sequence( self, aSeq ):
self._iIndFrame = 0
self._iFrameSequence = aSeq
self._iCurrentFrame = self._iFrameSequence[self._iIndFrame]
# end set_frame_sequence
## Seta o posicionamento do objeto na tela
# @param self The object pointer.
# @param aPos Posicionamento do objeto.
def set_position( self, aPos ):
self._iPosX, self._iPosY = aPos
# end set_position
## Seta o próximo frame
# @param self The object pointer.
def next_frame( self ):
self._iIndFrame += 1
if self._iIndFrame == len(self._iFrameSequence):
self._iIndFrame = 0
self._iCurrentFrame = self._iFrameSequence[self._iIndFrame]
# end next_frame
## Seta o frame atual
# @param self The object pointer.
# @param aFrame frame.
def set_frame( self, aFrame ):
self._iCurrentFrame = self._iFrameSequence[aFrame]
# end set_frame
## Desenha o objeto na tela de acordo com a posicao e o frame atual
# @param self The object pointer.
# @param aGraphics Canvas.
def paint ( self, aGraphics ):
aGraphics.blit(self._iImg, target=(self._iPosX, self._iPosY), \
source=((self._iCurrentFrame-1) * self._iFrWidth, 0, self._iCurrentFrame * self._iFrWidth, self._iCurrentFrame * self._iFrHeight))
# end paint
## SpriteAnimation
# Responsavel por criar os objetos na tela
class SpriteAnimation:
## Construtor da classe
# @param self The object pointer.
def __init__( self ):
# Define o corpo da aplicação
self._iCanvas = appuifw.Canvas()
appuifw.body = self._iCanvas
# altura e largura do canvas
self._cWidth, self._cHeight = self._iCanvas.size
# Sprite
self._iImgPlayer = Image.open("e:\\Python\\tiled_owner_flatten.png")
self._iPlayer = Sprite(self._iImgPlayer, 60, 70)
self._iPlayer.set_frame_sequence([5, 6, 7])
self._iPlayer.set_position((self._cWidth/2 - 30, self._cHeight/2 - 35))
# define o evento de saída da aplicação
appuifw.app.exit_key_handler = self.quit
# seta o status da aplicacao
self._iRunning = True
# define um background branco
self._iCanvas.rectangle((0, 0, 240, 320), outline = 0xFFFFFF, width=240)
# define a resolucao da tela
appuifw.app.screen = 'full' # (full, large, normal)
# cria um loop principal da aplicação
self.paint()
# end __init__
## Redesenha os objetos na tela
# @param self The object pointer.
def paint( self ):
while self._iRunning:
self._iCanvas.clear()
self._iPlayer.paint( self._iCanvas )
self._iPlayer.next_frame()
# Processa eventos pendentes
e32.ao_yield()
# taxa de atualização
e32.ao_sleep(0.1)
# end paint
## Manipula a saída do aplicativo
# @param self The object pointer.
def quit( self ):
self._iRunning = 0
# end quit
animation = SpriteAnimation()
FelipeAndrade -- 04:35, 24 June 2008 (EEST)