def update(self, delta): '''Along the game, a constant force being applied to the ball in order to pull it over the middle of the field so that it wont get stuck somewhere in the game field. ''' x, y, z = self.body.getPosition() self.rect.center = world.w_to_pix((x, y, z)) # update sprite position goal = self.rect.collidelist(globals.goals) # check if it's scoring and then play sound effects, draw animation if so. if goal >= 0: if globals.sound: goal_channel.play(goal_sound) goal_channel.fadeout(3000) globals.assets.add(GoalAnimation()) globals.score[goal] += 1 self.kill() return # position correction: the plane2d joint should keep z around 0 but # it's inaccurate sometimes self.body.setPosition((x, y, 0.0)) # we will simulate the curvature of the field applying a force # proportional to the distance to the center of the field force_factor = ((globals.DISPLAY_SIZE[0] / 2.0 - self.rect.centerx) / (globals.FIELD_SIZE[0] / 2.0)) self.body.addForce((force_factor * globals.FIELD_CONCAVE_FACTOR, 0, 0)) vel = self.body.getLinearVel()[:2] pos = self.body.getPosition() if (vel[0]**2 + vel[1]**2) < 0.0025 and abs(pos[0]) < 0.05: self.kickoff()
def drawPenguins(self, i): ''' Drawing body attributes of the penguins on the bars; but before that we are doing a position converting from ode world to pygame world ''' size = self.sprite_size x_offset = self.base_pos[0] y_offset = self.base_pos[1] ntl = None nbr = None for b in self.bodies: bpos = b.getPosition() dpos = world.w_to_pix(bpos) ## new boundaries if not ntl: h = max((y_offset, dpos[1] - self.sprite_size / 2.0)) ntl = (x_offset, h) nbr = (x_offset + self.sprite_size, dpos[1] + self.sprite_size / 2.0) dpos = dpos[0] - x_offset, dpos[1] - y_offset a = -self.hinge.getAngle() index = int(round((PenguinBar.num_frames/2) / math.pi * a)) if index < 0: index += PenguinBar.num_frames pos = ((self.rect.w - size) / 2, dpos[1] - size / 2) if self.num_penguins == 1: i.blit(PenguinBar.sprites_k[self.team], pos, (index * size, 0, size, size)) else: i.blit(PenguinBar.sprites[self.team], pos, (index * size, 0, size, size)) # ==== DEBUG if globals.debug: dpos = world.w_to_pix((bpos[0], bpos[2], bpos[1])) pos = (dpos[0] - self.rect.x, dpos[1] - size / 2) pygame.draw.line(i, (0, 0, 0), (0, 46 + self.rect.h / 2), (self.rect.w, 46 + self.rect.h / 2)) pygame.draw.circle(i, self.color, pos, self.PENGUIN_SIZE) # ==== self.rect = pygame.Rect(ntl, (size, nbr[1] - ntl[1]))