2017-07-09 3 views
0

Ich stoße auf ein Problem in meinem 2D-Spiel, aber ich weiß nicht warum. Ich möchte Sprites bewegen, wenn der Spieler die Mitte des Spielbildschirms erreicht, aber die Sprites beginnen, sich langsamer zu bewegen, wenn sie 1px aus dem Bildschirm sind (Das ergibt für mich keinen Sinn ...)Sprites bewegen sich in unterschiedlicher Geschwindigkeit

Dies ist der einzige in meinem Code Teil, in dem ich eine solche Bewegung der Sprites definiert:

 if self.player.rect.centerx >= WIDTH/2: 
      # Ensuring the player stays in the middle of the screen 
      self.player.pos.x -= abs(self.player.vel.x) 
      for obj in self.movables: 
       # Relocating Sprite when Player moves 
       obj.rect.x -= abs(self.player.vel.x) 
       # Killin Sprite when it is out of the screen 
       if obj.rect.x < 0 - obj.rect.width: 
        obj.kill() 
       # Reseting Location of the Ground 
       if self.ground.rect.centerx <= 0: 
        self.ground.rect.x = 0 

EDIT: aufgeräumt ist, den Code

Hier ist der Teil, wo die Geschwindigkeit des Spielers ist berechnet wird:

 def event(self): 
      keys = pygame.key.get_pressed() 
      if keys[pygame.K_LEFT] or keys[pygame.K_a]: 
       self.acc.x = -PLAYER_ACC 
      if keys[pygame.K_RIGHT] or keys[pygame.K_d]: 
       self.acc.x = PLAYER_ACC 


     def update(self): 
      self.acc = vec(0, PLAYER_GRAV) 
      self.event() 
      self.acc.x += self.vel.x * PLAYER_FRICTION 
      self.vel += self.acc 
      # Die Vel auf null setzen wenn sie ~0 ist 
      if abs(self.vel.x) < 0.1: 
       self.vel.x = 0 
      # Physik 
      self.pos += self.vel + 0.5 * self.acc 
      self.rect.midbottom = self.pos 
+0

scheint es die gebunden zu werden 'player.vel' ich denke, wir, dass ein Teil zu – PRMoureu

+0

brauchen habe ich auf meinen Beitrag – wjatscheslaw

+0

die ungeraden Bewegung bearbeitet, wo die Sprites bewegen sich langsamer, wenn ein Teil der selbst ist aus dem Bildschirm passiert nur, wenn ich l und geh K_d. – wjatscheslaw

Antwort

0

Ich habe ein Code-Beispiel für mein Problem hinzugefügt. Aber in diesem Code verschwindet der Player nach ein paar Sekunden, ich denke, es muss in der Art und Weise wie ich die Kollision mit den Plattformen zu tun, aber für jetzt weiß ich nicht, wie das auch zu beheben: D

Um klar Sieh das Problem der sich bewegenden Sprites: Drücke "d", wenn die Platte halb aus dem Bildschirm ist, drücke nicht die Taste "d" und du kannst sehen, wie sich das Sprite langsamer bewegt als der Rest der Sprites auf dem Bildschirm

  import pygame 
      WIDTH = 800 
      HEIGHT = 600 
      BGCOLOR = (181, 45, 76) 
      BLACK = (0, 0, 0) 
      # Player Properties 
      PLAYER_ACC = 0.5 
      PLAYER_FRICTION = -0.12 
      PLAYER_GRAV = 0.5 
      PLAYER_JUMP = -20 


      class Platform(pygame.sprite.Sprite): 

       def __init__(self, game, x, y, w, h): 
        self._layer = 1 
        self.groups = game.all_sprites, game.movables, game.platforms 
        pygame.sprite.Sprite.__init__(self, self.groups) 
        self.game = game 
        self.image = pygame.Surface((w, h)) 
        self.rect = self.image.get_rect() 
        self.rect.x = x 
        self.rect.y = y 

      class Ground(pygame.sprite.Sprite): 

       def __init__(self, game, x, y, w, h): 
        self._layer = 1 
        self.groups = game.all_sprites, game.movables, game.platforms 
        pygame.sprite.Sprite.__init__(self, self.groups) 
        self.game = game 
        self.image = pygame.Surface((w, h)) 
        self.rect = self.image.get_rect() 
        self.rect.x = x 
        self.rect.y = y 

      vec = pygame.math.Vector2 

      class Player(pygame.sprite.Sprite): 

       def __init__(self, game): 
       self._layer = 2 
       self.groups = game.all_sprites 
       pygame.sprite.Sprite.__init__(self, self.groups) 
       self.game = game 
       self.image = pygame.Surface((30, 40)) 
       self.rect = self.image.get_rect() 
       self.rect.center = (WIDTH/2, HEIGHT/2) 
       self.pos = (WIDTH/2, HEIGHT/2) 

       self.vel = vec(0, 0) 
       self.acc = vec(0, 0) 
       self.jumping = False 

       def event(self): 
       keys = pygame.key.get_pressed() 
       if keys[pygame.K_LEFT] or keys[pygame.K_a]: 
        self.acc.x = -PLAYER_ACC 
       if keys[pygame.K_RIGHT] or keys[pygame.K_d]: 
        self.acc.x = PLAYER_ACC 


       def update(self): 
       self.acc = vec(0, PLAYER_GRAV) 
       self.event() 
       self.acc.x += self.vel.x * PLAYER_FRICTION 
       self.vel += self.acc 
       # Die Vel auf null setzen wenn sie ~0 ist 
       if abs(self.vel.x) < 0.1: 
        self.vel.x = 0 
       # Physik 
       self.pos += self.vel + 0.5 * self.acc 
       self.rect.midbottom = self.pos 

       def jump(self): 
       # Checking if the Player can Jump 
       self.rect.y += 1 
       hits = pygame.sprite.spritecollide(self.game.player, self.game.platforms, False) 
       self.rect.y -= 1 
       if hits: 
        if not self.jumping: 
        self.jumping = True 
        # Dieser Teil des Codes wird nie erreicht!!! 
        self.vel.y = PLAYER_JUMP 

      class Game: 
       def __init__(self): 
       self.running = True 
       pygame.init() 
       self.clock = pygame.time.Clock() 
       self.screen = pygame.display.set_mode((800, 600)) 
       pygame.display.set_caption("Moving Bug") 

       def new(self): 
       self.all_sprites = pygame.sprite.LayeredUpdates() 
       self.movables = pygame.sprite.Group() 
       self.platforms = pygame.sprite.Group() 
       self.ground = Ground(self, 0, HEIGHT-20, WIDTH*2, 20) 
       self.plat_1 = Platform(self, 400, 300, 100, 20) 
       self.plat_2 = Platform(self, 800, 400, 100, 20) 
       self.plat_3 = Platform(self, 100, 40, 100, 20) 
       self.player = Player(self) 
       self.run() 

       def run(self): 
       self.playing = True 
       while self.playing: 
        self.clock.tick(60) 
        self.event() 
        self.update() 
        self.draw() 

       def event(self): 
       for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
        if self.playing: 
         self.playing = False 
        self.running = False 
        if event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_SPACE: 
         self.player.jump() 

       def update(self): 
       self.all_sprites.update() 
       # Only checking for collision if the player is jumping 
       if self.player.vel.y > 0: 
        hits = pygame.sprite.spritecollide(self.player, self.platforms, False) 
        if hits: 
        self.player.vel.y = 0 
        self.player.rect.bottom = hits[0].rect.top 
        self.player.jumping = False 
       # Left side of the screen 
       if self.player.rect.x < 0: 
        self.player.vel.x = 0 
        self.player.rect.x = 0 
       # Centering the player in the middle: 
       if self.player.rect.centerx >= WIDTH/2: 
        # Ensuring the player stays in the middle of the screen 
        self.player.pos.x -= abs(self.player.vel.x) 
        for obj in self.movables: 
        # Relocating Sprite when Player moves 
        obj.rect.x -= abs(self.player.vel.x) 
        # Killin Sprite when it is out of the screen 
        if obj.rect.x < 0 - obj.rect.width: 
         obj.rect.x = WIDTH 
        # Reseting Location of the Ground 
        if self.ground.rect.centerx <= 0: 
         self.ground.rect.x = 0 

       def draw(self): 
       self.screen.fill(BGCOLOR) 
       self.all_sprites.draw(self.screen) 
       pygame.display.flip() 

      g = Game() 
      while g.running: 
       g.new() 
       g.run() 
      pygame.quit() 
Verwandte Themen