Pygame sprite nicht bewegend

Ich bin mit einem Logikfehler konfrontiert, wo sich das Sprite einfach nicht bewegt, unabhängig von der Eingabe.
Mein Code wird unten sein, so dass kein Kontext ausgelassen wird, es ist ziemlich kurz.
Gibt es einen besseren Weg, das Sprite von der Klippe zu befreien?
Ich habe irgendwo Zeug über die Aktualisierung der Sprite oder einige solche, ganz anders gemacht, um einfach nur blitting.

import pygame pygame.init() import random import math screen=pygame.display.set_mode([700,400]) black = ( 0, 0, 0) white = ( 255, 255, 255) red = ( 255, 0, 0) player_x=350 player_y=200 player_x_vel=0 player_y_vel=0 rot_player=pygame.image pi=math.pi class Player(pygame.sprite.Sprite): def __init__(self): global player pygame.sprite.Sprite.__init__(self) self.pos=(350,200) self.image=pygame.image.load("arrowtest.png").convert() self.rect=self.image.get_rect() screen=pygame.display.get_surface() self.area=screen.get_rect() self.speed=10 self.state="still" self.reinit() def reinit(self): self.state="still" self.movepos=[0,0] def update(self): newpos=self.rect.move(self.movepos) if self.area.contains(newpos): self.rect=newpos pygame.event.pump() def moveup(self): self.movepos[1]-=(self.speed) self.state="moveup" def movedown(self): self.movepos[1]+=(self.speed) self.state="movedown" def moveleft(self): self.movepos[0]-=(self.speed) self.state="moveleft" def moveright(self): self.movepos[0]+=(self.speed) self.state="moveright" def moveupright(self): self.movepos[1]-=(self.speed) self.movepos[0]+=(self.speed) def moveupleft(self): self.movepos[1]-=(self.speed) self.movepos[0]-=(self.speed) def movedownright(self): self.movepos[1]+=(self.speed) self.movepos[0]+=(self.speed) def movedownleft(self): self.movepos[1]+=(self.speed) self.movepos[0]-=(self.speed) def angleplayer(self): mouse_pos=pygame.mouse.get_pos() dx=mouse_pos[0]-player_x dy=mouse_pos[1]-player_y rads=math.atan2(-dy, dx) rads %= 2*pi angle = math.degrees(rads) print angle rot_player.image=pygame.transform.rotate(player.image, angle-90) done=False clock=pygame.time.Clock() while done==False: player = Player() for event in pygame.event.get(): if event.type == pygame.QUIT: done=True if event.type == pygame.MOUSEBUTTONDOWN: fired_pos=pygame.mouse.get_pos() fired=True if event.type == pygame.KEYDOWN: player.angleplayer() if event.key == pygame.K_w: player.moveup() if event.key == pygame.K_s: player.movedown() if event.key == pygame.K_a: player.moveleft() if event.key == pygame.K_d: player.moveright() print "co ords", player_x,player_y print "x vel", player_x_vel print "y vel", player_y_vel if event.type == pygame.KEYUP: player.movepos=[0,0] player.state="still" player.angleplayer() screen.fill(white) screen.blit(player.image, player.pos) clock.tick(20) pygame.display.flip() pygame.quit() 

Danke im Voraus

  • Wie kann man einen Feind dem Spieler in pygame folgen?
  • Kann konstante Tasteneingabe ein Sprite ständig bewegen?
  • Kann nicht ausziehen () sprites in pyglet
  • Animiertes Sprite aus wenigen Bildern
  • Wie man Funktionen von Sprites in Gruppen anruft?
  • Python Animation Timing
  • Schiebe-Sprites
  • Versuchen, über Sprite zu ziehen oder Bildpyglet zu wechseln
  • 2 Solutions collect form web for “Pygame sprite nicht bewegend”

    Zuerst schaffen Sie einen neuen Spieler jede Iteration Ihrer Hauptschleife:

     ... while done == False: player = Player() ... 

    Sie wollen den Spieler einmal erstellen, also verschieben Sie die Erstellung außerhalb der Schleife:

     ... player = Player() while not done: ... 

    Zweitens: Um die Position des Spielers zu erhalten, benutzt du player.pos :

     ... screen.blit(player.image, player.pos) ... 

    Aber du schlägst niemals player.pos (es ist immer (350,200) ), man ändert sich nur self.rect :

     def update(self): newpos=self.rect.move(self.movepos) if self.area.contains(newpos): self.rect=newpos pygame.event.pump() 

    Verwenden player.rect entweder player.rect , um die Spielerposition zu erhalten, oder aktualisieren Sie player.pos entsprechend:

     def update(self): newpos=self.rect.move(self.movepos) if self.area.contains(newpos): self.rect = newpos self.pos = self.rect.topleft # don't call pygame.event.pump() here. Doesn't make any sense :-) 

    Drittens aktualisierst du die Spielerposition in der update Funktion, aber du nennst es nie. Rufen Sie es an, bevor Sie den Spieler zeichnen:

     ... while not done: ... player.update() screen.fill(white) screen.blit(player.image, player.pos) ... 

    Sie können Ihren Code viel vereinfachen, indem Sie movepos direkt setzen und die move... entfernen move...

    Arbeitsbeispiel:

     import pygame pygame.init() colors = pygame.color.THECOLORS screen = pygame.display.set_mode([700,400]) class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.surface.Surface((32,32)) self.image.fill(colors['green']) self.rect = self.image.get_rect().move(350, 200) self.speed = 4 def update(self): dx, dy = self.movepos[0] * self.speed, self.movepos[1] * self.speed self.rect = self.rect.move(dx, dy) done=False clock = pygame.time.Clock() player = Player() while not done: if pygame.event.get(pygame.QUIT): break pressed = pygame.key.get_pressed() l, r, u, d = [pressed[k] for k in pygame.K_a, pygame.K_d, pygame.K_w, pygame.K_s] player.movepos = -l + r, -u + d player.update() screen.fill(colors['white']) screen.blit(player.image, player.rect.topleft) pygame.display.flip() clock.tick(60) 

    Sie haben viele Bewegungsfunktionen. Versuchen Sie, sie in eine einfache Zwei-Funktionsklasse wie dieses Beispiel zu kombinieren:

     class Puck(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location 

    Die beiden Hauptcontroller sind die self.rect.left und self.rect.top. Durch das Ändern ihrer Werte können Sie die Sprites wie in diesem Beispiel verschieben.

     #Name of varible# = Puck('#Image File#', [#value of self.rect.left#, value of self.rect.top] 

    Dann können Sie Ereignisse verwenden, um sie wie zu ändern:

      for event in pygame.event.get(): if event.type==pygame.QUIT: pygame.quit() exit(0) elif event.type == pygame.KEYDOWN: if event.key == K_UP: random.rect.top =random.rect.top - 75 elif event.key == K_LEFT: random.rect.left = random.rect.left - 75 elif event.key == K_DOWN: random.rect.top = random.rect.top + 75 elif event.key == K_RIGHT: randoml.rect.left = randoml.rect.left + 75 elif event.key == K_w: random.rect.top = random.rect.top - 50 elif event.key == K_a: random.rect.left = random.rect.left - 50 elif event.key == K_s: random.rect.top = random.rect.top + 50 elif event.key == K_d: random.rect.left = random.rect.left + 50 

    Dies sollte in der Lage sein, Ihr Sprite zu bewegen.

    Python ist die beste Programmiersprache der Welt.