예제 #1
0
	def check(self, map):
		if self.activationTime > 0:
			self.activationTime -= 1
		else:
			if self.fuel < 1:
				self.thrust = False
				if random.uniform(0,1) < 0.1:
					self.game.objects.append(Smoke(self.game, self.owner, self.x, self.y))
			else:
				target = self.getClosestShip(300)
				if target != None:
					if self.target == None:
						self.target = target
						Sound.playSound(self.game.engine, 6, False)
					elif target == self.target:
						predictedTargetX = target.x - 5*self.dx
						predictedTargetY = target.y - 5*self.dy
						predictedSelfX = self.x + 5*self.dx
						predictedSelfY = self.y + 5*self.dy + 5

						if predictedTargetX > predictedSelfX and predictedTargetY > predictedSelfY:
							targetAngle = math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX))
						elif predictedTargetX < predictedSelfX and predictedTargetY > predictedSelfY:
							targetAngle = math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX)) + math.pi
						elif predictedTargetX < predictedSelfX and predictedTargetY < predictedSelfY:
							targetAngle = Functions.returnAngle(math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX))) + math.pi
						elif predictedTargetX > predictedSelfX and predictedTargetY < predictedSelfY:
							targetAngle = Functions.returnAngle(math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX)) + math.pi) + math.pi
						else:
							targetAngle = math.pi/2

						if predictedTargetY > predictedSelfY:
							if Functions.returnAngle(self.angle) < Functions.returnAngle(targetAngle) or Functions.returnAngle(self.angle) > Functions.returnAngle(targetAngle + math.pi):
								self.angle += 0.1275
							else:
								self.angle -= 0.1275
						elif predictedTargetY < predictedSelfY:
							if Functions.returnAngle(self.angle) < Functions.returnAngle(targetAngle + math.pi) or Functions.returnAngle(self.angle) > Functions.returnAngle(targetAngle):
								self.angle -= 0.1275
							else:
								self.angle += 0.1275

						if math.fabs(Functions.returnAngle(self.angle) - targetAngle) < math.pi/8:
							self.fuel -= 1
							self.thrust = True
							if random.uniform(0,1) < 0.3:
								self.game.objects.append(ThrustFlame(self.game, self.owner, self.x-2*self.dx-5*math.cos(self.angle), self.y-2*self.dy-5*math.sin(self.angle), self.dx-1*math.cos(self.angle), self.dy-1*math.sin(self.angle)))

				else:
					self.thrust = False
					self.activationTime = 10
					self.target = None
예제 #2
0
    def run(self, map):  # Process
        if self.active:
            if self.hp <= 0:
                self.explode(map)

            self.angle = Functions.returnAngle(self.angle)

            self.check(map)
            if self.active:
                if self.checkCollisions:
                    self.collision(map)
                self.move()
                self.draw(map)
예제 #3
0
	def onGroundHit(self,map,x,y): # Triggered on ground hit
		self.x = x
		self.y = y

		if self.bounce:
			size = 10

			xsum = 0
			ysum = 0
			points = 0

			if int(self.x+size) > map.width:
				right = map.width
			else:
				right = int(self.x+size)

			if int(self.x-size) < 0:
				left = 0
			else:
				left = int(self.x-size)

			for x in range(left, right):
				if (x-self.x)/(size+0.01) >= -1:
					for y in range(int((-math.sin(math.acos((x-self.x)/(size+0.01)))*size)+self.y), int((math.sin(math.acos((x-self.x)/(size+0.01)))*size)+self.y)):
						if y < map.height and y >= 0:
							maskValue = map.mask[x][y]
							if maskValue != map.maskimage.map_rgb((0,0,0, 255)):
								xsum += x
								ysum += y
								points += 1

			if points > 0 and points < 0.95*math.pi*size**2:
				hitx = float(xsum)/points
				hity = float(ysum)/points

				if hitx-self.x == 0 and hity-self.y != 0:
					normalAngle = math.pi/2
				elif hitx-self.x == 0 and hity-self.y == 0:
					normalAngle = None
				else:
					normalAngle = math.atan((hity-self.y)/(hitx-self.x))
			else:
				normalAngle = None

			if normalAngle != None:
				if self.dx == 0:
					collisionAngle = math.pi/2
				else:
					collisionAngle = math.atan(self.dy/self.dx)

				if Functions.returnAngle(normalAngle) < Functions.returnAngle(collisionAngle):
					if (self.dy > 0 and self.dx > 0) or (self.dy > 0 and self.dx < 0) or (self.dy < 0 and self.dx < 0):
						resultAngle = 2*normalAngle - collisionAngle
					else:
						resultAngle = 2*normalAngle - collisionAngle + math.pi
				else:
					if (self.dy < 0 and self.dx < 0) or (self.dy > 0 and self.dx < 0):
						resultAngle = 2*normalAngle - collisionAngle
					else:
						resultAngle = 2*normalAngle - collisionAngle + math.pi

				self.dx = math.sqrt(self.dx**2+self.dy**2)*math.cos(resultAngle)
				self.dy = math.sqrt(self.dx**2+self.dy**2)*math.sin(resultAngle)
			else:
				self.explode(map)
		elif self.onGroundExplode:
			self.explode(map)