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

pygame中的闪烁矩形

董翰墨
2023-03-14

我正在努力学习pyGame。我遇到了一个问题。我有一个矩形,可以用箭头按钮移动。然后我创建了另一个线程,它生成可以拾取的较小矩形。但是当我运行我的游戏时,生成的小矩形闪烁太多。我怎样才能让他们稳定?我想我不太明白这里的时间概念。有人能给我解释一下吗

我的代码:

import pygame
import random
import threading
import thread
import sys
import time

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
is_blue = True
entityList = []
x = 30
y = 30

clock = pygame.time.Clock()
class Entity():

     def __init__(self, x, y):
         self.x = x
         self.y = y

     def getX(self):
         return self.x

     def getY(self):
         return self.y

     def drawStuff(entityList):
     #   pygame.draw.rect(screen, (255, 100, 0), pygame.Rect(55, 45, 10, 10))
         for x in range (0, entityList.__len__()):
             pygame.draw.rect(screen, (255, 100, 0), pygame.Rect(entityList[x].getX(),     entityList[x].getY(), 10, 10))
         pygame.display.flip()
         clock.tick(60)


class EntityManager(threading.Thread):

     def __init__(self):
         threading.Thread.__init__(self)

     def run(self):
         while True:
             entityList = generateEntities()
             drawStuff(entityList)

     def endJob(self):
         thread.exit()
         time.sleep(2)


def detect_collision(x,y):
    if x > 340:
       x -= 1
    if y > 240:
       y -= 1
    if y < 0:
       y += 1
    if x < 0:
       x += 1
    return x,y

def generateEntities():
    itemlist = []
    for x in range (0,4):
        x = random.randint(1,339)
        y = random.randint(1,239)
        entity = Entity(x,y)
        itemlist.append(entity)
    return itemlist

entityList = generateEntities()
a = EntityManager()
a.setDaemon(True)
a.start()

while not done:

    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                    done = True
                    pygame.quit()
                    sys.exit()

            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                    is_blue = not is_blue

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_UP]:
        y -= 1
        x,y = detect_collision(x, y)
    if pressed[pygame.K_DOWN]:
        y += 1
        x,y = detect_collision(x, y)
    if pressed[pygame.K_LEFT]:
        x -= 1
        x,y = detect_collision(x, y)
    if pressed[pygame.K_RIGHT]:
        x += 1
        x,y = detect_collision(x, y)

    screen.fill((0, 0, 0))
    if is_blue: color = (0, 128, 255)
    else: color = (255, 100, 0)
    pygame.draw.rect(screen, color, pygame.Rect(x, y, 60, 60))
    pygame.display.flip()
    clock.tick(60)

共有2个答案

姜弘新
2023-03-14

好吧,我现在明白了。天哪,在这之后我觉得自己真是个白痴。但我原谅自己,我也在平行学习Python。我以前更多地用Java编写代码。

无论如何:问题是我的drawStuff函数在函数中绘制了一些东西,但当它离开这个函数时,它什么也没做。改变是在当地进行的。我通过使用全局关键字解决了这个问题。我在代码中做了一些更改,线程计算实体坐标,然后主循环进行更新。这让我想到了另一个想法,也许应该有一些游戏信息对象,它会一直更新,所有的矩形信息都会进入这个游戏信息对象。

无论如何,很快我也会编辑这篇博文,看看我做了什么

吴星汉
2023-03-14

clock.tick()实际上意味着FPS(每秒帧数);与其改变它,不如改变另一个变量。请观看本教程,它可能会帮助您理解FPS。

平滑度问题有时与对象的大小以及关键事件为True时移动对象的像素数有关。对此要小心;想象你有一个小盒子,你正试图移动它。如果你用大步移动它,它看起来“滞后”,但如果你用小步移动它,它可能看起来更平滑。希望你明白我的意思。

关于第二个问题,请查看此文档。

 类似资料:
  • 我试图用pyplay制作一个游戏,我几乎完成了,但我想让被画在墙上的盒子不闪烁,这些红色的盒子在整个游戏中闪烁,我不想让它们闪烁,最后,我在一个if条件下调用player碰撞函数,在这里每当我制作新的碰撞器时,我每次都要在if条件下添加函数,我想要的是碰撞器对象自动调用这个函数,而不需要我在if语句中为碰撞器的每个实例调用它对象。请指导我如何这样做。

  • 问题内容: 所以我运行代码,它就开始不正常了。我不熟悉pygame。 代码如下: 这张图片并不是我不能发布视频的那个,但它确实是我的代码的作用 问题答案: 问题是由多次调用 . 在应用程序循环结束时更新显示就足够了。 多次调用or原因 忽隐忽现。 删除对的所有呼叫从你的代码,但调用一次 在应用程序循环结束时: 如果在之后更新显示,将显示在短时间内填充了背景色。然后玩家被抽中 ()显示时,播放器位于

  • 这是因为在开发模式下,为了通过 Webpack 实现热加载,CSS代码是打包在 JavaScript 代码中,并动态打到页面中去,从而元素重绘引起了闪烁。 不用担心,在生产模式下,CSS代码会单独打包至独立的文件并置于head标签内,不会出现页面闪烁的现象。

  • 我在Lollipop上的共享元素转换中看到了奇怪的事情。共享元素在开始动画之前闪烁(请看视频https://www.youtube.com/watch?v=DCoyyC_S-9A) 我不知道为什么会这样。但是,当我添加

  • 减低闪烁    以Interlace(交错扫描)方式在电视机输出PSP™规格软件的影像时,设定是否要减低画面的闪烁。 关 不减低画面的闪烁。 开 减低画面的闪烁。

  • 我正在用pygame制作一个游戏,在制作这个游戏时,我在屏幕上使用了很多文本。但是当我在我的代码中达到这一点时,第一个写的文本不会闪烁,但是第二个会闪烁,我想改变这一点。而且,当我拿着钥匙时,当我只想让它写一次信时,这封信就会被一遍又一遍地快速地写下来。代码: 编辑:现在唯一的问题是闪烁的文字,因为我得到了一个解决方案