Browse Source

refactor character movement

raylu 12 năm trước cách đây
mục cha
commit
7f233c7267
2 tập tin đã thay đổi với 58 bổ sung43 xóa
  1. 43 0
      character.py
  2. 15 43
      troll

+ 43 - 0
character.py

@@ -0,0 +1,43 @@
+import pygame
+
+from tileset import Tileset
+
+class Character(object):
+	movement = [0, 0]
+
+	def __init__(self, tilesize):
+		self.tilesize = tilesize
+		self.render_x = 0
+		self.render_y = 13*tilesize
+
+	def frame(self, keys):
+		# are we done moving?
+		if self.render_x % self.tilesize == 0:
+			self.movement[0] = 0
+		if self.render_y % self.tilesize == 0:
+			self.movement[1] = 0
+
+		SPEED = 2
+		direction = None
+		# can we start moving?
+		if self.movement[1] == 0:
+			if keys[pygame.K_DOWN]:
+				self.movement[1] = SPEED
+				direction = Tileset.DOWN
+			elif keys[pygame.K_UP]:
+				self.movement[1] = -SPEED
+				direction = Tileset.UP
+		if self.movement[0] == 0:
+			if keys[pygame.K_RIGHT]:
+				self.movement[0] = SPEED
+				if not self.movement[1]: # prefer up/down when moving diagonally
+					direction = Tileset.RIGHT
+			elif keys[pygame.K_LEFT]:
+				self.movement[0] = -SPEED
+				if not self.movement[1]:
+					direction = Tileset.LEFT
+
+		# move!
+		self.render_x += self.movement[0]
+		self.render_y += self.movement[1]
+		return direction

+ 15 - 43
troll

@@ -5,16 +5,16 @@ import sys
 import pygame
 
 from tileset import Tileset
+from character import Character
 
 pygame.init()
 screen = pygame.display.set_mode((800, 800))
 tileset = Tileset(screen)
 tileset.load_level()
+character = Character(tileset.tilesize)
 clock = pygame.time.Clock()
 
 black = (0, 0, 0)
-render_x = 0
-render_y = 13*tileset.tilesize
 
 keys = {
 	pygame.K_LEFT: False,
@@ -22,53 +22,25 @@ keys = {
 	pygame.K_UP: False,
 	pygame.K_DOWN: False,
 }
-def handle_event(event):
-	if event.type == pygame.KEYDOWN:
-		if event.key in keys.iterkeys():
-			keys[event.key] = True
-	elif event.type == pygame.KEYUP:
-		if event.key in keys.iterkeys():
-			keys[event.key] = False
-	elif event.type == pygame.QUIT:
-		sys.exit()
 
 direction = Tileset.RIGHT
-movement = [0, 0]
 while True:
 	clock.tick(60)
 	for event in pygame.event.get():
-		handle_event(event)
-
-	# are we done moving?
-	if render_x % tileset.tilesize == 0:
-		movement[0] = 0
-	if render_y % tileset.tilesize == 0:
-		movement[1] = 0
-
-	SPEED = 2
-	# can we start moving?
-	if movement[1] == 0:
-		if keys[pygame.K_DOWN]:
-			movement[1] = SPEED
-			direction = Tileset.DOWN
-		elif keys[pygame.K_UP]:
-			movement[1] = -SPEED
-			direction = Tileset.UP
-	if movement[0] == 0:
-		if keys[pygame.K_RIGHT]:
-			movement[0] = SPEED
-			if not movement[1]: # prefer up/down when moving diagonally
-				direction = Tileset.RIGHT
-		elif keys[pygame.K_LEFT]:
-			movement[0] = -SPEED
-			if not movement[1]:
-				direction = Tileset.LEFT
-
-	# move!
-	render_x += movement[0]
-	render_y += movement[1]
+		if event.type == pygame.KEYDOWN:
+			if event.key in keys.iterkeys():
+				keys[event.key] = True
+		elif event.type == pygame.KEYUP:
+			if event.key in keys.iterkeys():
+				keys[event.key] = False
+		elif event.type == pygame.QUIT:
+			sys.exit()
+
+	new_direction = character.frame(keys)
+	if new_direction is not None:
+		direction = new_direction
 
 	screen.fill(black)
 	tileset.render_level()
-	tileset.render_person((render_x, render_y), direction)
+	tileset.render_person((character.render_x, character.render_y), direction)
 	pygame.display.flip()