如何清理精灵而不覆盖其他东西?

2024-01-03

我正在尝试在 pygame 中制作俄罗斯方块,并且发生了碰撞和移动,但是当遮罩与放置的块碰撞时,我用来覆盖旧精灵的矩形覆盖了放置的精灵的部分:

def replace(self):
    pygame.draw.rect(board_surface,(0,0,0),(self.rect.topleft, self.rect.size))

这段代码位于我的精灵类中:

class Block(pygame.sprite.Sprite):
    def __init__(self, blocks):
        super().__init__()

        self.random_block = randint(1,7)

        self.image = blocks[self.random_block]
        self.image = pygame.transform.scale(self.image,(self.image.get_width()*.4, self.image.get_height()*.4))
        self.rect = self.image.get_rect()
        self.rect.topleft = (300,0)
        self.mask = pygame.mask.from_surface(self.image)

    def replace(self):
        pygame.draw.rect(board_surface,(0,0,0),(self.rect.topleft, self.rect.size))



    def handle_keys(self, board_s, block, unactive_blocks):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            if self.rect.left - 60 >= 0:
                self.replace(block_colours)
                self.rect.x -= 60
                self.draw(block_group, board_s)
        elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            if self.rect.right + 60 <= 600:
                self.replace(block_colours)
                self.rect.x += 60
                self.draw(block_group, board_s)
        elif keys[pygame.K_UP] or keys[pygame.K_w]:
            self.replace(block_colours)
            topleft = self.rect.topleft
            self.image = pygame.transform.rotate(self.image, 90)
            self.rect = self.image.get_rect()
            self.rect.topleft = topleft
            self.mask = pygame.mask.from_surface(self.image)
            self.draw(block_group, board_s)
        elif keys[pygame.K_DOWN] or keys[pygame.K_s]:
            if self.rect.bottom + 60 <= 1200:
                self.replace(block_colours)
                self.rect.y += 60
                if pygame.sprite.spritecollide(block,unactive_blocks,False,pygame.sprite.collide_mask):
                    self.rect.y -= 60
                    block_sprite(blocks, block)
                self.draw(block_group, board_s)
            else:
                block_sprite(blocks, block)
    
    def move_every_second(self, block, unactive_blocks):
        if self.rect.bottom + 60 <= 1200:
            self.replace(block_colours)
            self.rect.y += 60
            if pygame.sprite.spritecollide(block,unactive_blocks,False,pygame.sprite.collide_mask):
                self.rect.y -= 60
                block_sprite(blocks, block)
            self.draw(block_group, board_s)
        else:
            block_sprite(blocks, block)
    
    def draw(self, block_group, board_s):
        print(self.rect.x,self.rect.y)
        block_group.draw(board_s)

完整代码位于Pastebin.com/59E74zBJ https://pastebin.com/59E74zBJ


通常且最简单的方法是在每一帧中重新绘制场景。如果背景颜色不统一怎么办?如果是图像,你将如何恢复背景?

但是,您可以创建一个Surface from a Mask with to_surface https://www.pygame.org/docs/ref/mask.html#pygame.mask.Mask.to_surface and blit this Surface而不是绘制一个矩形:

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

如何清理精灵而不覆盖其他东西? 的相关文章

  • 如何调整 matplotlib 单选按钮的大小和纵横比?

    我已经尝试了几个小时来使简单的单选按钮列表的大小和纵横比正确 但没有成功 首先 导入模块 import matplotlib pyplot as plt from matplotlib widgets import RadioButtons
  • 尝试从网页Python和BeautifulSoup获取编码

    我试图从网页检索字符集 这会一直改变 目前我使用 beautifulSoup 来解析页面 然后从标题中提取字符集 这工作正常 直到我遇到一个网站 到目前为止 我的代码以及与其他页面一起使用的代码是 def get encoding soup
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • 从 pyspark.sql 中的列表创建数据框

    我完全陷入了有线的境地 现在我有一个清单li li example data map lambda x get labeled prediction w x collect print li type li 输出就像 0 0 59 0 0
  • 将 pandas 剪切操作转换为常规字符串

    我明白了 pandas cut 操作的输出 0 0 20 1 0 20 2 0 20 3 0 20 4 0 20 5 0 20 6 0 20 7 0 20 8 0 20 9 0 20 如何将 0 20 转换为 0 20 我正在这样做 str
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 仅当某些值相等时,如何才能将一个文本文件中的值替换为另一个文本文件中的其他值?

    我有一个名为finalscores txt我想创建一个 python 脚本 它将打开它并从两个单独的列中读取值 这是我的finalscores txt file Atom nVa predppm avgppm stdev delta QPr
  • 更改QLineEdit的ClearButton图标

    我想在Windows 10 1909 64位 上的Python 3 8和PyQt5 5 15 0 上更改我的QLineEdit的ClearButton图标 稍后我想在Linux上运行代码 我尝试应用此处找到的代码 如何在 QLineEdit
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • NumPy 相当于 Keras 函数 utils.to_categorical

    我有一个使用 Keras 进行机器学习的 Python 脚本 我正在构建 X 和 Y 它们分别是特征和标签 标签的构建方式如下 def main depth 10 nclass 101 skip True output True video
  • 使用seaborn绘制简单线图

    我正在尝试使用seaborn python 绘制ROC曲线 对于 matplotlib 我只需使用该函数plot plt plot one minus specificity sensitivity bs where one minus s
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 基于值而不是类型的单次调度

    我在 Django 上构建 SPA 并且有一个庞大的功能 其中包含许多功能if用于检查我的对象字段的状态名称的语句 像这样 if self state new do some logic if self state archive do s
  • 仅允许正小数

    在我的 Django 模型中 我创建了一个如下所示的小数字段 price models DecimalField u Price decimal places 2 max digits 12 显然 价格为负或零是没有意义的 有没有办法将小数
  • 非法指令:MacOS High Sierra 上有 4 条指令

    我正在尝试在 pygame 3 6 中制作一个看起来像聊天的窗口 我刚刚将我的 MacBook 更新到版本 10 13 6 在我这样做之前它工作得很好 但在我收到消息之后 非法指令 4 Code import pygame from pyg
  • 高效创建抗锯齿圆形蒙版

    我正在尝试创建抗锯齿 加权而不是布尔 圆形掩模 以制作用于卷积的圆形内核 radius 3 no of pixels to be 1 on either side of the center pixel shall be decimal a
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • 如何通过点击复制 folium 地图上的标记位置?

    I am able to print the location of a given marker on the map using folium plugins MousePosition class GeoMap def update
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic

随机推荐