示例#1
0
 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)
示例#2
0
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
示例#3
0
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)