[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 编码查看转换 | 代码下载 | 常见问题及讨论 | Python游戏编程讨论 | 《深入解析ASP核心技术》 | Python游戏编程教程 | HEIC转JPG工具
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]python网格查找敌人,改善性能。

上一篇:[备忘]角度较小(<15°),sin ≈ tan
下一篇:[备忘]Python敌人追踪玩家的两种写法。

添加日期:2026/7/16 7:03:15 快速返回   返回列表 阅读63次


CELL_SIZE = 80


class EnemyGrid:

    def __init__(self):
        # 存储每个格子里有哪些敌人,便于快速查询
        self.grid = {}  # {(gx, gy): [enemy, ...]}

    # 每帧重建敌人网格
    def build(self, enemies):

        self.grid.clear()

        for e in enemies:
            gx = int(e["x"] // CELL_SIZE)
            gy = int(e["y"] // CELL_SIZE)
            key = (gx, gy)
            if key not in self.grid:
                self.grid[key] = []
            self.grid[key].append(e)

    # 获取子弹周围格子内的敌人,radius=0只查当前格
    # 比如radius传80,那就是周围2格的敌人,
    def get_nearby(self, x, y, radius=None):

        if radius is None:
            radius = CELL_SIZE

        cells = max(
            1,
            int(radius // CELL_SIZE) + 1
        )

        cx = int(x // CELL_SIZE)
        cy = int(y // CELL_SIZE)

        result = []

        for dx in range(-cells, cells + 1):
            for dy in range(-cells, cells + 1):

                key = (cx + dx, cy + dy)

                if key in self.grid:
                    result.extend(self.grid[key])

        return result

    # 横线和竖线都可以统一成矩形
    # ----------------
    #     y
    # ----------------
    # rect = pygame.Rect(0,y - 20,settings.width,40)
    def query_rect(self, rect):

        result = []

        start_x = int(rect.left // CELL_SIZE)
        end_x = int(rect.right // CELL_SIZE)

        start_y = int(rect.top // CELL_SIZE)
        end_y = int(rect.bottom // CELL_SIZE)

        for gx in range(start_x, end_x + 1):
            for gy in range(start_y, end_y + 1):
                key = (gx, gy)
                if key in self.grid:
                    result.extend(self.grid[key])

        return result

 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved