# touch.py # Walker M. White (wmw2) # November 17, 2014 """Module to show off how to process touches in game2d""" import colormodel from game2d import * ### CONSTANTS ### # Window Size WINDOW_WIDTH = 512 WINDOW_HEIGHT = 512 # Animation Frames that constitute a click CLICK_SPEED = 30 ### CONTROLLER CLASS ### class Touch(GameApp): """Track the mouse to draw freehand lines Instance Attributes: view [GView]: the view (inherited from Game) last [GPoint or None if mouse was not down last frame]: last mouse position time [int >= 0, 0 if mouse state changed]: frames since mouse last changed (pressed, released) clicks [int >= 0]: # of fast clicks in a row lines [list of GLine]: set of lines to be drawn """ # THREE MAIN METHODS def init(self): """Special initialization method to create attributes. Not the SAME as __init__. DO NOT DEFINE __init___.""" self.last = None self.time = 0 self.clicks = 0 self.lines = [] def update(self,dt): """Draw new lines or erase them all.""" # helper method to detect a click self._detectClick() # Erase on double click if self.clicks >= 2: self._processDoubleClick() else: self._processDrawing() # Update mouse position (must do last) self.last = self.view.touch def draw(self): """Draw the lines""" for line in self.lines: line.draw(self.view) # HELPER METHODS def _detectClick(self): """Check for change in mouse state. A click is a releas, CLICK_SPEED frames after a down.""" touch = self.view.touch # Increment the timer self.time = self.time + 1 # Reset timer on a press if not touch is None and self.last is None: # Reset clicks if not fast enought if self.time >= CLICK_SPEED: self.clicks = 0 self.time = 0 # Reset timer on release if touch is None and not self.last is None: # Add click if fast enough if self.time < CLICK_SPEED: self.clicks = self.clicks + 1 else: self.clicks = 1 self.time = 0 def _processDoubleClick(self): """Clear the screen and reset click count.""" self.clicks = 0 self.lines = [] def _processDrawing(self): """Add a new line if last is not None""" touch = self.view.touch if not self.last is None and not touch is None: # Specify a line as list of two points points = [self.last.x,self.last.y,touch.x,touch.y] line = GLine(points=points,linecolor=colormodel.RED) self.lines.append(line) # Script Code if __name__ == '__main__': Touch(width=WINDOW_WIDTH,height=WINDOW_HEIGHT,fps=60.0).run()