我画了一个旋转的矩形,我需要检查它是否碰撞。整个班级:
class Laser:
def __init__(self, player_x, player_y):
self.x = player_x
self.y = player_y
self.original_image = pygame.Surface((2, 1000))
self.original_image.set_colorkey( (0,0,0) )
self.original_image.fill( (255,0,0) )
self.copy_image = self.original_image.copy()
self.copy_image.set_colorkey( (0,0,0) )
self.rect = self.copy_image.get_rect()
self.new_image = pygame.Surface((2, 1000))
self.angle = 0
def continueDrawLaser(self):
if laser_bool:
screen.blit(self.new_image, self.rect)
def rotate(self):
# get rectangle of player and laser, as if the angle would be 0
player_rect = player1.original_player_image.get_rect(topleft=(player1.x, player1.y))
laser_rect = self.original_image.get_rect(midbottom=player_rect.midtop)
self.angle = player1.angle
pivotPos = [player_rect.centerx - laser_rect.x, player_rect.centery - laser_rect.y]
# calcaulate the axis aligned bounding box of the rotated image
w, h = self.original_image.get_size()
box = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]
box_rotate = [p.rotate(self.angle) for p in box]
min_box = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])
max_box = (max(box_rotate, key=lambda p: p[0])[0], max(box_rotate, key=lambda p: p[1])[1])
# calculate the translation of the pivot
pivot = pygame.math.Vector2(pivotPos[0], -pivotPos[1])
pivot_rotate = pivot.rotate(self.angle)
pivot_move = pivot_rotate - pivot
# calculate the upper left origin of the rotated image
origin = (laser_rect.x + min_box[0] - pivot_move[0], laser_rect.y - max_box[1] + pivot_move[1]) #x,y
# get a rotated image
self.new_image = pygame.transform.rotate(self.original_image, self.angle)
# get new rectangle
self.rect = self.new_image.get_rect(topleft=origin)
这是碰撞函数:
#check if rock collides with laser
def collisionRockLaser(self, laser1):
laser_rect = laser1.rect
rock_rect = pygame.Rect(self.x, self.y, rock_width, rock_height)
if laser_rect.colliderect(rock_rect):
rocks.pop(rocks.index(rock2))
global score
score += 1
这就是我得到的:
我认为这已经足够了,因为它每次都会随着旋转位置的更新来检测碰撞,但是似乎我必须使用分离轴定理,你能帮助我吗?
一种选择是创建一个算法,它将一条直线和一个矩形相交。
首先创建一个与两条线段相交的算法:
P ... point on the 1. line
R ... normalized direction of the 1. line
Q ... point on the 2. line
S ... normalized direction of the 2. line
alpha ... angle between Q-P and R
beta ... angle between R and S
X ... intersection point
t ... distance between P and X
u ... distance between Q and X
gamma = 180° - alpha - beta
t = | Q - P | * sin(gamma) / sin(beta)
u = | Q - P | * sin(alpha) / sin(beta)
t = dot(Q-P, (S.y, -S.x)) / dot(R, (S.y, -S.x)) = determinant(mat2(Q-P, S)) / determinant(mat2(R, S))
u = dot(Q-P, (R.y, -R.x)) / dot(R, (S.y, -S.x)) = determinant(mat2(Q-P, R)) / determinant(mat2(R, S))
X = P + R * t = Q + S * u
在计算线交点问题的答案中详细解释了该算法
def collideLineLine(P0, P1, Q0, Q1):
d = (P1[0]-P0[0]) * (Q1[1]-Q0[1]) + (P1[1]-P0[1]) * (Q0[0]-Q1[0])
if d == 0:
return False
t = ((Q0[0]-P0[0]) * (Q1[1]-Q0[1]) + (Q0[1]-P0[1]) * (Q0[0]-Q1[0])) / d
u = ((Q0[0]-P0[0]) * (P1[1]-P0[1]) + (Q0[1]-P0[1]) * (P0[0]-P1[0])) / d
return 0 <= t <= 1 and 0 <= u <= 1
要测试线段是否与矩形相交,您必须测试它是否与矩形的四条边中的任何一条相交:
def colideRectLine(rect, p1, p2):
return (collideLineLine(p1, p2, rect.topleft, rect.bottomleft) or
collideLineLine(p1, p2, rect.bottomleft, rect.bottomright) or
collideLineLine(p1, p2, rect.bottomright, rect.topright) or
collideLineLine(p1, p2, rect.topright, rect.topleft))
根据角度沿激光器设置一条线:
angle = player1.angle
if angle < 0:
angle += 360
if angle < 90 or (angle > 180 and angle < 270):
laserline = [laser1.rect.topleft, laser1.rect.bottomright]
else:
laserline = [laser1.rect.bottomleft, laser1.rect.topright]
线中的求值与pygame相交。矩形
enemy_Rect
:
collide = colideRectLine(enemy_rect, *laserline)
所以我试图用pygame制作一个我们之间的游戏。我刚刚开始,所以我没有太多东西,现在正在制作地图。然而,我正在努力解决的一件事是碰撞逻辑。地图目前有一个细长的八边形形状,但是我想不管是什么形状,我都会使用类似pygame多边形的东西。当我运行我现在的代码时,它会检查我的玩家(pygame矩形)和墙壁(pygame多边形)之间的碰撞,它说: 我发现这是因为pygame多边形返回了一个矩形,但在碰撞检
问题内容: 我遇到一个问题,即一个矩形与另一个矩形发生碰撞。所以我的问题是,如何获取相交方法以检查碰撞?还是在这种情况下还有其他方法可以处理碰撞? 我正在创建一个回合制战斗游戏(类似于《最终幻想》或《龙骑传奇》),其中玩家的角色在屏幕的右侧,而敌人在屏幕的左侧。玩家和敌人轮流进攻。因此,当玩家攻击时,子画面动画会从右到左在屏幕上移动,直到停在敌人面前,进行攻击并返回到其起始坐标。玩家和敌人周围都有
我遇到了一个问题,显示一个矩形与另一个矩形发生了碰撞。所以我的问题是,如何让Intersect方法检查碰撞?或者在这种情况下有其他方法来处理碰撞吗? 我正在制作一个回合制战斗游戏(类似于《最终幻想》或《龙骑兵传说》),其中玩家的角色位于屏幕的右侧,敌人位于屏幕左侧。玩家和敌人轮流攻击。因此,当玩家攻击时,精灵动画会在屏幕上从右向左移动,直到它停在敌人面前,攻击并返回到其起始坐标。玩家和敌人都有一个
我使用JavaSlick StateBaeedGame,并希望旋转我的矩形我的碰撞,我知道这是可以做的视觉目的使用图形或Graphics2D对象,但不修改矩形本身,最初列出的变量和图形方法中调用的矩形不旋转,使事情更清楚这里是一些代码: 当我加载GUI时,矩形rectTwo将显示为旋转,但它实际上并没有旋转,如果我测试碰撞,矩形仍然为0度。 那么,如何让矩形变量改变其角度呢?
我正在编写一个游戏,涉及碰撞的一个移动的圆,由用户控制,和一个移动的矩形,由计算机控制。 完整的代码可以在这里找到:游戏 我在圆和矩形之间的碰撞检测方面遇到了麻烦。当矩形是静态的,碰撞检测工作完美。当圆和矩形的边缘在任一边接触时,程序就会按照它应该的方式进行操作。 这是碰撞检测功能。 谢谢。
在我的自上而下游戏中,当我的玩家通过婴儿床时,我该如何让他发生碰撞?我用的是交叉矩形。 这是我的密码 更新方法 在渲染方法中 这是完整的代码 谁能告诉我矩形碰撞检测的正确实现是什么?没有重叠,我是这个框架的新手。致谢和预付款:)