Положение прямоугольника Pygame не обновляется - PullRequest
1 голос
/ 14 апреля 2020

Я пишу простую игру со змеями, используя библиотеку pygame. Сейчас я пишу функцию checkPosition (). Он использует метод contains () из pygame. Проблема в том, что он принимает координаты от начала l oop и не обновляется. Как я могу сбросить эти переменные или сделать для обновления l oop? Весь код здесь:

import pygame
import random
pygame.init()

screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption("Snake Game using Pygame")

#colors (RGB code)
blue = (3, 119, 252)
yellow = [251, 255, 36]
gray = [48, 48, 47]

# Variables for control
# Speed of movement
vel = 10 
# Snake width and height
width = 35
height = 35
#Snake spawn position
x = 25
y = 25

clock = pygame.time.Clock()

# Random coordinates for spawning snake "snack"
randomSnackX = random.randrange(0, 500, 20)
randomSnackY = random.randrange(0, 500, 20)

# Snack width and height - thickness
snackThickness = 10

# Variable for initial game loop
run = True

# Draw snack and snake
def drawInitialElements():
    # Draw raadom snak position from variables
    snack = pygame.draw.rect(screen, (255, 255, 255), [randomSnackX,randomSnackY,snackThickness,snackThickness])

    #Draw snake
    snake = pygame.draw.rect(screen, (255, 255, 255), (x, y, width, height))

    return snake, snack

snake, snack = drawInitialElements()

def checkPosition():
    if (snake.contains(snack)) == True:
        print("Eated snack")

#Initial game loop
while run:
    pygame.time.delay(100)
    screen.fill((0, 0, 0))

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

    #Controls
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT]:
        x += vel

    if keys[pygame.K_LEFT]:
        x -= vel

    if keys[pygame.K_UP]:
        y -= vel

    if keys[pygame.K_DOWN]:
        y += vel

    drawInitialElements()
    checkPosition()
    pygame.display.update()

pygame.quit()

Спасибо за помощь, Том.

1 Ответ

1 голос
/ 14 апреля 2020

Чтобы проверить, сталкиваются ли pygame.Rect объекты, вы должны использовать colliderect:

def checkPosition():
    if snake.colliderect(snack):
        print("Eated snack")

drawInitialElements возвращает кортеж, содержащий прямоугольник змеи и закуски. Присвойте возвращаемое значение переменным snake и snack в глобальном пространстве имен:

while run:
    # [...]

    snake, snack = drawInitialElements()

    # [...]

Полный код приложения:

import pygame
import random
pygame.init()

screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption("Snake Game using Pygame")

#colors (RGB code)
blue = (3, 119, 252)
yellow = [251, 255, 36]
gray = [48, 48, 47]

# Variables for control
# Speed of movement
vel = 10 
# Snake width and height
width = 35
height = 35
#Snake spawn position
x = 25
y = 25

clock = pygame.time.Clock()

# Random coordinates for spawning snake "snack"
randomSnackX = random.randrange(0, 500, 20)
randomSnackY = random.randrange(0, 500, 20)

# Snack width and height - thickness
snackThickness = 10

# Variable for initial game loop
run = True

# Draw snack and snake
def drawInitialElements():
    # Draw raadom snak position from variables
    snack = pygame.draw.rect(screen, (255, 255, 255), [randomSnackX,randomSnackY,snackThickness,snackThickness])

    #Draw snake
    snake = pygame.draw.rect(screen, (255, 255, 255), (x, y, width, height))

    return snake, snack

snake, snack = drawInitialElements()

def checkPosition():
    if (snake.contains(snack)) == True:
        print("Eated snack")

#Initial game loop
while run:
    pygame.time.delay(100)
    screen.fill((0, 0, 0))

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

    #Controls
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT]:
        x += vel

    if keys[pygame.K_LEFT]:
        x -= vel

    if keys[pygame.K_UP]:
        y -= vel

    if keys[pygame.K_DOWN]:
        y += vel

    snake, snack = drawInitialElements()
    checkPosition()
    pygame.display.update()

pygame.quit()
...