Spielfigur

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
krinust
User
Beiträge: 12
Registriert: Dienstag 25. Oktober 2016, 18:18

Spielfigur

Beitragvon krinust » Samstag 10. März 2018, 11:25

Erstmal mein Code:

  1. import pygame
  2. from pygame.locals import *
  3.  
  4. MAP_WIDTH = 500
  5. MAP_HEIGHT = 500
  6.  
  7. class Spieler(object):
  8.     def __init__(self, x, y, bild):
  9.         self.x = x
  10.         self.y = y
  11.         self.bild = bild
  12.  
  13.     def zeichnen(self, fenster):
  14.         fenster.blit(self.bild, (self.x, self.y))
  15.  
  16.     def bewegen(self, richtung):
  17.         if richtung == 'N':
  18.             self.y -= 50
  19.         if richtung == 'S':
  20.             self.y += 50
  21.         if richtung == 'O':
  22.             self.x += 50
  23.         if richtung == 'W':
  24.             self.x -= 50
  25.  
  26.  
  27. def main():
  28.     pygame.init()
  29.     fenster = pygame.display.set_mode((MAP_WIDTH,MAP_HEIGHT))
  30.     spieler_bild = pygame.image.load("spieler.png").convert_alpha()
  31.     spieler = Spieler(0, 0, spieler_bild)
  32.     try:
  33.         while True:
  34.             for event in pygame.event.get():
  35.                 if event.type == QUIT:
  36.                     return
  37.                 elif event.type == KEYDOWN:
  38.                     if event.key == K_RIGHT and spieler.x < MAP_WIDTH:
  39.                         spieler.bewegen('O')
  40.                     if event.key == K_LEFT and spieler.x > 0:
  41.                         spieler.bewegen('W')
  42.                     if event.key == K_UP and spieler.y > 0:
  43.                         spieler.bewegen('N')
  44.                     if event.key == K_DOWN and spieler.y < MAP_HEIGHT:
  45.                         spieler.bewegen('S')
  46.  
  47.             spieler.zeichnen(fenster)
  48.             pygame.display.update()
  49.            
  50.     finally:
  51.         pygame.quit()
  52.  
  53. if __name__ == '__main__':
  54.     main()


Irgendwann soll ein Spiel rauskommen, bei dem man mit einem Raumschiff rumfliegt und schießen kann. Mein momentanes Problem ist, dass das display nicht aktualisiert wird, also jede vorherige Position der Spielfigur bleibt beim Bewegen dieser erhalten. Wie kann ich dieses Problem lösen? Ich habe bereits probiert, dass "pygame.display.update()" vor "spieler.zeichnen(fenster)" zu schieben, das hat aber nicht geholfen.
Benutzeravatar
__deets__
User
Beiträge: 2483
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Spielfigur

Beitragvon __deets__ » Samstag 10. März 2018, 11:43

Du musst ALLES neu zeichnen. Also zb auch einen Hintergrund, oder das Display zumindest löschen.
krinust
User
Beiträge: 12
Registriert: Dienstag 25. Oktober 2016, 18:18

Re: Spielfigur

Beitragvon krinust » Samstag 10. März 2018, 11:52

Ok, danke. Ich habe bei stackoverflow das hier gefunden:

Code: Alles auswählen

 
  spieler.zeichnen(fenster)
  pygame.display.update()
  fenster.fill((0,0,0))

Es funktioniert auch, ich frage mich nur, ob es immer so klappt. Was ist, wenn der Hintergrund nicht einfarbig ist, sondern irgendetwas anderes?
Benutzeravatar
__deets__
User
Beiträge: 2483
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Spielfigur

Beitragvon __deets__ » Samstag 10. März 2018, 12:06

Dann malst du das halt. Bei einem weiter entwickelten spiel hast du ja zb einen auf Kacheln basierenden Level-Hintergrund. Der wird jedes Mal gezeichnet. Dazu ist es zb auch üblich eine (meistens feste) z-Koordinate einzuführen, nach der man alle Bildelemente sortiert, um sie dann von unten nach oben zu malen.
Astorek
User
Beiträge: 64
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Re: Spielfigur

Beitragvon Astorek » Sonntag 11. März 2018, 12:53

Gleich mal eine Warnung vorneweg: Du wirst früher oder später auch eine Lösung finden müssen, um nur die geänderten Elemente des Bildschirms neu zu zeichnen ("pygame.display.update" nimmt dafür auch Parameter), da ansonsten bei größeren Fenstern irgendwann die Framerate sehr schnell in die Knie geht. Je nachdem, welche Sorte Spiel du programmieren willst^^.

Siehe dazu etwa "A Newbie Guide to pygame", insbesondere der Punkt "Dirty rect animation."

Wollte das einfach schonmal vorausschicken, weil da früher oder später jeder Pygame-Programmierer drauf stößt, wenn man etwas größere Projekte (bspw. ein Jump'n Run) damit programmieren will...
krinust
User
Beiträge: 12
Registriert: Dienstag 25. Oktober 2016, 18:18

Re: Spielfigur

Beitragvon krinust » Sonntag 11. März 2018, 18:40

@Astorek Ok, gut zu wissen :) Kannst du noch andere Tutorials für Pygame empfehlen? Ich habe da noch nicht so viel gefunden, und wenn, weiß ich immer nicht, ob die Qualität gut ist.
krinust
User
Beiträge: 12
Registriert: Dienstag 25. Oktober 2016, 18:18

Re: Spielfigur

Beitragvon krinust » Donnerstag 15. März 2018, 13:12

Hat noch jemand eine Tutorial-Empfehlung?
Benutzeravatar
__deets__
User
Beiträge: 2483
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Spielfigur

Beitragvon __deets__ » Donnerstag 15. März 2018, 14:21

Nix ausser den offiziellen: https://www.pygame.org/wiki/tutorials
Astorek
User
Beiträge: 64
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Re: Spielfigur

Beitragvon Astorek » Donnerstag 15. März 2018, 15:11

"Making Games with Python and Pygame"

Ansonsten gilt, was bei allen anderen Programmiersprachen auch gilt: Ausprobieren, ausprobieren, ausprobieren ;) . Gelegentlich scheitern, weil es einfach dazugehört. Und Quelltexte von anderen Projekten ansehen, um zu sehen, wie derjenige das eine oder andere Problem gelöst hat...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder