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

  • Unterklassen von Python-Tupel mit mehreren __init__-Argumenten
  • Wie man "Superclass-Methoden" in einer Unterklasse "verstecken" kann
  • Wie kann ich feststellen, ob Instanz der Klasse aus Django-Modell Unterklasse eines anderen Modells ist?
  • Gibt es einen Weg, um Unterklassen on-the-fly zu schaffen?
  • Python-subklassen
  • Django 1.3, erweitert auf User auth System, User Profiling oder Subclassing?
  • Beste Weg, um eine Liste von Strings in Python zu randomisieren
  • Erzeugen von "zufälligen" Strings aus einer anderen Zeichenfolge in Python?
  • Wie kann ich das folgende Programm ändern, damit ich sicher bin, dass jeder Brief, den es ersetzt, eindeutig ist?
  • Random String Generation mit Großbuchstaben und Ziffern in Python
  • Python, generieren zufällige String von Klammern
  • Warum stürzt sich Str () auf?
  • 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.