亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pygame如何讓球碰撞

Pygame如何讓球碰撞

一只斗牛犬 2023-04-11 16:02:58
我想在 pygame 中制作一個腳本,其中兩個球相互飛向,當它們碰撞時它們應該相互彈開,但我不知道該怎么做,你能幫幫我嗎?
查看完整描述

1 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

要檢測 2 個圓(分別是球)是否發生碰撞,您必須測試圓中心點之間的歐幾里得距離是否小于半徑之和。我建議使用pygame.math.Vector2/distance_to()進行計算。
在下文中,圓 1 由圓心(x1, y1)和半徑r1定義。第二個圓由(x2, y2)r2定義:

v1?=?pygame.math.Vector2(x1,?y1)
v2?=?pygame.math.Vector2(x2,?y2)
if?v1.distance_to(v2)?<?r1?+?r2:
????print("hit")

如果你想讓圓圈彈跳,你必須像臺球一樣在交點的法向量處反映圓圈的運動矢量。使用?pygame.math.Vector2/reflect_ip()reflect()計算圓的新方向。
圓圈的運動由(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()


查看完整回答
反對 回復 2023-04-11
  • 1 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號