def __init__(self, game, pos1, pos2, speed, sizeScale=1): pygame.sprite.Sprite.__init__(self) self.game = game self.image = pygame.transform.scale(Enemy.orig_image, Enemy.size * sizeScale) self.rect = self.image.get_rect(center=pos1) self.pos1, self.pos2 = vector.Vector(pos1), vector.Vector(pos2) self.dist = (self.pos2 - self.pos1).length() self.speed = speed self.direction = (self.pos2 - self.pos1).normalized() self.state = Enemy.toP2
def update(self): self.rect.move_ip(self.direction * self.speed) if self.state == Enemy.toP2 and (vector.Vector(self.rect.center) - self.pos1).length() >= self.dist: self.direction *= -1 self.state = Enemy.toP1 elif self.state == Enemy.toP1 and (vector.Vector(self.rect.center) - self.pos2).length() >= self.dist: self.direction *= -1 self.state = Enemy.toP2 if self.rect.colliderect(self.game.player): self.game.restartLevel()
def loadLevel(self, path): screenRect = self.game.screen.get_rect() tree = xml.etree.ElementTree.parse(path) root = tree.getroot() # level.name=root.get("name") size = _makeVec(root.get("size")) scale = min(screenRect.width / size.x, screenRect.height / size.y) levelRect = pygame.Rect((0, 0), size * scale) levelRect.center = screenRect.center offset = vector.Vector(levelRect.topleft) self.game.player = self.makePlayer(_makeVec(root.get("playerPos")), scale, offset) self.game.orig_player_pos = self.game.player.rect.center for element in root.iterfind("wall"): self.makeWall(_makeVec(element.get("pos")), _makeVec(element.get("size")), scale, offset) for element in root.iterfind("enemy"): self.makeEnemy(_makeVec(element.get("pos1")), _makeVec(element.get("pos2")), int(element.get("speed")), scale, offset) for element in root.iterfind("food"): self.makeFood(_makeVec(element.get("pos")), scale, offset) for element in root.iterfind("target"): self.makeTarget(_makeVec(element.get("pos")), _makeVec(element.get("size")), scale, offset)
class Enemy(pygame.sprite.Sprite): size = vector.Vector(16, 16) orig_image = pygame.image.load( os.path.join("resources", "img", "Enemy.png")) toP1, toP2 = 1, 2 def __init__(self, game, pos1, pos2, speed, sizeScale=1): pygame.sprite.Sprite.__init__(self) self.game = game self.image = pygame.transform.scale(Enemy.orig_image, Enemy.size * sizeScale) self.rect = self.image.get_rect(center=pos1) self.pos1, self.pos2 = vector.Vector(pos1), vector.Vector(pos2) self.dist = (self.pos2 - self.pos1).length() self.speed = speed self.direction = (self.pos2 - self.pos1).normalized() self.state = Enemy.toP2 def update(self): self.rect.move_ip(self.direction * self.speed) if self.state == Enemy.toP2 and (vector.Vector(self.rect.center) - self.pos1).length() >= self.dist: self.direction *= -1 self.state = Enemy.toP1 elif self.state == Enemy.toP1 and (vector.Vector(self.rect.center) - self.pos2).length() >= self.dist: self.direction *= -1 self.state = Enemy.toP2 if self.rect.colliderect(self.game.player): self.game.restartLevel()
class Food(pygame.sprite.Sprite): size = vector.Vector(8, 8) orig_image = pygame.image.load(os.path.join("resources", "img", "Food.png")) def __init__(self, game, pos, sizeScale=1): pygame.sprite.Sprite.__init__(self) self.game = game self.image = pygame.transform.scale(Food.orig_image, Food.size * sizeScale) self.rect = self.image.get_rect(center=pos) def update(self): if self.rect.colliderect(self.game.player): self.kill()
class Player(pygame.sprite.Sprite): size = vector.Vector(16, 16) orig_image = pygame.image.load( os.path.join("resources", "img", "Player.png")) orig_speed = 5 def __init__(self, game, pos, sizeScale=1): pygame.sprite.Sprite.__init__(self) self.game = game self.image = Player.orig_image self.rect = self.image.get_rect(center=pos) self.speed = Player.orig_speed self.scale(sizeScale) def scale(self, scale): self.image = pygame.transform.scale(Player.orig_image, Player.size * scale) self.rect = self.image.get_rect(center=self.rect.center) self.speed = Player.orig_speed * scale def update(self): if self.game.pressedKeys[pygame.K_UP]: self.move(0, -self.speed) elif self.game.pressedKeys[pygame.K_DOWN]: self.move(0, self.speed) if self.game.pressedKeys[pygame.K_RIGHT]: self.move(self.speed, 0) elif self.game.pressedKeys[pygame.K_LEFT]: self.move(-self.speed, 0) def move(self, x, y): self.rect.move_ip(x, y) for wall in pygame.sprite.spritecollide(self, self.game.walls, False): if x > 0: self.rect.right = wall.rect.left elif x < 0: self.rect.left = wall.rect.right if y > 0: self.rect.bottom = wall.rect.top elif y < 0: self.rect.top = wall.rect.bottom
def _makeVec(x, sep="x"): return vector.Vector(int(i) for i in x.split(sep))
def makeTarget(self, pos, size, scale=1, offset=vector.Vector(0, 0)): sprite = sprites.Target(self.game, pos * scale + offset, size * scale) self.game.all.add(sprite) self.game.targets.add(sprite) return sprite
def makeFood(self, pos, scale=1, offset=vector.Vector(0, 0)): sprite = sprites.Food(self.game, pos * scale + offset, scale) self.game.all.add(sprite) self.game.food.add(sprite) return sprite
def makeEnemy(self, pos1, pos2, speed, scale=1, offset=vector.Vector(0, 0)): sprite = sprites.Enemy(self.game, pos1 * scale + offset, pos2 * scale + offset, speed * scale, scale) self.game.all.add(sprite) self.game.enemies.add(sprite) return sprite
def makeWall(self, pos, size, scale=1, offset=vector.Vector(0, 0)): sprite = sprites.Wall(self.game, pos * scale + offset, size * scale) self.game.all.add(sprite) self.game.walls.add(sprite) return sprite