Как я могу иметь несколько рисунков на экране одновременно без их мигания? - PullRequest
2 голосов
/ 20 февраля 2020

В настоящее время я пишу простую компьютерную игру для школьного курсового проекта и столкнулся с проблемой в Pygame. В моей игре игроку просто нужно стрелять по целям, которые летят по воздуху, почти в обратном космосе захватчиков. Моя текущая проблема заключается в том, что я не могу иметь две фигуры на арене одновременно, если одна из них не мерцает и не отстает. Ниже мой код, любая помощь приветствуется. Приветствия.

Кроме того, кто-нибудь знает, как я могу добавить задержку между каждым рисунком. Как я уже говорил выше, я нацеливаюсь на то, чтобы цели находились на достаточном расстоянии друг от друга без наложений, но я хочу, чтобы на экране было несколько объектов одновременно. Ура.

import pygame

#Setting window dimensions and caption (Module 1)

pygame.init()
window = pygame.display.set_mode((800, 575))
pygame.display.set_caption("TARGET PRACTICE")

#Colour variables (Module 1)

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (200, 0, 0)
GREEN = (0, 200, 0)
BLUE = (0, 0, 200)

#Target coordinates and dimensions (Module 3)

#target_x = 0
#target_y = 80
#target_w = 60
#target_h = 40
#target_v = 1

exec = True

class Target:
  def __init__(self, x, y, h, w, v):
    self.x = x
    self.y = y
    self.h = h
    self.w = w
    self.v = v

target_1 = Target(0, 80, 60, 40, 0.1)
target_2 = Target(0, 100, 60, 40, 0.1)
target_3 = Target(0, 50, 60, 40, 1)

clock = 0

while exec:
  pygame.time.delay(1)
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      exec = False

  #Target Movement (Module 4)

  window.fill(RED)

  #Background and target drawing (Module 2)

  target_1.x += target_1.v
  pygame.draw.rect(window, BLUE, (target_1.x, target_1.y, target_1.h, target_1.w))
  clock += 1

  if clock%2 == 0:
    target_2.x += target_2.v
    pygame.draw.rect(window, BLUE, (target_2.x, target_2.y, target_2.h, target_2.w))


  pygame.display.update()




pygame.quit()```

1 Ответ

1 голос
/ 20 февраля 2020

target_2 мигает, потому что он просто рисуется в каждом 2-м кадре. Измените положение target_2 в каждом втором кадре, но нарисуйте его в каждом кадре:

while exec:
    # [...]

    # update positions 
    target_1.x += target_1.v
    if clock%2 == 0:
        target_2.x += target_2.v
    clock += 1

    # clear window (fill in rED)
    window.fill(RED)

    # draw all the objects of the scene in every frame 
    pygame.draw.rect(window, BLUE, (target_1.x, target_1.y, target_1.h, target_1.w))
    pygame.draw.rect(window, BLUE, (target_2.x, target_2.y, target_2.h, target_2.w))   

    # update display
    pygame.display.update()

Обратите внимание, что сцена должна перерисовываться в каждом кадре. Сначала фон очищается заполненным window.fill(RED), затем должна быть нарисована вся сцена и, наконец, необходимо обновить отображение (pygame.display.update()).


Если вы хотите отложить target_2 , затем вы должны нарисовать и обновить позицию после того, как clock достигнет определенного предела:

clock = 0
target_2_threshold = 500

while exec:
    # [...]

    # update positions 
    clock += 1
    target_1.x += target_1.v
    if clock > target_2_threshold and clock % 2 == 0:
        target_2.x += target_2.v

    # clear window (fill in rED)
    window.fill(RED)

    # draw all the objects of the scene in every frame 
    pygame.draw.rect(window, BLUE, (target_1.x, target_1.y, target_1.h, target_1.w))
    if clock > target_2_threshold:
        pygame.draw.rect(window, BLUE, (target_2.x, target_2.y, target_2.h, target_2.w))   

    # update display
    pygame.display.update()
...