【发布时间】:2020-04-26 15:30:21
【问题描述】:
您好,我目前正在为班级制作一个迷你游戏(第一次做这样的事情),我真的不知道如何从 碰撞检测 开始。好的,我正在创建的游戏是一个自上而下的相扑格斗游戏,在冰冷的圆形竞技场上,您四处移动以获得动力和 速度,并尝试互相击倒以获得积分。到目前为止,我的运动加速度/摩擦力几乎下降了,而且我还有一个系统来检测何时发生碰撞,我只是不知道如何在角色发生碰撞时实际将它们推开。我想我会根据攻击者的速度和我将要添加的角色的抵抗统计数据来确定击退量/伤害。我还假设我必须用切线之类的东西做一些激烈的数学运算才能得到正确的方向,但我根本不知道该怎么做。我将非常感谢任何帮助,如果您以后想通过不和谐之类的方式在这个项目上帮助我,我愿意接受未来的帮助。谢谢你的一切
import pygame, sys, time
from pygame.locals import *
import random
import math
#Colors
colorRed=pygame.Color(241,59,62)
colorPurple=pygame.Color(200,254,249)
colorBlue=pygame.Color(52, 207, 235)
colorGreen=pygame.Color(100,182,100)
colorWhite=pygame.Color(255,250,250)
colorBlack=pygame.Color(0,0,0)
colorOrange=pygame.Color(242,164,0)
colorBrown=pygame.Color(148,103,58)
#Dimensions
w=800
h=600
pygame.init()
fpsClock=pygame.time.Clock()
screen=pygame.display.set_mode((w,h))
pygame.display.set_caption ('SUMO')
centerX=w//2
centerY=h//2
#Stage
stageR=250
def stage (centerX,centerY):
"""stage (centerX,centerY) - creates a stage with given centerpoint"""
pygame.draw.circle(screen, colorBlue, (centerX,centerY),stageR)
#Character 1
xR=int((stageR//10))
x1=int(centerX-(stageR*0.8))
y1=centerY
x1_dir=0
y1_dir=0
def char1 (x1,y1):
"""char1 (x1,y1) - creates char1 at given coordinates"""
pygame.draw.circle(screen, colorRed, (x1,y1),xR)
print (x1)
print (centerX)
#Character 2
x2=int(centerX+(stageR*0.8))
y2=centerY
x2_dir=0
y2_dir=0
def char2 (x2,y2):
"""char2 (x2,y2) - creates char1 at given coordinates"""
pygame.draw.circle(screen, colorGreen, (x2,y2),xR)
while True:
screen.fill(colorBlack)
for event in pygame.event.get():
#Game Exit
if event.type== QUIT:
pygame.quit()
sys.exit()
distance=math.hypot(x1-x2,y1-y2)
if distance <= 2*xR:
print ("HIT")
keys = pygame.key.get_pressed()
if keys[K_d] or keys[K_a]:
x1_dir += 0.1 if keys[K_d] else -0.1
else:
x1_dir *= 0.98
if keys[K_w] or keys[K_s]:
y1_dir += 0.1 if keys[K_s] else -0.1
else:
y1_dir *= 0.98
# -------------------- CHAR2 MOVEMENT --------------------
if keys[K_RIGHT] or keys[K_LEFT]:
x2_dir += 0.1 if keys[K_RIGHT] else -0.1
else:
x2_dir *= 0.98
if keys[K_UP] or keys[K_DOWN]:
y2_dir += 0.1 if keys[K_DOWN] else -0.1
else:
y2_dir *= 0.98
stage (centerX,centerY)
char1 (round(x1),round(y1))
char2 (round(x2),round(y2))
x1+=x1_dir
y1+=y1_dir
x2+=x2_dir
y2+=y2_dir
pygame.display.update()
fpsClock.tick(60)
【问题讨论】:
-
pygame.Rect()有colliderect()所以你可以做player.rect.colliderect(enemy.rect)。pygame.Sprite甚至有collidecircle -
如果我没记错的话,他们
(x1-x2)/(y1-y2)或(y1-y2)/(x1-x2)在玩家之间提供tangents(alpha),这样你就可以在碰撞后使用这个角度来获得新的方向。 -
问题解决了吗?
标签: python python-3.x pygame collision-detection game-physics