pygame 中的闪烁矩形
Blinking rectangle in pygame
我正在努力学习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)
clock.tick()
其实就是FPS(每秒帧数)的意思;而不是改变它,改变另一个变量。
观看 this tutorial,它可能会帮助您了解 FPS。
关于平滑度的问题有时与对象的大小以及在关键事件 True
时移动对象的像素数有关。对此要小心;想象你有一个小盒子,你正试图移动它。如果你大步移动它,看起来 'laggy',但如果你小步移动它,它可能看起来更平滑。希望你明白我的意思。
第二个问题请勾选this documentation。
好的,我现在明白了。天哪,在这之后我觉得自己真是个白痴。但我原谅自己,我也在做 Python 的并行学习。我曾经在 Java 中编码。
无论如何:问题是我的 drawStuff 函数在函数中绘制了东西,但是当它离开这个函数时,它什么也没做。更改是在本地进行的。我通过使用 global 关键字解决了这个问题。我在我的代码中进行了更改,即线程计算实体坐标,然后主循环进行更新。这让我想到了另一个想法,也许应该有一些游戏信息对象一直更新,所有矩形信息都转到那个游戏信息对象。
无论如何,很快我也会编辑这个post代码,看看我做了什么
我正在努力学习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)
clock.tick()
其实就是FPS(每秒帧数)的意思;而不是改变它,改变另一个变量。
观看 this tutorial,它可能会帮助您了解 FPS。
关于平滑度的问题有时与对象的大小以及在关键事件 True
时移动对象的像素数有关。对此要小心;想象你有一个小盒子,你正试图移动它。如果你大步移动它,看起来 'laggy',但如果你小步移动它,它可能看起来更平滑。希望你明白我的意思。
第二个问题请勾选this documentation。
好的,我现在明白了。天哪,在这之后我觉得自己真是个白痴。但我原谅自己,我也在做 Python 的并行学习。我曾经在 Java 中编码。
无论如何:问题是我的 drawStuff 函数在函数中绘制了东西,但是当它离开这个函数时,它什么也没做。更改是在本地进行的。我通过使用 global 关键字解决了这个问题。我在我的代码中进行了更改,即线程计算实体坐标,然后主循环进行更新。这让我想到了另一个想法,也许应该有一些游戏信息对象一直更新,所有矩形信息都转到那个游戏信息对象。
无论如何,很快我也会编辑这个post代码,看看我做了什么