Следующая строка изображения, или как удалить изображение без повторного заполнения экрана

#python #pygame

#python #pygame

Вопрос:

Итак, я пытаюсь переделать TRON, аркадную игру, похожую на змею. У меня проблема с моими изображениями lightcycle. Итак, в TRON после того, как линия нарисована, она остается там, поэтому при попытке поместить изображение, которое нужно переместить перед ним, изображение перетаскивается, потому что я не могу заполнить экран, иначе созданная строка исчезнет.

Мое решение для этого состояло в том, чтобы сделать строку почти такой же толстой, как цикл, чтобы строка покрывала изображение цикла.

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

вот мой код

 from pygame.locals import *
import time
import pygame, sys
from pygame.locals import *
from random import randint

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 400))
pygame.display.set_caption('TRON')
fpsClock = pygame.time.Clock()
FPS = 20

BLACK = (0, 0, 0)
GRID = (0, 1 ,40)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

WHITE = (0, 1, 70)

m = 3

X = 0
x = 10
y = 400/2
Y = 400/2
direction = 'right'
direction2 = 'right'


b= 0
player1B = 'noBoost'

cycle1 = pygame.image.load('./images/lightCycle1.png')
cycle2 = pygame.image.load('./images/lightCycle2.png')
cycle3 = pygame.image.load('./images/lightCycle3.png')
cycle4 = pygame.image.load('./images/lightCycle4.png')

counter = 0
counter2 = 0


def drawGrid():
   blockSize = 33
   for x in range(0, 400, blockSize):
       for y in range(0, 400, blockSize):
           rect = pygame.Rect(x, y, blockSize, blockSize)
           pygame.draw.rect(DISPLAYSURF, WHITE, rect, 1)
           
DISPLAYSURF.fill(GRID)
drawGrid()
while True:
   pygame.draw.rect(DISPLAYSURF, BLUE, (X, Y, 3, 3))


   if direction == 'right':
           X  = m
   if direction2 == 'right':
       counter2  = 1
       if counter2 == 10:
           x = X
           counter2 -= 1
           previousDirection = direction                               
           cycle = pygame.transform.scale(cycle1, (16, 10))
           DISPLAYSURF.blit(cycle, (x, y-4))


               
   if direction == 'left':
           X -= m
   if direction2 == 'left':
       counter2  = 1
       if counter2 == 5:
           x = X
           counter2 -= 1
           previousDirection = direction
           cycle = pygame.transform.scale(cycle4, (16, 10))
           DISPLAYSURF.blit(cycle, (x-13, y-4))

                   

   if direction == 'down':
           Y  = m
   if direction2 == 'down':
       counter2  = 1
       if counter2 == 5:
           y = Y
           counter2 -= 1
           previousDirection = direction
           cycle = pygame.transform.scale(cycle3, (10, 16))
           DISPLAYSURF.blit(cycle, (x-4, y))


               
   if direction == 'up':
           Y -= m      
   if direction2 == 'up':
       counter2  = 1
       if counter2 == 5:
           previousDirection = direction
           counter2 -= 1
           y = Y
           cycle = pygame.transform.scale(cycle2, (10, 16))
           DISPLAYSURF.blit(cycle, (x-4, y-13))



           
   if player1B == 'boost':
       b  = 1
       m = 9
  

   for event in pygame.event.get():
       if event.type == QUIT:
           pygame.quit()
           sys.exit()
       elif event.type == KEYDOWN:
           if (event.key == K_LEFT ):
               direction = 'left'
               direction2 = 'left'
               counter = 0
               counter2 = 0
           elif (event.key == K_RIGHT ):
               direction = 'right'
               direction2 = 'right'
               counter = 0
               counter2 = 0
           elif (event.key == K_UP ):
               direction = 'up'
               direction2 = 'up'
               counter = 0
               counter2 = 0
           elif (event.key == K_DOWN ):
               direction2 = 'down'
               counter = 0
               counter2 = 0
               time.sleep(1)
               direction = 'down'
               
               
           elif event.key == pygame.K_RSHIFT:
               player1 = 'boost'
       elif event.type == KEYUP:
           if event.key == pygame.K_RSHIFT:
               player1B = 'noBoost'
               m = 3

   pygame.display.update()
   fpsClock.tick(FPS)
 

Комментарии:

1. сначала вам нужно будет заполнить экран, но вы можете сохранить координаты и отобразить строку с помощью координат

2. Я не знаю, как использовать координаты, не могли бы вы показать / объяснить, как это сделать? как сохранить строку, даже если я снова заполняю экран?

3. координаты — это сокращение от координат, в основном, когда вы рисуете линию, вы используете некоторую форму координат, чтобы сообщить программе, где рисовать линию, поэтому вы хотите также добавить эти координаты в список и нарисовать линию, используя все добавленные координаты в списке

4. Это код, который я добавил, пустые списки находятся вне цикла while, а циклы for находятся в цикле while, но, похоже, мне просто не хватает 1 маленькой детали, которую я совершенно не понимаю с этими координатами, есть идеи о том, что это такое?? coordsList1 = [] coordsList2 = [] для i в coordsList1: pygame.draw.rect(DISPLAYSURF, БЕЛЫЙ, (i, Y, 3, 3)) для j в coordsList2: pygame.draw.rect(DISPLAYSURF, БЕЛЫЙ, (X, j, 3, 3))

5. что? просто добавьте, куда перемещается игрок, и нарисуйте линию на основе этого списка с помощью координат (обязательно нарисуйте линию, если в списке есть как минимум два элемента)

Ответ №1:

Вот простой пример того, как это может работать:

 import pygame


pygame.init()
screen = pygame.display.set_mode((900, 600))

clock = pygame.time.Clock()

player_x = 100
player_y = 100

line_coords = []

run = True
while run:
    clock.tick(60)

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 0, 0), (player_x - 10, player_y - 10, 20, 20))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_UP]:
        player_y -= 5
    elif keys[pygame.K_DOWN]:
        player_y  = 5
    elif keys[pygame.K_LEFT]:
        player_x -= 5
    elif keys[pygame.K_RIGHT]:
        player_x  = 5

    line_coords.append((player_x, player_y))
    if len(line_coords) > 1:
        pygame.draw.lines(screen, (255, 255, 255), False, line_coords, width=3)

    pygame.display.update()

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

pygame.quit()
 

Очевидно, что необходимо внести некоторые изменения, например, не добавлять в список, пока не нажаты клавиши (в противном случае, если стоять на одном месте, это добавит кучу координат) или, например, определить координаты углов, чтобы остальные можно было удалить, оставив только углы, и, возможно, другие вещи тоже, но этоидея