【问题标题】:Pygame Collision Detection (rectangles) [duplicate]Pygame碰撞检测(矩形)[重复]
【发布时间】:2021-07-27 05:17:50
【问题描述】:

我刚接触 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

我已尝试查找有关如何执行此操作的教程,但我不能很好地理解。一点帮助将不胜感激。

【问题讨论】:

  • 您的确切问题是什么,或者您的代码有什么问题?
  • 对不起。我怎样才能让矩形在碰到另一个矩形时反弹它。
  • 是的,明白了。看起来你已经尝试在上面的代码中实现它,它的哪一点不起作用?
  • 我正在尝试创建一个简单版本的破砖机。到目前为止,我的代码只能使“球”(即矩形)从墙上反弹,但我希望它也能从桨(第二个矩形)反弹。
  • youtube.com/watch?v=jeZkAKtDIX0 这里是碰撞检测教程。

标签: python pygame collision-detection


【解决方案1】:

pygameRect 类中有一个名为colliderect 的方法。

您也可以参考this之前的回答获得一些提示。

【讨论】:

    【解决方案2】:
    • 我计算圆的两个中心点之间的角度。还要记住 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 个整数单位,则可能会出现问题,因为我们只检查它们是否相等,而不是它们是否重叠。更好的方法可能是将它们保留为浮点数并检查差异是否在特定范围内,这可能取决于玩家速度以解释帧之间更大的跳跃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2021-12-14
      • 2013-10-12
      • 2016-08-31
      • 1970-01-01
      相关资源
      最近更新 更多