Spielfigur

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

Erstmal mein Code:

Code: Alles auswählen

import pygame
from pygame.locals import *

MAP_WIDTH = 500
MAP_HEIGHT = 500

class Spieler(object):
    def __init__(self, x, y, bild):
        self.x = x
        self.y = y
        self.bild = bild

    def zeichnen(self, fenster):
        fenster.blit(self.bild, (self.x, self.y))

    def bewegen(self, richtung):
        if richtung == 'N':
            self.y -= 50
        if richtung == 'S':
            self.y += 50
        if richtung == 'O':
            self.x += 50
        if richtung == 'W':
            self.x -= 50


def main():
    pygame.init()
    fenster = pygame.display.set_mode((MAP_WIDTH,MAP_HEIGHT))
    spieler_bild = pygame.image.load("spieler.png").convert_alpha()
    spieler = Spieler(0, 0, spieler_bild)
    try:
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                elif event.type == KEYDOWN:
                    if event.key == K_RIGHT and spieler.x < MAP_WIDTH:
                        spieler.bewegen('O')
                    if event.key == K_LEFT and spieler.x > 0:
                        spieler.bewegen('W')
                    if event.key == K_UP and spieler.y > 0:
                        spieler.bewegen('N')
                    if event.key == K_DOWN and spieler.y < MAP_HEIGHT:
                        spieler.bewegen('S')

            spieler.zeichnen(fenster)
            pygame.display.update()
            
    finally:
        pygame.quit()

if __name__ == '__main__':
    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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

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?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 72
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

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

@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

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

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

"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...
Antworten