Pygame: Kollisionserkennung verhält sich merkwürdig
Verfasst: Samstag 15. Oktober 2011, 13:37
Hi! Ich bin blutiger Python-Anfänger und wollte mir die Sprache beibringen, indem ich ein kleines Spiel code. Jetzt bin ich allerdings schon auf die erste Hürde gestoßen, bei der ich nur noch ratlos auf den Bildschirm starre. Und zwar habe ich versucht, eine Kollisionserkennung zu implementieren. Ich erzeuge dabei ein Rechteck, dass die zukünftige Position der Spielfigur erhält und wenn dieses mit dem Rechteck einer Wand kollidiert, wird der Vektor, der im nächsten Schritt als Bewegung zum Positionsvektor der Spielfigur hinzuaddiert würde, auf (0, 0) gesetzt. Das Problem ist folgendes: Man kann die Spielfigur durch mehrfaches Drücken der Pfeiltasten immer noch durch eine Wand bewegen. Ich hoffe das ist einigermaßen verständlich, aber hier natürlich noch der relevante Code...
Main:
Game Object:
Wall:
Hero:
Wenn jemand eine Ahnung hat, was da verkehrt läuft, würde er mir sehr weiterhelfen. Ich nehme gerne auch anderweitige Verbesserungsvorschläge entgegen.
Main:
Code: Alles auswählen
import pygame
from hero import Hero
from wall import Wall
from vector2 import Vector2
pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
game_objects = []
hero = Hero([10, 10])
wall = Wall([100, 100])
game_objects.append(hero)
game_objects.append(wall)
def update(events):
for event in events:
if event.type == pygame.QUIT:
done = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
hero.move.x = -hero.speed
if event.key == pygame.K_RIGHT:
hero.move.x = hero.speed
if event.key == pygame.K_UP:
hero.move.y = -hero.speed
if event.key == pygame.K_DOWN:
hero.move.y = hero.speed
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
hero.move.x = 0
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
hero.move.y = 0
test_rect = pygame.Rect(hero.rect.left + hero.move.x, hero.rect.top + hero.move.y, hero.rect.width, hero.rect.height)
for game_object in game_objects:
if isinstance(game_object, Wall) and test_rect.colliderect(game_object.rect):
hero.move = Vector2(0, 0) #Why the HELL is this not working properly?!
game_object.update()
def draw(screen):
screen.fill((255, 255, 255))
for game_object in game_objects:
game_object.draw(screen)
pygame.display.update()
clock.tick(60)
done = False
while done == False:
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
done = True
update(events)
draw(screen)
pygame.quit()
Code: Alles auswählen
import pygame
class GameObject(pygame.sprite.Sprite):
def __init__(self, image_path, position):
super(GameObject, self).__init__()
self.visible = True
self.image = pygame.image.load(image_path).convert()
self.rect = self.image.get_rect()
self.rect.topleft = position
def update(self):
pass
def draw(self, screen):
pass
Code: Alles auswählen
import pygame
from gameobject import GameObject
class Wall(GameObject):
def __init__(self, position):
super(Wall, self).__init__("wall.png", position)
def update(self):
pass
def draw(self, screen):
if self.visible:
screen.blit(self.image, self.rect)
Code: Alles auswählen
import pygame
from gameobject import GameObject
from vector2 import Vector2
class Hero(GameObject):
def __init__(self, position):
super(Hero, self).__init__("hero.png", position)
self.health = 100
self.position = Vector2(position[0], position[1])
self.move = Vector2(0, 0)
self.speed = 4
def update(self):
self.position += self.move
self.rect.topleft = [self.position.x, self.position.y]
def draw(self, screen):
if self.visible:
screen.blit(self.image, self.rect)