Platformer Wall collision

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 erstmal :)

Wenn ich mit dem Player die Wall berühre passiert das was passieren soll der Player bleibt stehen. Aber wenn ich dann nach links oder rechts dabei lenke dann bewegt der Player sich zu der anderen Wall warum ?

Code: Alles auswählen

import pygame

black = (0,0,0)

moveSpeed = 4

class Player:
	def __init__(self):
		self.rect = pygame.Rect(400,300,50,50)
		self.change_x = 0
		self.change_y = 0

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

		self.rect.x += self.change_x
		self.rect.y += self.change_y

		for wall in walls:
			if self.rect.colliderect(wall.rect):
				if self.change_x > 0:
					self.rect.right = wall.rect.left
				if self.change_x < 0:
					self.rect.left = wall.rect.right
				if self.change_y > 0:
					self.rect.bottom = wall.rect.top
				if self.change_y < 0:
					self.rect.top = wall.rect.bottom

class Wall:
	def __init__(self,x,y):
		self.x = x
		self.y = y
		self.rect = pygame.Rect(self.x,self.y,50,50)
		walls.append(self)

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

player = Player()

pygame.init()

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

pygame.display.set_caption("Platformer")

clock = pygame.time.Clock()

level_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,1,1,1,1,1,1,1,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]
]

walls = []

for y in range(0,len(level_1)):
	for x in range(0,len(level_1[y])):
		if level_1[y][x] == 1:
			walls.append(Wall(x*50,y*50))

running = True
while running:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:
        	if event.key == pygame.K_LEFT:
        		player.change_x -= moveSpeed
        	if event.key == pygame.K_RIGHT:
        		player.change_x += moveSpeed
        	if event.key == pygame.K_UP:
        		player.change_y -= moveSpeed
        	if event.key == pygame.K_DOWN:
        		player.change_y += moveSpeed
        if event.type == pygame.KEYUP:
        	if event.key == pygame.K_LEFT:
        		player.change_x = 0
        	if event.key == pygame.K_RIGHT:
        		player.change_x = 0
        	if event.key == pygame.K_UP:
        		player.change_y = 0
        	if event.key == pygame.K_DOWN:
        		player.change_y = 0

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

    player.render(window)

    for wall in walls:
    	wall.render(window)

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

pygame.quit()
BlackJack

@N4SONIC: Die Frage ist jetzt ein bisschen schwer zu beantworten, beziehungsweise sehr leicht zu beantworten: Das passiert weil Du das so programmiert hast!

Wenn man die „Cursor runter“-Taste gedrückt hält, kollidiert das Rechteck irgendwann mit der Mauer und der ``if self.change_y > 0:``-Zweig wird ausgeführt. Solange man die Taste gedrückt hält passiert die Kollision in jedem Frame. Wenn man jetzt noch beispielsweise zusätzlich „Cursor rechts“ drückt, passiert die Kollision natürlich wegen der Beschleunigung nach unten immer noch und es treffen zwei ``if``-Bedingungen zu. Neben der bisherigen auch noch ``if self.change_x > 0:``. Und die setzt die Spielfigur an den linken Rand der Wand. Damit landet man im nächsten Frame in der Wand links daneben und auf diese Weise über ein paar Frames hinweg recht schnell am linken Rand der Gesamtmauer in dem Beispiel-Level.
Antworten