1 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
要檢測(cè) 2 個(gè)圓(分別是球)是否發(fā)生碰撞,您必須測(cè)試圓中心點(diǎn)之間的歐幾里得距離是否小于半徑之和。我建議使用pygame.math.Vector2
/distance_to()
進(jìn)行計(jì)算。
在下文中,圓 1 由圓心(x1, y1)和半徑r1定義。第二個(gè)圓由(x2, y2)和r2定義:
v1?=?pygame.math.Vector2(x1,?y1) v2?=?pygame.math.Vector2(x2,?y2) if?v1.distance_to(v2)?<?r1?+?r2: ????print("hit")
如果你想讓圓圈彈跳,你必須像臺(tái)球一樣在交點(diǎn)的法向量處反映圓圈的運(yùn)動(dòng)矢量。使用?pygame.math.Vector2
/reflect_ip()
或reflect()
計(jì)算圓的新方向。
圓圈的運(yùn)動(dòng)由(mx1, my1)和?(mx2, my2)給出:
nv?=?v2?-?v1 m1?=?pygame.math.Vector2(mx1,?my1).reflect(nv) m2?=?pygame.math.Vector2(mx2,?my2).reflect(nv) mx1,?my1?=?m1.x,?m1.y mx2,?my2?=?m2.x,?m2.y
import pygame
pygame.init()
width, height = 400, 400
window = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
x1, y1, r1, mx1, my1 = 200, 200, 50, 2, 0.5
x2, y2, r2, mx2, my2 = 300, 200, 50, -1, -1.5
def move(c, v, r, m):
? ? c += v
? ? if c < r: c, v = r, -v
? ? if c > m-r: c, v = m-r, -v? ?
? ? return c, v
hit_count = 0
run = True
while run:
? ? clock.tick(60)
? ? for event in pygame.event.get():
? ? ? ? if event.type == pygame.QUIT:
? ? ? ? ? ? run = False
? ? x1, mx1 = move(x1, mx1, r1, width)
? ? y1, my1 = move(y1, my1, r1, height)
? ? x2, mx2 = move(x2, mx2, r2, width)
? ? y2, my2 = move(y2, my2, r2, height)
? ? v1 = pygame.math.Vector2(x1, y1)
? ? v2 = pygame.math.Vector2(x2, y2)
? ? if v1.distance_to(v2) < r1 + r2 - 2:
? ? ? ? hit_count += 1
? ? ? ? print("hit:", hit_count)
? ? ? ? nv = v2 - v1
? ? ? ? m1 = pygame.math.Vector2(mx1, my1).reflect(nv)
? ? ? ? m2 = pygame.math.Vector2(mx2, my2).reflect(nv)
? ? ? ? mx1, my1 = m1.x, m1.y
? ? ? ? mx2, my2 = m2.x, m2.y
? ? window.fill((127, 127, 127))
? ? pygame.draw.circle(window, (255, 0, 0), (round(x1), round(y1)), r1, 4)
? ? pygame.draw.circle(window, (0, 0, 255), (round(x2), round(y2)), r2, 4)
? ? pygame.display.flip()
添加回答
舉報(bào)