Player movement stuckt :/

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
N4SONIC
User
Beiträge: 32
Registriert: Sonntag 28. Dezember 2014, 15:46

Hallo ich brauche Hilfe mit meinen Code. Wenn ich versuche mich mit denn Player zu bewegen stuckt es.

Code: Alles auswählen

import pygame

pygame.init()

window = pygame.display.set_mode((800,600))

pygame.display.set_caption("Window")

class Player(object):
    def __init__(self):
        self.rect = pygame.Rect(400,300,50,50)
        self.health = 100

    def move(self,dx,dy):
        if dx != 0:
            self.move_single_axis(dx,0)
        if dy != 0:
            self.move_single_axis(0,dy)

    def move_single_axis(self,dx,dy):
        self.rect.x += dx
        self.rect.y += dy

        for block in blocklist:
            if self.rect.colliderect(block.rect):
                if dx > 0:
                    self.rect.right = block.rect.left
                if dx < 0:
                    self.rect.left = block.rect.right
                if dy > 0:
                    self.rect.bottom = block.rect.top
                if dy < 0:
                    self.rect.top = block.rect.bottom

class Block(object):
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.rect = pygame.Rect(self.x,self.y,50,50)

    def render(self,window):
        pygame.draw.rect(window,(0,0,0),self.rect)

class Health:
    def __init__(self):
        self.health = pygame.Rect(100,100,10,100)

    def render(self,window):
        font = pygame.font.SysFont("arial",20)
        str = font.render("Leben: {0}".format(player.health),True,(0,0,0))
        window.blit(str,(10,10))

player = Player()
health = Health()

level1 = [
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
]

blocklist = []

for y in range(0,len(level1)):
    for x in range(0,len(level1[y])):
        if level1[y][x] == 1:
            blocklist.append(Block(x*32,y*32))

clock = pygame.time.Clock()

running = True
while running:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            running = False

        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            player.move(-5,0)
        if key[pygame.K_RIGHT]:
            player.move(+5,0)
        if key[pygame.K_DOWN]:
            player.move(0,+5)
        if key[pygame.K_UP]:
            player.move(0,-5)

    window.fill((255,255,255))

    health.render(window)
    pygame.draw.rect(window,(0,0,0),player.rect)

    for block in blocklist:
        block.render(window)

    clock.tick(60)
    pygame.display.flip()

pygame.quit()
MFG N4SONIC :)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Code: Alles auswählen

while running:
    for event in pygame.event.get():
        # ...
        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            player.move(-5,0)
        # ...
Sicher, dass der Aufruf von pygame.key.get_pressed() dort hin gehört? Er würde nur dann aufgerufen, wenn tatsächlich ein event ausgelöst wurde. Die Funktion erweckt den Eindruck, dass diese unabhängig von einer Ereignisschleife aufzurufen ist.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

Erstens das und zweitens bin ich mir ziemlich sicher die Funktion sollte gar nicht benutzt werden. Jedenfalls nicht wenn man alle Tastendrücke zuverlässig erfassen möchte. Man möchte doch eigentlich eher auf die entsprechenden KEYDOWN- und KEYUP-Ereignisse warten/reagieren.
N4SONIC
User
Beiträge: 32
Registriert: Sonntag 28. Dezember 2014, 15:46

Vielen Dank für die Antworten es Funktioniert jetzt :)
Antworten