×
Namespaces

Variants
Actions
Revision as of 06:53, 30 November 2011 by hamishwillee (Talk | contribs)

Archived:MovingBall em PySymbian

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Artigo
Criado por cabezonxdg em 19 Oct 2008
Última alteração feita por hamishwillee em 30 Nov 2011
O exemplo proposto simula o movimento de uma bola na tela utilizando o acelerômetro encontrado em alguns dispositivos como o Nokia N95. Os dados recebidos pelo acelerometro são tratados e convertidos para coordenadas da tela. Utiliza-se uma lista circular para reduzir possíveis distorções dos dados e para conversão destes dados em coordenadas de tela utiliza-se o algoritmo proposto por Jouni Miettunen.
import sensor
import e32
import appuifw
import graphics
 
BOLA_RAIO = 10
TAMANHO_BUFFER = 16
 
class RingBuffer:
def __init__(self, size):
self.data = [0 for i in xrange(size)]
 
def append(self, x):
self.data.pop(0)
self.data.append(x)
 
def media(self):
soma = 0
media = 0
while soma < len(self.data):
media = media + self.data[soma]
soma = soma + 1
 
return media/TAMANHO_BUFFER
 
class Acelerometro:
def __init__(self):
self.lista_sensores = sensor.sensors()
self.buffer_x = RingBuffer(TAMANHO_BUFFER)
self.buffer_y = RingBuffer(TAMANHO_BUFFER)
 
def iniciar_sensor(self):
if self.lista_sensores.has_key('AccSensor'): # verifica se o acelerometro esta presente
self.dados_sensor = self.lista_sensores['AccSensor']
self.acc_sensor = sensor.Sensor( self.dados_sensor['id'], self.dados_sensor['category'] )
self.acc_sensor.set_event_filter( sensor.EventFilter() ) # determina o filtro para os dados do acelerometro
self.acc_sensor.connect( self.tratar_dados ) # callback que recebera os dados do acelerometro
 
def tratar_dados(self, dados):
self.buffer_x.append( dados['data_2'] )
self.buffer_y.append( dados['data_1'] )
 
class Bola:
def __init__(self):
self.coordenadas = [100, 140, 120, 160]
self.cor = (255,0,0)
 
class App:
def __init__(self):
self.app_estado = 1
self.temporizador = e32.Ao_timer()
self.bola = Bola()
self.acelerometro = Acelerometro()
appuifw.app.screen = 'full'
self.canvas = appuifw.Canvas()
appuifw.app.body = self.canvas
appuifw.app.exit_key_handler = self.sair
self.img_buffer = graphics.Image.new( self.canvas.size )
 
def iniciar(self):
self.acelerometro.iniciar_sensor()
self.loop()
 
def loop(self):
while self.app_estado:
self.gerar_coordenadas_bola()
self.desenhar()
self.temporizador.after(0.01)
 
def desenhar(self):
self.img_buffer.clear()
self.img_buffer.ellipse( self.bola.coordenadas, fill = self.bola.cor )
self.canvas.blit(self.img_buffer)
 
def gerar_coordenadas_bola(self):
self.bola.coordenadas[0] = self.definir_coordenada(self.acelerometro.buffer_x.media(), self.canvas.size[0])
self.bola.coordenadas[1] = self.definir_coordenada(self.acelerometro.buffer_y.media(), self.canvas.size[1])
self.bola.coordenadas[2] = self.bola.coordenadas[0] + (BOLA_RAIO*2)
self.bola.coordenadas[3] = self.bola.coordenadas[1] + (BOLA_RAIO*2)
 
def definir_coordenada(self, dados_acc, dimensao_tela):
return dimensao_tela - ((dados_acc + 300) * dimensao_tela)/600
 
def sair(self):
self.app_estado = 0
self.canvas = None
 
aplicacao = App()
aplicacao.iniciar()
174 page views in the last 30 days.