How can you make the previous line disappear in python?

泪湿孤枕 提交于 2020-05-24 03:41:06

问题


I'm making a constellation that starts from (0,0). The previous line has to disappear after a two second delay and when the left is clicked within the two second delay, white circles should appear. I don't know why my timer isn't working and I'm not sure how to make the line disappear. Also the circles don't appear. This is my code

from pygame import * 
import random
init()
size = width, height = 700, 700
screen = display.set_mode(size)
button = 0

BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0,0,255)
WHITE = (255,255,255)
colors = (RED,GREEN,BLUE)
time.set_timer(USEREVENT, 2000)
mx = 0
my = 0

def drawScene(screen, button):
 if button == 1:
  draw.circle(screen,RED,(mx,my), 5)
  draw.line(screen,RED,(mx,my),(lx,ly),2)
  draw.circle(screen,RED,(lx,ly), 5)
  display.flip()
 if button == 3:
  draw.line(screen,random.choice(colors),(mx,my),(lx,ly),2)
  draw.circle(screen,random.choice(colors),(lx,ly), 5)
  display.flip()


running = True
myClock = time.Clock()
start = time.get_ticks()
# Game Loop
while running:
 lx = mx
 ly = my 
 for evnt in event.get():             # checks all events that happen
  if evnt.type == QUIT:
   running = False
  if evnt.type == MOUSEBUTTONDOWN:
   mx,my = evnt.pos
   button = evnt.button
   cx,cy = mouse.get_pos()
   draw.circle(screen,WHITE,(cx,cy),5)
  if evnt.type == USEREVENT:
   my_event = event.Event(USEREVENT)
   time.set_timer(my_event , 2000)   
 drawScene(screen, button)

 myClock.tick(60)                     # waits long enough to have 60 fps



quit()

回答1:


I hope this is what you were wanting and the comments are clear.

from pygame import * 
import random
init()
size = width, height = 700, 700
screen = display.set_mode(size)

BLACK  = (0,       0,    0)
RED    = (255,     0,    0)
GREEN  = (0,     255,    0)
BLUE   = (0,       0,  255)
WHITE  = (255,   255,  255)
colors = (RED, GREEN, BLUE)
time.set_timer(USEREVENT, 2000)
mx = 0
my = 0

def drawScene(screen, button, prev_point, new_point):
  if button == 1:
    draw.circle(screen, RED,   prev_point, 5)
    draw.circle(screen, WHITE, new_point,  5)
    draw.line  (screen, RED,   prev_point, new_point, 2)
    display.flip()
  if button == 3:
    draw.line  (screen, random.choice(colors), prev_point, new_point,2)
    draw.circle(screen, random.choice(colors), new_point, 5)
    display.flip()


running = True
myClock = time.Clock()
prev_render = time.get_ticks() #time in ticks that last render occured
prev_point = (mx, my) #where previous line ended


#function for when to re draw the scene
#ternary if. if override == True, then return true. Else return if time since last update > 2secs
rerender = lambda time_since_update, override: (time_since_update>2000, True)[override]

# Game Loop
while running:
  override = False
  for evnt in event.get():             # checks all events that happen
    if evnt.type == QUIT:
      running = False

    if evnt.type == MOUSEBUTTONDOWN:
      override = True #force window to rerender
      new_point = evnt.pos #(mx, my)
      button = evnt.button

    #rerender window only if necessary. (personal preference)
    updated_at = time.get_ticks()
    dt = updated_at-prev_render #time difference
    if(rerender(dt, override)):
      screen.fill(BLACK)
      drawScene(screen, button, prev_point, new_point)
      prev_point = new_point
      prev_render = updated_at

    display.update()
    myClock.tick(60)                     # waits long enough to have 60 fps



quit()



回答2:


This is not a complete solution, but I'll give you a general idea how how to start

Create a list of times and a list of lines:

lines = []

Get the current time in the main application loop:

current_time = pygame.time.get_ticks()

When the mouse is clicked then compute the time when the line has to disappear (current_time + 2000) and compute a random color.
Add a Dictionary with the start point, the end point, the time when the line has to disappear and the color to the list of lines.
If the list of lines is empty, then the start point of the line is (0, 0) else the start point is the end point of the last line in the list:

if event.type == pygame.MOUSEBUTTONDOWN:
    disappear_time = current_time + 2000
    line_color = random.choice(colors)
    prev_pt = (0, 0) if len(lines) == 0 else lines[-1]['end'] 
    lines.append({'start': prev_pt, 'end': event.pos, 'time': disappear_time, 'color': line_color})

When the current time exceeds the time which is stored in time, then remove a point and a time form the lists of lines:

if len(times) > 0 and current_time > times[0]:
    del lines[0]

Draw the lines by and circles in a loop:

screen.fill(BLACK)
for li in lines:
    pygame.draw.line(screen, li['color'], li['start'], li['end'], 2)
    pygame.draw.circle(screen, li['color'], li['start'], 5)
    pygame.draw.circle(screen, li['color'], li['end'], 5)

See the example:

import pygame
import random

pygame.init()
size = width, height = 700, 700
screen = pygame.display.set_mode(size)

BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0,0,255)
WHITE = (255,255,255)
colors = (RED,GREEN,BLUE)
lines = []

running = True
myClock = pygame.time.Clock()

while running:
    current_time = pygame.time.get_ticks()

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            disappear_time = current_time + 2000
            line_color = random.choice(colors)
            prev_pt = (0, 0) if len(lines) == 0 else lines[-1]['end'] 
            lines.append({'start': prev_pt, 'end': event.pos, 'time': disappear_time, 'color': line_color})

    if len(lines) > 0 and current_time > lines[0]['time']:
        del lines[0]

    screen.fill(BLACK)
    for li in lines:
        pygame.draw.line(screen, li['color'], li['start'], li['end'], 2)
        pygame.draw.circle(screen, li['color'], li['start'], 5)
        pygame.draw.circle(screen, li['color'], li['end'], 5)
    pygame.display.flip()
    myClock.tick(60)

quit()


来源:https://stackoverflow.com/questions/61682742/how-can-you-make-the-previous-line-disappear-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!