我是新来的pygame的,我现在用的书开始游戏开发Python和pygame的学习。 还有就是作者所说的脚本将以此为pygame的屏幕十项随意放置,随意的彩色矩形的例子(列表4-9)。 这里是一本书的代码:
import pygame
from pygame.locals import *
from sys import exit
from random import *
pygame.init()
screen = pygame.display.set_mode((640, 480), 0,32)
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.lock()
for count in range(10):
random_color = (randint(0,255), randint(0,255), randint(0,255))
random_pos = (randint(0,639), randint(0,479))
random_size = (639-randint(random_pos[0], 639), 479-randint(random_pos[1],479))
pygame.draw.rect(screen, random_color, Rect(random_pos, random_size))
screen.unlock()
pygame.display.update()
我这样做的时候会发生什么(而这正是我希望在逻辑上发生)是它吸引无限多的矩形。 它只是让for循环做,因为while循环总是如此。 我在网上搜索关于这个,我试图四处移动显示更新,但这些事情没有工作。 这是推动我疯了!
谢谢!
Answer 1:
看起来你已经知道它为什么用矩形绘制无限。
我猜你想画随机大小,POS和颜色一次性10米随机的矩形。
然后,你可以这样做:
import pygame
from pygame.locals import *
from sys import exit
from random import *
pygame.init()
screen = pygame.display.set_mode((640, 480), 0,32)
class Rectangle:
def __init__(self, pos, color, size):
self.pos = pos
self.color = color
self.size = size
def draw(self):
pygame.draw.rect(screen, self.color, Rect(self.pos, self.size))
rectangles = []
for count in range(10):
random_color = (randint(0,255), randint(0,255), randint(0,255))
random_pos = (randint(0,639), randint(0,479))
random_size = (639-randint(random_pos[0], 639), 479-randint(random_pos[1],479))
rectangles.append(Rectangle(random_pos, random_color, random_size))
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.lock()
for rectangle in rectangles:
rectangle.draw()
screen.unlock()
pygame.display.update()
Answer 2:
该代码不运行无限。 然而,内环确实造成10个矩形。 因此从技术上讲脚本就得出10随意放置,随意的彩色矩形。 它只是做的次数,无限量。
注:这是绘制10随机放置,随机的彩色矩形的部分。
for count in range(10):
random_color = (randint(0,255), randint(0,255), randint(0,255))
random_pos = (randint(0,639), randint(0,479))
random_size = (639-randint(random_pos[0], 639), 479-randint(random_pos[1],479))
pygame.draw.rect(screen, random_color, Rect(random_pos, random_size))
Answer 3:
它会吸引许多长方形,它的无尽yes.It不拉10次,因为没有争论说,除了突破-sys×[出口while循环。 所以,你必须定义一个变量。
正常情况下应该有一个if语句在事件声明,这将改变,同时为False的布尔值,它会停止循环。
你可以简单地改变你的代码:
import pygame
from pygame.locals import *
from sys import exit
from random import *
pygame.init()
screen = pygame.display.set_mode((640, 480), 0,32)
count=0 #new variable for stop the loop
while count<10: #new limit
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.lock()
random_color = (randint(0,255), randint(0,255), randint(0,255))
random_pos = (randint(0,639), randint(0,479))
random_size = (639-randint(random_pos[0], 639), 479-randint(random_pos[1],479))
pygame.draw.rect(screen, random_color, Rect(random_pos, random_size))
count+=1 #variable updating after drawing each rectangle
screen.unlock()
pygame.display.update()
它也许在本书中,我不知道一个misstyping,但这个循环是无限的,所以你可以把它改成这个:)
Answer 4:
是的,这是一个写得不好的例子,但它不是“破”。 大家迄今已忽略了这一点:
for event in pygame.event.get():
if event.type == QUIT:
exit()
pygame的包括事件的处理概念。 这一线得到所有你的游戏可以访问活动,并期待在他们每个人。 如果它们中的一个是一个“QUIT”事件,然后它调用exit()
更通常被称为sys.exit(0)
)直接,立即结束该应用程序。
当您退出应用程序,如通过单击红色的X有可能其他的方式来结束,也将产生此事件的应用程序产生“跳槽”式的事件,但我不知道它们是什么。 也有办法来结束,不会产生此事件的应用程序。 所以,是的,如果你从来没有退出应用程序,它将运行永远十岁上下。
一个更好的方式来写这个功能如下:
done = False
while not done:
for event in pygame.event.get():
if event.type == QUIT: # or other types of events
done = True
//do other game logic and drawing stuff after this
pygame.display.update()
这可以确保环路一致地执行,并且该出口点总是在同一个地方:在循环的顶部。 如果只有一个地方退出循环,那么你可以更轻松地知道如何代码的多少越来越运行(这一切)。 它也可以让你有决定何时以及是否结束循环的一些更复杂的方式。
然而,即使这将是一个非常混乱的“榜样”,因为(就像我和@ user3679917说明) 似乎做的东西比描述的不同。 现在看来似乎只是随意绘制矩形,直到永远。 让我们来看看,如果我们可以把它更可预测...
//pre-roll the random numbers before the while loop
random_attributes = []
for count in range(10):
random_color = (randint(0,255), randint(0,255), randint(0,255))
random_pos = (randint(0,639), randint(0,479))
random_size = (639-randint(random_pos[0], 639), 479-randint(random_pos[1],479))
random_attributes.append(random_color, random_pos, random_size)
//then when you draw, just draw what you already rolled each time, without rolling new stats
done = False
while not done:
for event in pygame.event.get():
if event.type == QUIT: # or other types of events
done = True
//do other game logic and drawing stuff after this
for color, position, size in random_attributes:
pygame.draw.rect(screen, color, Rect(position, size))
pygame.display.update()
这也会得出同样的事情无限,直到您关闭应用程序。 顺便说一句,这也是什么(几乎)所有的视觉应用程序做所有的时间,即每一次绘制的一切。 这并不是因为如果你能在屏幕上绘制一次和它停留。 每当屏幕绘制时,屏幕会询问大家“好球员,现在正在发生的事情在屏幕上,”除非你的应用程序说“画这种东西”,那么它不会拿得出,即使它是最后绘制时间。
希望这可以帮助。
文章来源: Python PyGame draw rectangles using for loop