当前位置: 首页 > 知识库问答 >
问题:

Pygame在blitting期间返回锁定错误

羊舌高明
2023-03-14

我试图在pyplay中制作一个2D游戏,并有一个具有表面属性的相机类,每次相机更新时,其表面都会更新。所有图形都game.world表面,然后主相机拍摄一张照片,并将其显示在显示表面。然而,当使用其他相机时,我无法将其遮挡到世界表面并获得锁定错误。我已经尝试过了。解锁()。什么会导致这种情况?

import pygame
import pickle
class Tileset:
    def __init__(self, location):
        pass

class Tilemap:
    def __init__(self):
        pass

class Collisionmap(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

class Player(pygame.sprite.Sprite):
    def __init__(self, spritesheet):
        super().__init__()
        self.spritesheet = pygame.image.load(spritesheet)
        self.x = 0
        self.y = 0
    def draw(self, surface):
        surface.blit(self.spritesheet, (self.x, self.y))

class Mob(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

class Camera:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.width = 100
        self.height = 100
        self.surface = pygame.Surface((self.width, self.height))
    def moveToSprite(self, sprite):
        self.x = sprite.rect.centerx - WIDTH // 2
        self.y = sprite.rect.centery - HEIGHT // 2
    def update(self, world):
        self.surface = world.subsurface((self.x, self.y, self.width, self.height))

class Level:
    def __init__(self, terrarin, collision, mobs):
        self.terrain = terrain
        self.collision = collision
        self.mobs = mobs

class Game:
    def __init__(self):
        pygame.init()
        self.DISPLAYSURF = pygame.display.set_mode((0, 0))
        self.mainCamera = Camera()
        self.mainCamera.width = self.DISPLAYSURF.get_width()
        self.mainCamera.height = self.DISPLAYSURF.get_height()
        self.otherCameras = []
        self.worldSurface = pygame.Surface((10000, 10000))
        self.player = Player("marioSS.jpg")
        self.otherCameras.append(Camera())
        self.run()
    def run(self):
        while True:
            for event in pygame.event.get():
                pass
            self.earlyUpdate()
            self.update()
            self.lateUpdate()
            self.graphicsUpdate()
    def update(self):
        pass
    def earlyUpdate(self):
        pass
    def lateUpdate(self):
        pass
    def graphicsUpdate(self):
        for each in self.otherCameras:
            each.update(self.worldSurface)
        self.player.draw(self.worldSurface)
        self.otherCameras[0].surface.unlock()
        self.worldSurface.unlock()
        self.worldSurface.blit(self.otherCameras[0].surface, (100, 100)) ##Error here
        self.mainCamera.update(self.worldSurface)
        self.DISPLAYSURF.blit(self.mainCamera.surface, (0, 0))
        pygame.display.update()

x = Game()

共有1个答案

谈渊
2023-03-14

问题造就了世界。摄像机中的子表面()。update()

它不会将数据world复制到surface,但会分配对原始world的访问权限。后来你有了:camera。surface可访问world,并且blit可尝试从摄像机复制。曲面世界——所以最后它尝试从世界复制到世界。也许它能锁住它。

但是如果在摄像机中。update()您使用的是。复制()

self.surface = world.subsurface((self.x, self.y, self.width, self.height)).copy()

或者烧毁了它

self.surface.blit(world.subsurface((self.x, self.y, self.width, self.height)), (0,0))

然后它就起作用了。

DOC:地下

地下(Rect)-

返回与新父曲面共享其像素的新曲面。

 类似资料:
  • 我刚刚实现了基本的opengl渲染到我的pyplay应用程序中,认为硬件加速会使程序运行得更快。相反,它要慢得多。 看起来问题是绘图功能。 这是我的opengl绘图功能 我的分析器为draw函数提供了什么 我的分析器文本的其余部分:(1个月后到期) http://pastebin.com/ApfiCQzw 我的源代码 https://bitbucket.org/claysmithr/warbots

  • 我做了一点实验,发生了一些我认为没有预料到的事情。这个问题是基于递归和第7行注释的返回语句 我的问题是,在使用示例输入“1 9 11 5 6”的测试期间,如果我有返回语句。输出仅为“值1 9 11总计21”,但如果没有return语句,输出为“值1 9 11总计21,值1 9 5 6总计21”。我想知道是否有什么可以解释为什么,我认为return语句会简单地“加速”结束这个方法的递归实例,而不是简

  • 我有以下应该返回时间戳的函数。当使用以下斜杠以字符串格式输入日期时,此代码有效:“2019/3/4”,但在使用 怎么回事?

  • 问题内容: 我有一个包含表的MySQL数据库。 但是,我找不到在Java中将其作为Java中某种对象返回的方法。 我可以打电话给它,它会返回,但这并不好,因为没有办法比较字符串上的日期等。 我也可以打电话,但这根本不返回时间。 问题答案: 您需要使用Thomas的注释中建议的getTime()或getTimestamp()方法。举个例子… 说出要查询的表格,如下所示: 您可以这样做: 如果要使用J

  • 问题内容: 如何在MS Access中指定日期范围?以下查询正确吗?我必须加引号吗?还是我必须做类似的事情? 以下给我一个类型不匹配 问题答案: ms-access使用Jet引擎,该引擎使用#表示日期文字:

  • 问题内容: 代码: 输出: 我正在尝试将字符串转换为NSDate数据类型,但没有获得正确的值。我尝试了许多解决方案,但未返回正确的值。我需要yyyy-MM- dd格式(2016-04-02)与我的输入“ 2016-04-02”相同。如果有人可以帮上忙,那真是太好了。提前致谢 问题答案: 从字符串转换为NSDate时,如果未将时区设置为格式化程序,则将获得本地时区中日期的NSDate。我想您的时区是