This is an old revision of the document!
Spiele auf der OxoCard mit dem Beschleunigungssensor
Der folgende Code sollte auf direkt auf der OxoCard getestet werden (macht sonst kaum Spass).
from oxocard import * from ivobuttons import * from oxoaccelerometer import * # Zustand vom Spiel pos = [0,0] # x- und y-Koordinaten in einer Liste, pos[0], und pos[1] farbe = RED naechste = [0,0] # Zeit, ab wann die nächste Bewegung in x- und y-Richtung stattfinden darf. # Beschleunigungssensor acc = Accelerometer.create() # Funktionen zum Zeichnen und löschen des Spielzustands def zeichnen(): global pos, farbe # Veriablen von ausserhalb dieser Funktion verwenden fastDot(pos[0], pos[1], farbe) fastRepaint() def loeschen(): global pos fastDot(pos[0], pos[1], BLACK) # Begrenzt einen Wert zwischen 0 und 7 (damit man sicher auf dem Display bleibt). def clip(v): if v<0: v=0 if v>7: v=7 return v zeichnen() pneu = [0,0] # Variable für neue Position while True: ac = acc.getValues() # Aktuelle Beschleunigung auslesen pneu[0], pneu[1] = pos[0], pos[1] # Kopie der Position zeit = getms() # Aktuelle Zeit for i in range(2): # i=0 für x-Koordinate, i=1 für y-Koordinate if abs(ac[i])>1 and zeit>naechste[i]: # Mehr als 1 m/s^2 Beschleunigung in x- bzw. y-Richtung und nächste Bewegung kann schon stattfinden dir = 1 # Richtung positiv if ac[i]<0: # Ausser wenn Beschleunigung negativ dir = -1 if i==1: # Vorzeichenwechsel für y dir = -dir pneu[i] = clip(pos[i]+dir) # Neue Position, garantiert auf Display dank oben definierter clip-Funktion # Kleine Beschleunigung, länger bis zur nächsten Bewegung warten, grosse Beschleunigung -> wenig warten. naechste[i] = zeit + 200 - abs(ac[i]*20) # Nur wenn sich etwas geändert hat auch neu zeichnen. # Arrays sind dann gleich (==) wenn alle Elemente gleich sind. if pneu!=pos: loeschen() pos[0], pos[1] = pneu[0], pneu[1] zeichnen()
Weitere Demos
<hidden Punkt mit Trail>
- trail.py
from oxocard import * from ivobuttons import * from oxoaccelerometer import * # Zustand vom Spiel pos = [0,0] # x- und y-Koordinaten in einer Liste, pos[0], und pos[1] farbe = RED # Farbe vom Punkt naechste = [0,0] # Zeit, ab wann die nächste Bewegung in x- und y-Richtung stattfinden darf. # Position und Farben vom Trail ntrail = 12 trail = [[0,0] for i in range(ntrail)] farben = [(255-i*20,0,i*20) for i in range(ntrail)] farben[ntrail-1]=BLACK trailstart = 0 wegmit = getms() # Maximale Zeit bis der Trail nachkommt # Beschleunigungssensor acc = Accelerometer.create() # Funktionen zum Zeichnen und löschen des Spielzustands def zeichnen(): global pos, farbe, trail, farben, trailstart, ntrail # Veriablen von ausserhalb dieser Funktion verwenden for i in range(ntrail): t = (i+trailstart)%ntrail fastDot(trail[t][0], trail[t][1], farben[i]) fastDot(pos[0], pos[1], farbe) fastRepaint() def loeschen(): global pos, trail, trailstart fastDot(pos[0], pos[1], BLACK) t = trailstart-1 # Negative Indizies sind ok und greifen von hinten auf die Liste zu fastDot(trail[t][0], trail[t][1], BLACK) def trailsave(): global pos, trail, trailstart trailstart = (trailstart+ntrail-1)%ntrail trail[trailstart][0] = pos[0] trail[trailstart][1] = pos[1] # Begrenzt einen Wert zwischen 0 und 7 (damit man sicher auf dem Display bleibt). def clip(v): if v<0: v=0 if v>7: v=7 return v zeichnen() pneu = [0,0] # Variable für neue Position while True: ac = acc.getValues() # Aktuelle Beschleunigung auslesen pneu[0], pneu[1] = pos[0], pos[1] # Kopie der Position zeit = getms() # Aktuelle Zeit for i in range(2): # i=0 für x-Koordinate, i=1 für y-Koordinate if abs(ac[i])>1 and zeit>naechste[i]: # Mehr atls 1 m/s^2 Beschleunigung in x- bzw. y-Richtung und nächste Bewegung kann schon stattfinden dir = 1 # Richtung positiv if ac[i]<0: # Ausser wenn Beschleunigung negativ dir = -1 if i==1: # Vorzeichenwechsel für y dir = -dir pneu[i] = clip(pos[i]+dir) # Neue Position, garantiert auf Display dank oben definierter clip-Funktion # Kleine Beschleunigung, länger bis zur nächsten Bewegung warten, grosse Beschleunigung -> wenig warten. naechste[i] = zeit + 100 - abs(ac[i]*10) # Nur wenn sich etwas geändert hat auch neu zeichnen. # Arrays sind dann gleich (==) wenn alle Elemente gleich sind. if pneu!=pos: trailsave() wegmit = zeit loeschen() pos[0], pos[1] = pneu[0], pneu[1] zeichnen() if zeit-wegmit>100: wegmit=zeit loeschen() trailsave() zeichnen()