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

为什么Pygame中的精灵没有在Windows7中显示在屏幕上?

羊舌成周
2023-03-14

在过去一周左右的时间里,我一直在开发一款太空入侵者类型的游戏,它进展得非常顺利,但由于某种原因,当我在我的Windows电脑上运行游戏时(我更喜欢在它上面编写代码),大多数精灵都不会出现,或者只有当它们在屏幕上朝某个方向移动时才会出现。当我在Mac上运行完全相同的代码时,一切都会完美地闪烁和更新。这是pygame无法与Windows相处的已知问题吗?事实上,我的Mac电脑上的一切都正常工作,这让我觉得这不是我的代码的问题,但以防万一,这里是我的主要循环:

dirty = []
score_label = font.render("Score: " + str(score), 1, (255,215,0))
level_label = font.render("Level: " + str(level), 1, (255,215,0))
screen.blit(background,(10,10),(10,10,330,30))
screen.blit(score_label,(10,10))
screen.blit(level_label,(200,10))
dirty.append((10,10,330,30))

# New level
if isEmpty(enemies):
    dirty.append((400,300,150,30))
    for i in bullets:
        dirty.append(i.pos)
        screen.blit(background,(i.pos[0],i.pos[1]),i.pos)
        bullets.remove(i)
    if pauseCounter == 40:
        screen.blit(background,(400,300),(400,300,150,30))
        pauseCounter = 0 
        jump = 30
        level+=1    
        for x in range(1,6):
            for y in range(11):
                enemies[x-1].append(Sprites.Enemy(enemy_values[6-x],(60*y,40*x),6-x))
        for x in range(len(enemies)):
            for e in enemies[x]:
                dirty.append(e.pos)
    else:
        upLevelLabel = levelFont.render("Next Level!",1,(255,215,0))
        screen.blit(upLevelLabel,(400,300))
        pauseCounter += 1

# Player input
dirty.append(o.pos)
screen.blit(background,(o.pos[0],o.pos[1]),o.pos)
keys = pygame.key.get_pressed()
if keys[K_a] and o.pos[0]-10 >= 0:
    o.speed = -10
    o.move()
if keys[K_d] and o.pos[0] <= 907-o.pos[3]-10:
    o.speed = 10
    o.move()
dirty.append(o.pos)
screen.blit(o.image,o.pos)

# Add bullets
for event in pygame.event.get():
    if event.type == pygame.QUIT: sys.exit()
    if event.type == pygame.KEYDOWN:
        if event.key == K_SPACE:
            bullets.append(Sprites.Bullet(bullet,(o.pos[0]+28,o.pos[1])))

# Updates bunkers
for b in bunkers:
    screen.blit(b.image,b.pos)
    if b.health == 0:
        screen.blit(background,(b.pos[0],b.pos[1]),b.pos)
        dirty.append(b.pos)
        bunkers.remove(b)

# Check if bullets are offscreen/collide, move accordingly
for b in bullets:
    dirty.append(b.pos)
    if b.pos[1] < 0:
        screen.blit(background,(b.pos[0],b.pos[1]),b.pos)
        dirty.append(b.pos)
        bullets.remove(b) 
    if isEmpty(enemies) == False:
        for x in range(len(enemies)):
            if len(enemies[x]) > 0:
                temp = enemies[x][0]
                if b.pos[1] in range(temp.pos[1],temp.pos[1]+temp.pos[3]):
                    for e in enemies[x]:
                        if b.pos.colliderect(e.pos):
                            score += e.val*10
                            screen.blit(background,(b.pos[0],b.pos[1]),b.pos)
                            screen.blit(background,(e.pos[0],e.pos[1]),e.pos)
                            dirty.append(e.pos)
                            dirty.append(b.pos)
                            bullets.remove(b)
                            enemies[x].remove(e)
    for i in bunkers:
        if b.pos.colliderect(i.pos):
            screen.blit(background,(b.pos[0],b.pos[1]),b.pos)
            dirty.append(b.pos)
            i.health -= 1
            bullets.remove(b)
for b in bullets:
    dirty.append(b.pos)
    screen.blit(background,(b.pos[0],b.pos[1]),b.pos)
    b.move()
    screen.blit(b.image,b.pos)
    dirty.append(b.pos)

# Moves enemy at appropriate pace, drops bombs
if enemyMoves == jump:
    moveCounter += 1
    if moveCounter == 20:
        jump = jump/2
        moveCounter = 0
    enemyMoves = 0
    for x in range(len(enemies)):
        for e in enemies[x]:
            dirty.append(e.pos)
            screen.blit(background,(e.pos[0],e.pos[1]),e.pos)
            e.move()
            screen.blit(e.image,e.pos)
            dirty.append(e.pos)
else:
    for x in range(len(enemies)):
        for e in enemies[x]:
            screen.blit(e.image,e.pos)
    enemyMoves+=1

pygame.display.update(dirty)
clock.tick(30)
print clock.get_fps()

提前感谢!

共有2个答案

孟佑运
2023-03-14

感谢Furas,是部分更新导致了错误!

郭永安
2023-03-14

也许你应该试试:

dirty.append(Rect(x,y,width,height))

dirty.append(pygame.Rect(x,y,width,height))

请记住,您正在传递一个矩形列表到pygame.display.update(脏),所以尝试并坚持pyplay矩形

而不是:

dirty.append((x,y,width,height))
 类似资料:
  • 当我在基于pygame的游戏中使用精灵时,它们似乎不能正常工作——正如你在屏幕截图上看到的那样,它们的形状不正确,并且上部有一些奇怪的变形。 黑色方块顶部有变形;中间的精灵一定是箭头形状的东西。 加载图像时涉及的一段代码(从pygame的教程中复制粘贴): 我在MacOSX上的Python2.7.11和3.4.2上做了我的项目,发现了这个问题。但当我在Windows上的Python3.1上测试它时

  • 问题内容: 我是Python编程的新手,我最近开始使用PyGame模块。这是初始化显示屏的简单代码。我的问题是:目前,最大化按钮已禁用,我无法调整屏幕大小。如何启用它在全屏和后退之间切换?谢谢 问题答案: 要以原始分辨率全屏显示,请执行 要使窗口可调整大小,请在设置模式时添加参数。您可以多次设置屏幕表面的模式,但是您可能必须要做的是 您还应该在http://www.pygame.org/docs/

  • 这是我在这里要问的第一个问题,所以我很抱歉我在这里做错了什么。 我目前正试图在libgdx中开发我自己的第一款游戏。所以一开始我有4节课。 FlipX是一个从游戏扩展而来的类 我希望我能在这里向您展示一些代码,但让我先解释一下 在启动FlipX类代码时,我要在其中绘制SpriteBatch,将屏幕设置为StartMenu类。在那里,我可以单击从FlipX绘制到SpriteBatch的2个按钮 这些

  • 查看官方文档如下:表面对象是表示矩形2D图像的对象。Sprite类旨在作为游戏中不同类型对象的基类。 它们都具有image和rect属性。区别在于精灵可以分组?

  • 我正在用Python pygame制作一个游戏,并制作了一个移动的背景,一个作为玩家的跳跃精灵和生成障碍物。现在我正在研究玩家和障碍物之间的碰撞,并编写了一些代码,但最终出现了错误: 我不知道,为什么那个类不是精灵,也不知道如何把它变成精灵。我希望修复这个错误后,碰撞工程。 播放器图像1 图像 2 背景图片3

  • 我一直在尝试使用pygame来显示游戏场景,但它似乎已经停止了对我的工作:在pygame关闭之前,它只在我创建的任何屏幕上显示一个灰色框,然后屏幕上应该显示的内容在退出之前短暂闪烁。例如,下面的最小代码显示灰色屏幕5秒钟,然后快速闪烁黑色并退出: 这似乎是屏幕显示的问题,而不是pygame本身的问题,因为我可以使用pg.image制作曲面并将其保存到图像文件中。save(),它们在那里看起来很好。