Python的pygame的使用循环绘制矩形(Python PyGame draw rectangl

2019-10-21 11:40发布

我是新来的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
标签: python pygame