pygame player class

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Henri.py
User
Beiträge: 20
Registriert: Sonntag 28. März 2021, 15:33

Hi, ich hab mich endlich mal an classes in Python rangetraut und eine simple Playerclass in pygame gecoded.
das ist das erste mal das ich mit classes code und ich würde gerne wissen ob es an dem Code irgendwelche Verbesserungsvorschläge gibt

Code: Alles auswählen

import pygame,sys

pygame.init()
Clock = pygame.time.Clock()
FPS = 60
size = [1000,800]
bg = [0,0,0]
screen = pygame.display.set_mode(size)
pygame.display.set_caption('classes in pygame')


class Player:
    def __init__(self,vel,x,y):
        self.vel = vel
        self.vel_y = 16
        self.x = x
        self.y = y
        self.jump = False

    def move(self):
        k = pygame.key.get_pressed()
        if k[pygame.K_LEFT]:
            self.x -= self.vel
        if k[pygame.K_RIGHT]:
            self.x += self.vel
        if k[pygame.K_UP] and self.vel_y == 16:
            self.jump = True
        if self.jump:
            pass
            if self.vel_y >= -16:
                self.y -= self.vel_y
                self.vel_y -= 1
            else:
                self.jump = False
                self.vel_y = 16

    def draw(self):
        pygame.draw.rect(screen,(255,255,255),(self.x,self.y,50,100))

    def do(self):
        self.move()
        self.draw()
        
    

player = Player(2,500,600)

while True:
    screen.fill(bg)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    player.do()
    Clock.tick(FPS)
    pygame.display.update()
    
LG
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Beispiel ist ein guter Anfang, aber in sich einfach zu simpel, um da viel mehr zu sagen zu koennen. Das die X-Geschwindigkeit bestimmbar ist, aber nicht die Y-Geschwindigeit ist eine Asymetrie. Der Sprung ist auch nicht besonders organisch, sondern mit fixer Geschwindigkeit in beide Richtungen, statt durch eine Anfangsgeschwindigkeit und die dagegen arbeitende Gravitation zu arbeiten.

Das du die Tastendruecke in einer solchen Klasse auswertest, koppelt die zu sehr an die gewaehlte Steuerung. Was machst du, wenn du mal statt Keyboard ein Joypad anbinden willst? Darum fuehrt man bei sowas eigentlich immer eine Abstraktion in Form von PLAYER_UP/DOWN/LEFT/RIGHT Kommandos zu machen, die man in der Hauptschleife aus der Eingabe + Konfiguration erzeugt.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Henri.py,

ich finde auch, das ist eine guter Schritt in die richtige Richtung.
Als nächstes würde ich das eigentliche Game auch in einer Klasse unterbringen. Da der Player ein Teil des Games ist, kann er dann in der Game-Klasse angelegt werden und von dort aus auch gesteuert werden.

Also, nur um mal den Zwischenschritt zu einer eigenen Game-Klasse umzusetzen, könnte man deinen bisherigen Code so umändern:

Code: Alles auswählen

import pygame

pygame.init()
pygame.display.set_caption("classes in pygame")

FPS = 60
SIZE = [1000, 800]
BACKGROUND = [0, 0, 0]


class Player:
    def __init__(self, screen, vel, x, y):
        self.screen = screen
        self.vel = vel
        self.vel_y = 16
        self.x = x
        self.y = y
        self.jump = False

    def move(self):
        k = pygame.key.get_pressed()
        if k[pygame.K_LEFT]:
            self.x -= self.vel
        if k[pygame.K_RIGHT]:
            self.x += self.vel
        if k[pygame.K_UP] and self.vel_y == 16:
            self.jump = True
        if self.jump:
            if self.vel_y >= -16:
                self.y -= self.vel_y
                self.vel_y -= 1
            else:
                self.jump = False
                self.vel_y = 16

    def draw(self):
        pygame.draw.rect(self.screen, (255, 255, 255), (self.x, self.y, 50, 100))


class Game:
    def __init__(self, size):
        self.screen = pygame.display.set_mode(size)
        self.player = Player(self.screen, 2, 500, 600)
        self.clock = pygame.time.Clock()

    def run(self):
        running = True
        while running:
            self.update()
            self.draw()
            self.clock.tick(FPS)
            pygame.display.update()
            running = self.process_events()

    def process_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False
        return True

    def update(self):
        self.player.move()

    def draw(self):
        self.screen.fill(BACKGROUND)
        self.player.draw()


def main():
    game = Game(SIZE)
    game.run()


if __name__ == "__main__":
    main()
Der nächste Schritt wäre dann die Tastaturabfragen auch in die Game-Klasse zu übertragen. Dazu würde in der Game-Klasse ausgewertet, welche Taste gedrückt wurde. Der Player-Klasse wird dann nur noch die jeweilige Taste übergeben.
Antworten