def __init__(self, managerScene, x, y, stringFunctions, backColor, backAlpha=1.0): self.managerScene = managerScene self.node = Node() #self.node.thisown = 0 self.size = Vector2D(150.0, 75.0) self.backShape = SolidRectangle( self.size ) self.backShape.set_color( backColor ) self.backNode = Node() self.backNode.set_drawable( self.backShape ) color = self.backNode.modifier().color() color.set_a(backAlpha) self.backNode.modifier().set_color(color) self.node.AddChild(self.backNode) self.node.modifier().set_offset( Vector2D(x,y) ) self.texts = [] self.stringsFunctions = stringFunctions self.strings = [f() for f in self.stringsFunctions] y = 0 for i in range(len(self.strings)): self.texts.append( Engine_reference().text_manager().GetText(self.strings[i]) ) textNode = Node() textNode.set_drawable(self.texts[i]) textNode.modifier().set_offset( Vector2D(0.0, i * 20.0 ) ) #textNode.thisown = 0 self.node.AddChild(textNode) if self.texts[i].size().get_x() > self.size.get_x(): self.size.set_x(self.texts[i].size().get_x()) y += self.texts[i].size().get_y() + 5 self.size.set_y(y) self.backShape.set_size(self.size)
class Ship (BasicEntity): def __init__(self, x, y, data): self.image_w = 420.0 self.image_h = 830.0 BasicEntity.__init__(self, x, y, "images/ship.png", 20.0, data.max_life, self.image_h/self.image_w) self.radius = (self.size*0.5).Length() self.node.set_zindex(1.0) self.graphic_node = Node() self.node.set_drawable(None) self.graphic_node.set_drawable(self.shape) self.graphic_node.set_zindex(1.0) self.node.AddChild(self.graphic_node) self.group = Group.SHIP self.acceleration = Vector2D(0.0, 0.0) self.data = data self.max_energy = self.data.max_energy self.energy = self.max_energy self.bonus_regen_counter = 0.0 self.bonus_regen_threshold = 3.0 self.speed = 400.0 # |acceleration| in a given frame self.max_speed = 200.0 # max |velocity| ship can attain. #self.rangeCheck = RangeCheck(0, 0, 1024.0, "Asteroid") #self.rangeCheck.AttachToEntity(self) self.pulse_weapon = Weapons.Pulse() self.right_weapon = None self.pulse_weapon.Activate(self) #self.right_weapon.Activate(self) offset = self.size.get_y()/2.0 self.life_hud.SetOffset(offset) self.energy_hud = BarUI(self, "energy", Color(0.0,0.0,1.0,1.0), offset+BAR_SIZE) self.hud_node.AddChild(self.energy_hud.node) self.charge_hud = BarUI(self.pulse_weapon, "charge_time", Color(1.0,1.0,0.0,1.0), -offset-2*BAR_SIZE) self.hud_node.AddChild(self.charge_hud.node) def setupCollisionGeometry(self): self.geometry = ConvexPolygon(self.GetVertices()) def GetVertices(self): pos = self.GetPos() dir = self.GetDirection().Normalize() sideDir = Vector2D(-dir.get_y(), dir.get_x()) sideDir = sideDir * (self.size.get_x()/2.0) #middleL = pos + sideDir #middleR = pos + (sideDir * -1) middleL = sideDir middleR = (sideDir * -1) offset = dir * self.size.get_y()/2.0 #v1 = middleL + (offset*-1) #v2 = middleL + offset #v3 = middleR + offset #v4 = middleR + (offset * -1) v1 = middleL v2 = offset v3 = middleR v4 = offset * -1 return Vector2DList([v1, v2, v3, v4]) def UpdateVertices(self): self.geometry.set_vertices(self.GetVertices()) def set_max_life(self, value): self.data.max_life = value self.max_life = value def set_max_energy(self, value): self.data.max_energy = value self.max_energy = value def RestoreEnergy(self, amount): if amount < 0: return self.energy += amount if self.energy > self.max_energy: self.energy = self.max_energy def TakeEnergy(self, amount): if amount < 0: return self.energy -= amount if self.energy < 0: self.energy = 0.0 def SetRightWeapon(self, weapon): if self.right_weapon != None: self.right_weapon.Dismantle() self.right_weapon = weapon self.right_weapon.Activate(self) def GetDirection(self): return Engine_reference().input_manager().GetMousePosition() - self.GetPos() def Update(self, dt): self.CheckCommands(dt) self.UpdateVertices() self.velocity = self.velocity + (self.acceleration * dt) if (self.velocity.Length() > self.max_speed): self.velocity = self.velocity * (self.max_speed/self.velocity.Length()) self.UpdatePosition(dt) self.life_hud.Update() self.energy_hud.Update() self.charge_hud.Update() self.CleanUpActiveEffects() def CheckCommands(self, dt): input = Engine_reference().input_manager() mouse_dir = input.GetMousePosition() - self.node.modifier().offset() mouse_dir = mouse_dir.Normalize() self.node.modifier().set_rotation( -(mouse_dir.Angle()+pi/2.0) ) accel = Vector2D(0.0, 0.0) ############ #if input.KeyDown(K_w): # accel += mouse_dir #if input.KeyDown(K_a): # left = mouse_dir.Rotate(-pi/2.0) # left = left.Normalize() # accel += left # accel = accel.Normalize() #if input.KeyDown(K_s): # accel += -mouse_dir # accel = accel.Normalize() #if input.KeyDown(K_d): # right = mouse_dir.Rotate(pi/2.0) # right = right.Normalize() # accel += right # accel = accel.Normalize() ############# if input.KeyDown(K_w): accel += Vector2D(0.0, -1.0) if input.KeyDown(K_a): accel += Vector2D(-1.0, 0.0) if input.KeyDown(K_s): accel += Vector2D(0.0, 1.0) if input.KeyDown(K_d): accel += Vector2D(1.0, 0.0) accel = accel.Normalize() accel = accel * self.speed self.acceleration = accel #self.pulse_weapon.SetTarget( self.rangeCheck.GetTarget() ) weaponFiring = self.pulse_weapon.Toggle(input.MouseDown(M_BUTTON_LEFT), dt) if self.right_weapon != None: weaponFiring = weaponFiring or self.right_weapon.Toggle(input.MouseDown(M_BUTTON_RIGHT), dt) if not weaponFiring: if self.energy < self.max_energy: self.RestoreEnergy(self.GetActualEnergyRegenRate() * dt) self.bonus_regen_counter += dt else: self.bonus_regen_counter = 0.0 def GetActualEnergyRegenRate(self): regen_rate = self.data.energy_regen_rate if self.bonus_regen_counter > self.bonus_regen_threshold: regen_rate += self.data.energy_regen_rate*0.25*((self.bonus_regen_counter-self.bonus_regen_threshold)/self.bonus_regen_threshold) return regen_rate def HandleCollision(self, target): pass
class StatsUI: def __init__(self, managerScene, x, y, stringFunctions, backColor, backAlpha=1.0): self.managerScene = managerScene self.node = Node() #self.node.thisown = 0 self.size = Vector2D(150.0, 75.0) self.backShape = SolidRectangle( self.size ) self.backShape.set_color( backColor ) self.backNode = Node() self.backNode.set_drawable( self.backShape ) color = self.backNode.modifier().color() color.set_a(backAlpha) self.backNode.modifier().set_color(color) self.node.AddChild(self.backNode) self.node.modifier().set_offset( Vector2D(x,y) ) self.texts = [] self.stringsFunctions = stringFunctions self.strings = [f() for f in self.stringsFunctions] y = 0 for i in range(len(self.strings)): self.texts.append( Engine_reference().text_manager().GetText(self.strings[i]) ) textNode = Node() textNode.set_drawable(self.texts[i]) textNode.modifier().set_offset( Vector2D(0.0, i * 20.0 ) ) #textNode.thisown = 0 self.node.AddChild(textNode) if self.texts[i].size().get_x() > self.size.get_x(): self.size.set_x(self.texts[i].size().get_x()) y += self.texts[i].size().get_y() + 5 self.size.set_y(y) self.backShape.set_size(self.size) def SetPos(self, x, y): self.node.modifier().set_offset(Vector2D(x,y)) def UpdateSize(self, w, h): self.size.set_x(w) self.size.set_y(h) self.backShape.set_size(self.size) screenSize = Engine_reference().video_manager().video_size() x = self.node.modifier().offset().get_x() y = self.node.modifier().offset().get_y() if x + w > screenSize.get_x(): x = screenSize.get_x() - w if y + h > screenSize.get_y(): y = screenSize.get_y() - h if x < 0: x = 0 if y < 0: y = 0 self.SetPos(x,y) def Update(self): w = self.size.get_x() h = 0 update_size = False for i in range(len(self.stringsFunctions)): newstr = self.stringsFunctions[i]() if newstr != self.strings[i]: self.strings[i] = newstr self.texts[i].SetMessage(newstr) if self.texts[i].size().get_x() > w: w = self.texts[i].size().get_x() update_size = True h += self.texts[i].size().get_y() + 5 if update_size: self.UpdateSize(w,h)