我刚刚介绍了Python,我在检测两个矩形之间的碰撞时遇到了一些麻烦。我想要一个矩形在碰撞时反弹另一个矩形
到目前为止,这是我的代码:
import pygame
import sys
from pygame.locals import *
pygame.init()
ww = 400
wh = 300
w = pygame.display.set_mode((ww,wh))
pygame.display.set_caption('OFK')
s = pygame.display.get_surface()
green = pygame.Color(152,251,152)
blue = pygame.Color(135,206,250)
white = pygame.Color(255,255,240)
clock = pygame.time.Clock()
background_file = 'ice-in-water.jpg'
background_image = pygame.image.load(background_file).convert()
rx = ww/2
ry = wh/2
rw = 30
rh = 20
px = ww/2
py = wh - 40
pw = 60
ph = 10
vdirection = -1
hdirection = 1
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
quit()
if event.type == KEYDOWN:
#print (event.key,event.unicode)
if event.key == 275:
px = px + 30
if px > ww - pw:
px = ww - pw
if event.key == 276:
px = px - 30
if px < 0:
px = 0
s.fill(green)
pygame.draw.rect(s,blue,(rx,ry,rw,rh),0)
pygame.draw.rect(s,white,(px,py,pw,ph),0)
#w.blit(background_image,(-80,0))
pygame.display.update()
#mx,my = pygame.mouse.get_pos()
#print ("x: ", mx, "y: ", my)
#print ("ry: ", ry, "wh: ", wh)
rx = rx + 1.5 * hdirection
if rx > ww - rw:
hdirection = -hdirection
if rx < 0:
hdirection = -hdirection
ry = ry + 1.5 * vdirection
if ry > ww:
rx = ww/2
ry = wh/2
vdirection = -vdirection
if ry < 0:
vdirection = -vdirection
我试过找到关于如何做到这一点的教程,但我无法理解。我们将不胜感激。
答案 0 :(得分:0)
在Rect
pygame
类中,有一种名为colliderect的方法。
您还可以参考this上一个答案获取一些提示。
答案 1 :(得分:0)
我计算圆的两个中心点之间的角度。另请记住,arctan 返回 -pi/2 和 pi/2 之间的角度,这意味着您需要考虑单位圆的另一侧。
然后,如果您要绘制一条从中心点到中心点的线,我会使用该角度来确定指向另一个圆的圆的确切点。
最后,我将它们强制转换为 int 作为检查两点是否最终相等的简单方法。
def detectCollision(self, game):
for planet in game.planets:
directionX = self.x - planet.x
directionY = self.y - planet.y
theta = atan(directionY / directionX)
if directionX < 0:
theta += pi
if theta < 0:
theta += 2 * pi
# point on player circle
point1 = [self.x + self.radius*cos(theta+pi),self.y + self.radius*sin(theta+pi)]
# point on planet circle
point2 = [planet.x + planet.radius*cos(theta), planet.y + planet.radius*sin(theta)]
if int(point1[0]) == int(point2[0]) and int(point1[1]) == int(point2[1]):
print("collided!")
这在技术上是可行的,但如果移动步长大于 1 个整数的单位,则可能会出现问题,因为我们只检查它们是否相等,而不是它们是否重叠。更好的方法可能是将它们保留为浮动并检查差异是否在某个范围内,这可能取决于玩家速度以解决帧之间更大的跳跃。