2017-12-24 2 views
0

파이 게임 창에 100 개의 무작위 (크기 및 색상) 원을 그리는 프로그램을 작성 중입니다. 한 번에 하나씩 각 원을 그려야합니다. 웬일인지, 원은 맨 끝에 만 그려집니다. 누구든지이 이유를 알고 있습니까?파이 게임에서 다른 이미지 그리기

import pygame, random, util 

pygame.init() 

side = 600 
win = pygame.display.set_mode((side, side)) 
win.fill(util.white) 
pygame.display.update() 

for i in range(100): 
    radius = random.randrange(2, 15) 
    r = random.randrange(256) 
    g = random.randrange(256) 
    b = random.randrange(256) 
    x = random.randrange(0 + radius, side - radius) 
    y = random.randrange(0 + radius, side - radius) 

    pygame.draw.circle(win, (r, g, b), (x, y), radius) 
    pygame.display.update() 
    print(i) 


util.wait_for_quit() 
+0

"util.wait_for_quit()"은 무엇입니까? 'for event' 루프로 표준'while' 루프를 사용하는 편이 낫습니다. – furas

답변

0

당신은 아마도 조금 도면을 지연 time.sleep()를 사용할 수

for i in range(100): 
    radius = random.randrange(2, 15) 
    r = random.randrange(256) 
    g = random.randrange(256) 
    b = random.randrange(256) 
    x = random.randrange(0 + radius, side - radius) 
    y = random.randrange(0 + radius, side - radius) 

    pygame.draw.circle(win, (r, g, b), (x, y), radius) 
    pygame.display.update() 
    print(i) 
    time.sleep(0.001) 

또한 import module, moduleb 매우 좋은하지 않습니다, 당신은

import module 
import moduleb 

편집으로 변경할 수 있습니다 : 여기에 몇 가지입니다 "Util"이 무엇이든 필요없는 업데이트 된 코드이며 파이 게임과 더 잘 어울립니다

import pygame 
import random 
import time 

pygame.init() 

side = 600 
win = pygame.display.set_mode((side, side)) 
win.fill((255, 255, 255)) 
loop = True 
on_start = True 
while loop: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      loop = False 
    if on_start: 
     for i in range(100): 
      radius = random.randrange(2, 15) 
      r = random.randrange(256) 
      g = random.randrange(256) 
      b = random.randrange(256) 
      x = random.randrange(0 + radius, side - radius) 
      y = random.randrange(0 + radius, side - radius) 

      pygame.draw.circle(win, (r, g, b), (x, y), radius) 
      pygame.display.update() 
      time.sleep(0.01) 
      print(i) 
     on_start = False 

pygame.quit() 
+0

'sleep'은 PyGame에서 좋지 않습니다. – furas

+0

글쎄, 당신이 컨트롤/이벤트를 사용하려는 경우, 그렇지 않으면 그냥 완벽하게 괜찮아요 같은 코드와 함께. – SnivyDroid

+0

하지만 이벤트가'QUIT' 또는'KEYDOWN' 이벤트를 얻을 수 없습니다 - 특히 긴 딜레이로 그릴 필요가있는 경우. 이벤트를받지 못하면 일부 시스템이 프로그램을 죽일 수 있습니다. – furas

1

pygame.time.get_ticks() 안에 while 루프를 사용하여 요소를 그릴시기를 제어 할 수 있습니다. 이렇게하면 지연이 다른 여러 요소를 그릴 수 있으며 키를 사용하여 중지 할 수 있습니다. 같은 지연의 모든 그릴해야하는 경우

import pygame 
import random 

# --- constants --- (UPPER_CASE_NAMES) 

WHITE = (255, 255, 255) 
SIDE = 600 

# --- main --- 

# - init - 

pygame.init() 

win = pygame.display.set_mode((SIDE, SIDE)) 

win.fill(WHITE) 
pygame.display.update() 

# - objects - 

circles_number = 100 

next_circle = pygame.time.get_ticks() + 500 # 500ms = 0.5s 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      running = False 

    if circles_number > 0: 
     # get current time 
     current = pygame.time.get_ticks() 

     # check if it is time to draw next circle 
     if current >= next_circle:  

      radius = random.randrange(2, 15) 
      r = random.randrange(256) 
      g = random.randrange(256) 
      b = random.randrange(256) 
      x = random.randrange(0 + radius, SIDE - radius) 
      y = random.randrange(0 + radius, SIDE - radius) 

      pygame.draw.circle(win, (r, g, b), (x, y), radius) 
      pygame.display.update() 

      # time for next circle 
      next_circle = pygame.time.get_ticks() + 500 # 500ms = 0.5s 

      # counting down circles 
      circles_number -= 1      

    clock.tick(25) 

pygame.quit() 

당신은 프레임 사이의 시간을 제어 할 수 clock.tick(2)를 사용할 수 있습니다. 그러나 키도 동일한 지연으로 검사됩니다. 키가 너무 오래 지연되어 작동하기 때문에 딜레이가 너무 길면 문제가 될 수 있습니다.

import pygame 
import random 

# --- constants --- (UPPER_CASE_NAMES) 

WHITE = (255, 255, 255) 
SIDE = 600 

# --- main --- 

# - init - 

pygame.init() 

win = pygame.display.set_mode((SIDE, SIDE)) 

win.fill(WHITE) 
pygame.display.update() 

# - objects - 

circles_number = 100 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      running = False 

    if circles_number > 0: 

     radius = random.randrange(2, 15) 
     r = random.randrange(256) 
     g = random.randrange(256) 
     b = random.randrange(256) 
     x = random.randrange(0 + radius, SIDE - radius) 
     y = random.randrange(0 + radius, SIDE - radius) 

     pygame.draw.circle(win, (r, g, b), (x, y), radius) 
     pygame.display.update() 

     # counting down circles 
     circles_number -= 1      

    # 2 frames per seconds = 2 circles per second 
    clock.tick(2) 

pygame.quit() 

또한 이벤트를 사용하여 주기적으로 코드를 그릴 수 있습니다.

import pygame 
import random 

# --- constants --- (UPPER_CASE_NAMES) 

WHITE = (255, 255, 255) 
SIDE = 600 

DRAW_CIRCLE_EVENT = pygame.USEREVENT 

# --- main --- 

# - init - 

pygame.init() 

win = pygame.display.set_mode((SIDE, SIDE)) 

win.fill(WHITE) 
pygame.display.update() 

# - objects - 

circles_number = 10 

# run event periodically 
pygame.time.set_timer(DRAW_CIRCLE_EVENT, 500) # 500ms = 0.5s 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      running = False 
     if event.type == DRAW_CIRCLE_EVENT: 

      if circles_number > 0: 

       radius = random.randrange(2, 15) 
       r = random.randrange(256) 
       g = random.randrange(256) 
       b = random.randrange(256) 
       x = random.randrange(0 + radius, SIDE - radius) 
       y = random.randrange(0 + radius, SIDE - radius) 

       pygame.draw.circle(win, (r, g, b), (x, y), radius) 
       pygame.display.update() 

       # counting down circles 
       circles_number -= 1 
      else: 
       # disable events 
       pygame.time.set_timer(DRAW_CIRCLE_EVENT, 0) 

    clock.tick(25) 

pygame.quit() 
관련 문제