Ich habe Probleme, diese Kollision zu 100% zu arbeiten. Wenn ich nur eine Taste gleichzeitig drücke, scheint die Kollision gut zu funktionieren, aber wenn ich eine Taste drücke und weiter drücke, während ich kollidiere, dann drücke eine andere Taste, die Kollision scheint beide Schlüssel gleichzeitig zu berücksichtigen. Von der Forschung scheint es, dass ich separate Achsenberechnungen machen muss, aber ich bin mir nicht sicher, wie genau das geht, indem ich den Algorithmus verwende, den ich für die Kollision habe. Ich möchte, dass dies möglichst prozedural ist. Wenn jemand meinen Code mit einer funktionierenden Verfahrenslösung ändern könnte, würde ich es sehr begrüßen. Vielen Dank.Rect Kollision auf einem Pygame-Display; Drücken einer zweiten Taste, nach der Kollision, verursacht Rect zu springen
import pygame as pg
import sys
from math import fabs
pg.init()
width = 600
height = 600
gameDisplay = pg.display.set_mode((width, height))
pg.display.set_caption('Block')
white = (255, 255, 255)
red = (255, 0, 0)
clock = pg.time.Clock()
closed = False
FPS = 60
Player_Speed = 200
x, y = 270, 0
vx = 0
vy = 0
collision = False
def Collision(hero, enemy):
global vx, vy, x, y, collision
deltay = fabs(block.centery - ENEMY.centery)
deltax = fabs(block.centerx - ENEMY.centerx)
if deltay < ENEMY.height and deltax < ENEMY.width:
collision = True
if vx > 0:
vx = 0
x = ENEMY[0] - block[2]
if vx < 0:
vx = 0
x = ENEMY[0] + 30
if vy > 0:
vy = 0
y = ENEMY[1] - block[3]
if vy < 0:
vy = 0
y = ENEMY[1] + 30
else:
collision = False
def xy_Text(x, y):
font = pg.font.SysFont("Courier", 16, True)
text = font.render("X: " + str(round(x)), True, (0,150,0))
text1 = font.render("Y: " + str(round(y)), True, (0,150,0))
gameDisplay.blit(text, (0,0))
gameDisplay.blit(text1, (0,14))
while not closed:
for event in pg.event.get():
if event.type == pg.QUIT:
closed = True
dt = clock.tick(FPS)/1000
vx, vy = 0, 0
keys = pg.key.get_pressed()
if keys[pg.K_ESCAPE]:
closed = True
if keys[pg.K_LEFT] or keys[pg.K_a]:
vx = -Player_Speed
if keys[pg.K_RIGHT] or keys[pg.K_d]:
vx = Player_Speed
if keys[pg.K_UP] or keys[pg.K_w]:
vy = -Player_Speed
if keys[pg.K_DOWN] or keys[pg.K_s]:
vy = Player_Speed
if vx != 0 and vy != 0:
vx *= 0.7071
vy *= 0.7071
gameDisplay.fill(white)
ENEMY = pg.draw.rect(gameDisplay, red, (270, 270, 30, 30))
block = pg.draw.rect(gameDisplay, (0, 150, 0), (x, y, 30, 30))
xy_Text(x, y)
x += vx * dt
y += vy * dt
Collision(block, ENEMY)
pg.display.update()
clock.tick(FPS)
pg.quit()
sys.exit()
Die Handhabung von Kollisionen ist schwierig. Ich würde Ihnen raten - anstatt zu versuchen, das Rad neu zu erfinden - verwenden Sie eine vorhandene Bibliothek wie Box2d oder Pymunk – Omni
Ich weiß, dass ich eine vorhandene Bibliothek verwenden kann, sogar pygame hat Kollisions-Behandlung. Ich erfinde das Rad für Bildungszwecke neu. Ich möchte verstehen, wie alles funktioniert. Danke für den Hinweis. – Tophiero
Das ist ein großartiges Motiv. Bei einem erzwungenen Ansatz können Sie beispielsweise Kollisionen bewältigen, indem Sie Hilfskräfte erstellen, um kollidierende Objekte auseinander zu bewegen. Die Anzahl der gedrückten Tasten wäre für ein solches Modell wahrscheinlich irrelevant. Die Tatsache, dass dies in Ihrer Frage eine große Rolle spielt, impliziert jedoch aus meiner Sicht, dass Sie mehr Forschung darüber benötigen, wie solche Simulationen funktionieren. – Omni