omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Help me find a way to make the lasers fire in a certain direction.

    Pythonista
    7
    66
    16997
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • BurntRice
      BurntRice last edited by ccc

      from scene import *
      import math
      import random
      import sound
      import ui
      A = Action()
      width, height = ui.get_screen_size()
      #Setting up meteorites
      
      
      #Setting up background colour for the entire scene
      class Game(Scene):
      
          def setup(self):
              self.bg = SpriteNode('spc:BackgroundBlack')
              self.lasers = []
              self.items = []
              self.LaserTime = 0
              self.frame_counter = 0
              self.meteor = []
      
              #Creating the player
              self.Player = SpriteNode('iow:arrow_up_b_32')
              self.Player.color = (1.0, 1.0, 1.0)
              self.Player.anchor_point = (0.5, 0.5)
              self.Player.x_scale = 2/1.0
              self.Player.y_scale = 3/1.0
              self.Player.position = (512, 400)
              self.Player.rotation = 0.0
              self.add_child(self.Player)
      
              self.UpCrtl = SpriteNode('iow:arrow_up_b_32')
              self.UpCrtl.x_scale = 3.5/1.0
              self.UpCrtl.y_scale = 3.5/1.0
              self.UpCrtl.alpha = 0.5
              self.UpCrtl.position = (175, 295)
              self.add_child(self.UpCrtl)
      
              self.RightCrtl = SpriteNode('iow:arrow_right_b_32')
              self.RightCrtl.x_scale = 3.5/1.0
              self.RightCrtl.y_scale = 3.5/1.0
              self.RightCrtl.alpha = 0.5
              self.RightCrtl.position = (250, 212.5)
              self.add_child(self.RightCrtl)
      
              self.LeftCrtl = SpriteNode('iow:arrow_left_b_32')
              self.LeftCrtl.x_scale = 3.5/1.0
              self.LeftCrtl.y_scale = 3.5/1.0
              self.LeftCrtl.alpha = 0.5
              self.LeftCrtl.position = (100, 212.5)
              self.add_child(self.LeftCrtl)
      
              #The button for shooting
              self.laserButton = SpriteNode('shp:Circle')
              self.laserButton.color = ('gray')
              self.laserButton.x_scale = 3/1
              self.laserButton.y_scale = 3/1
              self.add_child(self.laserButton)
              self.laserButton.position = (1000, 212.5)
      
              #The score label
              self.score_label = LabelNode(text='Score: 0')
              self.score_label.anchor_point = (0, 0)
              self.score_label.position = (10, 790)
              self.score_label.font = ('Joystix', 30)
              self.add_child(self.score_label)
      
          #Movement code.
          def update(self):
              self.handle_button_presses()
              self.move_lasers()
              self.update_lasers()
              self.spawn_meteor()
              width, height = ui.get_screen_size()
              self.LaserTime = self.LaserTime + 1
          
          def handle_button_presses(self):
              rotationAdd = math.pi/180
              self.Player.location = self.Player.position
              for touch in self.touches.values():
                  if touch.location in self.LeftCrtl.bbox:
                      actions = [A.rotate_by(math.pi/180)]
                      self.Player.rotation = self.Player.rotation + rotationAdd
                      self.Player.run_action(A.sequence(actions))
                      
                  if touch.location in self.RightCrtl.bbox:
                      actions = [A.rotate_by(math.pi/-180)]
                      self.Player.rotation = self.Player.rotation - rotationAdd
                      self.Player.run_action(A.sequence(actions))
      
                  if touch.location in self.UpCrtl.bbox:
                      direction = Vector2(-math.sin(self.Player.rotation), math.cos(self.Player.rotation))
                      self.Player.position += direction*3 
                      self.Player.position.x %= width
                      self.Player.position.y %= height
              
          def move_lasers(self):
              for touch in self.touches.values():
                  if touch.location in self.laserButton.bbox and self.LaserTime >= 15:
                      #reset the time
                      self.LaserTime = 0
                      new_laser = SpriteNode('shp:Circle')
                      new_laser.x_scale = 0.3/1.0
                      new_laser.y_scale = 0.3/1.0
                      new_laser.position = self.Player.position
                      new_laser.rotation = self.Player.rotation
                      self.add_child(new_laser)
                      self.lasers.append(new_laser)
                      sound.play_effect('arcade:Laser_6')
                      
          def update_lasers(self):
              for l in self.lasers:
                  l.direction = Vector2(-math.sin(l.rotation), math.cos(l.rotation))*10
                  l.position += l.direction
                  if l.position.x < 0:
                      l.remove_from_parent()
                      self.lasers.remove(l)
                  if l.position.x > 1112:
                      l.remove_from_parent()
                      self.lasers.remove(l)
                  if l.position.y < 0:
                      l.remove_from_parent()
                      self.lasers.remove(l)
                  if l.position.y > 834:
                      l.remove_from_parent()
                      self.lasers.remove(l)
                      
          def spawn_meteor(self):
              self.frame_counter = self.frame_counter + 1
              if self.frame_counter >= 60:
                  self.frame_counter = 0
                  new_meteor = SpriteNode('spc:MeteorGraySmall1')
                  new_meteor.position = (random.randint(0, 1024), 834)
                  self.add_child(new_meteor)
                  self.meteor.append(new_meteor)
              
              for meteor in self.meteor:
                  meteor.position = (meteor.position.x, meteor.position.y - 5)
                  if meteor.position.y < - 100:
                      meteor.remove_from_parent()
                      self.meteor.remove(meteor)
      
      
      if __name__ == '__main__':
          run(Game(), LANDSCAPE, show_fps=True)
      
      1 Reply Last reply Reply Quote 0
      • ccc
        ccc last edited by ccc

        So, (as is often the case...) I was wrong about how to do the wrap around when the player gets to the edge of the screen.

        self.Player.position.x %= width
        self.Player.position.y %= height
        
        # must be changed to...
        
        self.Player.position = (self.Player.position.x % self.size.w, self.Player.position.y % self.size.h)
        

        This is because position is a scene.Point which is scene.Vector2 which behaves more like a tuple than a list.

        Also, you can safely delete all lines containing self.Player.location.

        cvp 1 Reply Last reply Reply Quote 0
        • cvp
          cvp @ccc last edited by

          @ccc said:

          as is often the case

          Not so True 😂

          1 Reply Last reply Reply Quote 0
          • ccc
            ccc last edited by ccc

            update_lasers() can be simplified...

                def update_lasers(self):
                    for laser in self.lasers:
                        laser.direction = Vector2(-math.sin(laser.rotation), math.cos(laser.rotation))*10
                        laser.position += laser.direction
                        if laser.position not in self.bounds:  # laser has gone off the screen
                            laser.remove_from_parent()
                            self.lasers.remove(laser)
            
            1 Reply Last reply Reply Quote 0
            • JonB
              JonB last edited by

              Also, it seems to me that you don't need both an Action that sets rotation and the actual assignment to rotation.. If you want to simulate acceleration, then you need to keep track of a velocity, and pressing the arrow button changes the velocity, and then the rotation is set by adding velocity.

              1 Reply Last reply Reply Quote 0
              • moezop
                moezop last edited by moezop

                press the laser button, the laser just goes to far left-hand side and goes up no matter what.. .

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post
                Powered by NodeBB Forums | Contributors