change a lot
This commit is contained in:
@@ -1,4 +1,10 @@
|
||||
from module import COLORS
|
||||
from module import COLORS, BLOCK_SIZE, PLAYER_SIZE
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
# 解决循环导入
|
||||
if TYPE_CHECKING:
|
||||
from module.player import Player
|
||||
|
||||
|
||||
class Block:
|
||||
id = ''
|
||||
@@ -11,11 +17,45 @@ class Block:
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def get_screen_x(self):
|
||||
return self.x * 20
|
||||
def get_screen_x(self) -> int:
|
||||
return self.x * BLOCK_SIZE
|
||||
|
||||
def get_screen_y(self):
|
||||
return self.y * 20
|
||||
def get_screen_y(self) -> int:
|
||||
return self.y * BLOCK_SIZE
|
||||
|
||||
def check_collision(self, player: 'Player') -> bool:
|
||||
# 将玩家的碰撞体积看作为一个正方形,其形心坐标为 (player.x, player.y)
|
||||
# 方块的坐标,即其的 (x, y) 是在 world 中的下标,需要将其转换为坐标
|
||||
# 由于 下标*边长 计算得到的是这个方块左上角的坐标,所以要添加偏移量
|
||||
# 计算得到形心坐标,偏移量是方块大小的一半
|
||||
real_x = self.x * BLOCK_SIZE + BLOCK_SIZE / 2
|
||||
real_y = self.y * BLOCK_SIZE + BLOCK_SIZE / 2
|
||||
# 判断其是否碰撞仅需看其两形心间的距离,如果玩家的形心落在了方块碰撞
|
||||
# 区域内,则发生碰撞,否则不发生碰撞。方块碰撞检测区域位于同形心坐标
|
||||
# 边长为 PLAYER_SIZE + BLOCK_SIZE 的矩形区域
|
||||
# 定界:
|
||||
left = real_x - (PLAYER_SIZE + BLOCK_SIZE) / 2
|
||||
right = real_x + (PLAYER_SIZE + BLOCK_SIZE) / 2
|
||||
|
||||
top = real_y - (PLAYER_SIZE + BLOCK_SIZE) / 2
|
||||
bottom = real_y + (PLAYER_SIZE + BLOCK_SIZE) / 2
|
||||
# 判碰撞:
|
||||
return left < player.x < right and top < player.y < bottom
|
||||
|
||||
def get_collision_surface(self) -> tuple[int]:
|
||||
# 获得方块表面界限(碰撞面)
|
||||
# 上、右、下、左
|
||||
real_x = self.x * BLOCK_SIZE + BLOCK_SIZE / 2
|
||||
real_y = self.y * BLOCK_SIZE + BLOCK_SIZE / 2
|
||||
|
||||
top = real_y - BLOCK_SIZE / 2
|
||||
bottom = real_y + BLOCK_SIZE / 2
|
||||
left = real_x - BLOCK_SIZE / 2
|
||||
right = real_x + BLOCK_SIZE / 2
|
||||
return top, right, bottom, left
|
||||
|
||||
def get_center_vector(self):
|
||||
return self.x * BLOCK_SIZE + BLOCK_SIZE / 2, self.y * BLOCK_SIZE + BLOCK_SIZE / 2
|
||||
|
||||
|
||||
class GrassBlock(Block):
|
||||
|
||||
Reference in New Issue
Block a user