我不断收到 group single has no attribute rect 错误

2024-01-09

我试图为我的角色制作一个相机,当我运行代码时我不断收到这个消息

import collections
import pygame
from camera import *
from settings import tile_size
from support import import_csv_layout, import_cut_graphics
from tiles import Tile , StaticTile
from player import Player

class Level:
    def __init__(self,level_data,surface):
        self.display_surface = surface
        self.world_shift = 0
        

        player_layout = import_csv_layout(level_data['character'])
        self.player = pygame.sprite.GroupSingle()
        self.goal = pygame.sprite.GroupSingle()
        self.player_setup(player_layout)

        terrain_layout = import_csv_layout(level_data['bricks'])
        self.terrain_sprites = self.create_tile_group(terrain_layout,'bricks')


        spikes_layout = import_csv_layout(level_data['spikes'])
        self.spikes_sprites = self.create_tile_group(spikes_layout,'spikes')

        crate_layout = import_csv_layout(level_data['crate'])
        self.crate_sprites = self.create_tile_group(crate_layout,'crate')

        pillars_layout = import_csv_layout(level_data['pillars'])
        self.pillars_sprites = self.create_tile_group(pillars_layout,'pillars')
        
        coins_layout = import_csv_layout(level_data['coins'])
        self.coins_sprites = self.create_tile_group(coins_layout,'coins')

        lava_layout = import_csv_layout(level_data['lava'])
        self.lava_sprites = self.create_tile_group(lava_layout,'lava')



    def player_setup(self,layout):
        for row_index, row in enumerate(layout):
            for col_index, col in enumerate(row):
                x = col_index * tile_size
                y = row_index * tile_size
                if col == '0':
                    sprite = Player((x,y),self.display_surface)
                    self.player.add(sprite)
                if col == '1':
                    hat_surface = pygame.image.load(r'C:\Users\windows\Desktop\actual game\graphics\hat.png')
                    sprite = StaticTile(tile_size,x,y,hat_surface)
                    self.goal.add(sprite)

    def create_tile_group(self,layout,type):
        sprite_group = pygame.sprite.Group()
        
        for row_index,row in enumerate(layout):
            for cell_index,val in enumerate(row):
                if val != '-1':
                    x = cell_index*tile_size
                    y = row_index*tile_size

                    if type == 'bricks':
                        terrain_tile_list = import_cut_graphics(r'C:\Users\windows\Desktop\actual game\graphics\terrain\tileset.png')
                        tile_surface = terrain_tile_list[int(val)]
                        sprite = StaticTile(tile_size,x,y,tile_surface)
                    if type == 'spikes':
                        spikes_tile_list = import_cut_graphics(r'C:\Users\windows\Desktop\actual game\graphics\terrain\tileset.png')
                        tile_surface = spikes_tile_list[int(val)]
                        sprite = StaticTile(tile_size,x,y,tile_surface)

                    if type == 'crate':
                        crate_tile_list = import_cut_graphics(r'C:\Users\windows\Desktop\actual game\graphics\terrain\tileset.png')    
                        tile_surface = crate_tile_list[int(val)]
                        sprite = StaticTile(tile_size,x,y,tile_surface)
                    
                    if type == 'pillars':
                        pillars_tile_list = import_cut_graphics(r'C:\Users\windows\Desktop\actual game\graphics\terrain\tileset.png')    
                        tile_surface = pillars_tile_list[int(val)]
                        sprite = StaticTile(tile_size,x,y,tile_surface)

                    if type == 'coins':
                        coins_tile_list = import_cut_graphics(r'C:\Users\windows\Desktop\actual game\graphics\terrain\tileset.png')    
                        tile_surface = coins_tile_list[int(val)]
                        sprite = StaticTile(tile_size,x,y,tile_surface)
                        
                    if type == 'lava':
                        lava_tile_list = import_cut_graphics(r'C:\Users\windows\Desktop\actual game\graphics\terrain\tileset.png')    
                        tile_surface = lava_tile_list[int(val)]
                        sprite = StaticTile(tile_size,x,y,tile_surface)
                        

                    sprite_group.add(sprite)
        return sprite_group





    def veritcal_movement_collision(self):
        player = self.player.sprite
        player.apply_gravity()
        collidable_sprites =self.terrain_sprites.sprites() + self.spikes_sprites.sprites() + self.crate_sprites.sprites()

        for sprite in collidable_sprites:
            if sprite.rect.colliderect(player.rect):
                if player.direction.y <0 :
                    player.rect.top = sprite.rect.bottom
                    player.direction.y = 0
                    player.on_ceiling = True
                elif player.direction.y > 0:
                    player.rect.bottom = sprite.rect.top
                    player.direction.y = 0
                    player.on_ground = True


            if player.on_ground and player.direction.y < 0 or player.direction.y > 1:
                player.on_ground = False
            if player.on_ceiling and player.direction.y > 0:
                player.on_ceiling = False
                    
    def horizontal_movement_collision(self):
        player = self.player.sprite
        player.rect.x += player.direction.x* player.speed
        collidable_sprites =self.terrain_sprites.sprites() + self.spikes_sprites.sprites() + self.crate_sprites.sprites()

        for sprite in collidable_sprites:
            if sprite.rect.colliderect(player.rect):
                if player.direction.x < 0:
                    player.rect.left = sprite.rect.right
                    self.on_left = True
                    self.current_x = player.rect.left
                elif player.direction.x > 0:
                    player.rect.right = sprite.rect.left
                    self.on_right = True
                    self.current_x = player.rect.right
        
        if player.on_left and (player.rect.left < self.current_x or player.direction.x >= 0):
             player.on_left = False
        elif player.on_right and (player.rect.right > self.current_x or player.direction.x <= 0):
            player.on_right = False


    def run(self):
        self.terrain_sprites.draw(self.display_surface)
        self.terrain_sprites.update(self.world_shift)

        self.spikes_sprites.update(self.world_shift)
        self.spikes_sprites.draw(self.display_surface)
        
        self.crate_sprites.update(self.world_shift)
        self.crate_sprites.draw(self.display_surface)

        self.pillars_sprites.update(self.world_shift)
        self.pillars_sprites.draw(self.display_surface)


        self.coins_sprites.update(self.world_shift)
        self.coins_sprites.draw(self.display_surface)

        self.lava_sprites.update(self.world_shift)
        self.lava_sprites.draw(self.display_surface)
        
        self.goal.update(self.world_shift)
        self.goal.draw(self.display_surface)


        self.player.update()
        self.horizontal_movement_collision()
        self.veritcal_movement_collision()
        self.player.draw(self.display_surface)


        self.camera = Camera(self.player)
        self.follow = Follow(self.camera,self.player)
        self.border = Border(self.camera,self.player)
        self.auto = AutoScroll(self.camera,self.player)
        self.camera.setmethod(self.follow)

The Camera期望一个Sprite https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite而不是一个GroupSingle https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.GroupSingle:

self.camera = Camera(self.player)

self.camera = Camera(self.player.sprite)

我建议使用pygame.sprite.collide_rect https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_rect:

if pygame.sprite.collide_rect(sprite, self.player.sprite):

or pygame.sprite.spritecollide https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollide,其中第二个参数是Group:

if pygame.sprite.spritecollide(sprite, self.player, False)

也可以看看如何检测 pygame 中的碰撞? https://stackoverflow.com/questions/29640685/how-do-i-detect-collision-in-pygame/65064907#65064907.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我不断收到 group single has no attribute rect 错误 的相关文章

  • 我如何在 python 2.6 中测试抽象方法

    我有一个抽象类 import abc class Hello object metaclass abc ABCMeta abc abstractmethod def add self foo pass abc abstractmethod
  • tensorflow Protobuf编译问题

    我想为 google 对象检测 API 编译 protobuf 库 我按照官方教程输入protoc object detection protos proto python out 然后我得到的是 object detection prot
  • CVXPY 二次规划; ArpackNoConvergence 错误

    我尝试使用 Python 包 CVXPY 来解决第一种形式的凸二次规划问题 https www cvxpy org examples basic quadratic program html https www cvxpy org exam
  • 如何将本机 popcount 与 numba 一起使用

    我正在使用 numba 0 57 1 我想在我的代码中利用本机 CPU popcount 我现有的代码太慢 因为我需要运行它数亿次 这是一个 MWE import numba as nb nb njit nb uint64 nb uint6
  • 如何忽略传递给函数的意外关键字参数?

    假设我有一些功能 f def f a None print a 现在 如果我有一本字典 比如dct a Foo 我可以打电话f dct 并得到结果Foo打印 但是 假设我有一本字典dct2 a Foo b Bar 如果我打电话f dct2
  • 重新索引错误没有意义

    I have DataFrames大小在 100k 到 2m 之间 我正在处理这个问题的框架是如此之大 但请注意 我必须对其他框架执行相同的操作 gt gt gt len data 357451 现在这个文件是通过编译许多文件创建的 所以它
  • 如何为 Intellij/PyCharm 设置 PYTHONSTARTUP 脚本

    我尝试添加PYTHONSTARTUP环境变量 我还尝试了自定义启动脚本 但更令人惊讶的是 这also没有工作 npa别名无法识别 出于一点绝望 我什至尝试添加到interpreter options 那什么也没做 实际上是什么Interpr
  • pip 安装失败,SSL 证书验证失败 (_ssl.c:833)

    我无法通过 pip install 安装任何外部 python 模块 我已经正确安装了 python 但如果我使用 pip install 它会显示此错误 这是我运行后的代码pip install pytesseract C Users 1
  • 使用 Pymongo 从 Windows 连接到 AWS 实例上的 MongoDB

    此行反复抛出错误 client MongoClient ec2 12 345 67 89 us east 2 compute amazonaws com 27017 ssl True ssl keyfile C mongo pem 由于显而
  • Django 未在 404 页面上应用应用程序中的 CSS 文件

    姜戈3 0 8 Python 3 7 x 我有一个包含一些应用程序的 Django 项目 我正在尝试为 400 403 404 500 错误制作一些 默认 错误页面 我已经这样做了 并显示了适当的模板 但没有任何样式或 JS 在 404 错
  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • 从主机名中提取域名

    是否有一种编程方式可以从给定的主机名查找域名 给出 gt www yahoo co jp 返回 gt yahoo co jp 有效但非常慢的方法是 拆分为 并从左侧删除 1 个组 使用 dnspython 加入并查询 SOA 记录 当返回有
  • 使用 python 只读取 Excel 中的可见行

    我想只读取 python 中 Excel 工作表中的可见行 输入 Excel表 所以当我过滤时 作为 python 中的输出 在本例中我将仅获得可见数据 1 行 这是我的代码 from openpyxl import load workbo
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 检查多个 pd.DataFrame 是否相等

    是否有一种 Pythonic 方式 无循环或递归 来检查是否超过两个pd DataFrames 例如 pd DataFrames 列表 彼此相等吗 就像是 all x equals dfs 0 for x in dfs with dfs数据
  • 如何在 Sublime 2 REPL Mac 中运行 Python 3

    我的问题如下 我安装了 sublime 2 和 sublime repl 插件 一切正常 我唯一需要的是更改在控制台内置的 sublimerepl 上运行的 python 版本 我的意思是 我有 python 2 7 5 预先安装了 mav
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 如何保持 python 3 脚本 (Bot) 运行

    不是母语英语 抱歉 英语可能很蹩脚 我也是编程新手 您好 我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来创建机器人 经过几天的努力 它有效 只有 1 个问题 而我却被这个问题困扰了 如果您需要检查 这是我正在使
  • 如何配置 Eclipse 在使用 Pydev 插件选择“运行”或“调试”时启动浏览器

    我正在使用 Eclipse Pydev 插件学习 Python 和 Django 当我按 运行 或 调试 时 我希望内部或外部浏览器使用 URL http 127 0 0 1 启动或刷新 我见过用 PHP 插件完成的 但没有用 Pydev
  • Matplotlib 中的 TwoSlopeNorm 未按预期工作

    我正在尝试创建一个具有发散颜色图的绘图 该颜色图在零附近不对称 In this https stackoverflow com a 20146989 6288682例如 DivergingNorm函数被使用并产生我想要的 然而 我使用的是更

随机推荐