Функция pygame.Rect.colliderect () не выполняется - PullRequest
1 голос
/ 05 марта 2019

Я пытаюсь добавить сегмент к игроку в моем клоне змеи, когда сталкиваются food.rect и snake.rect. Однако код внутри функции не будет выполнен.

def add_segment(self,food):
    if self.rect.colliderect(food.rect):
        snake_segment = Snake(GREEN,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
        self.body.append(snake_segment)
        print('this code works!')

Вот остаток моего кода, если он вам нужен. Я боролся с этой проблемой в течение многих дней, поэтому любая помощь будет высоко ценится!

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

pygame.init()

WINDOW_HEIGHT = 500
WINDOW_WIDTH = 500

RECTANGLE_HEIGHT = 20
RECTANGLE_WIDTH = 20

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

clock = pygame.time.Clock()
SCREEN = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))
pygame.display.set_caption("Snake")

class Snake(object):
    def __init__(self, color, width, height):
        self.body = []
        self.image = pygame.Surface((width,height))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.speed = 20 
        self.direction = 'right'
        self.body = []
        self.living = True
        self.move = (0,0)

    def movement(self):
        self.rect.move_ip(self.move)
        self.rect.clamp_ip(SCREEN.get_rect())

    def blit(self):
        SCREEN.blit(self.image,self.rect)

    def update(self,food):
        self.add_segment(food)
        self.draw_snake()
        self.movement()
        print(self.rect.colliderect(food.rect))
        print(self.body)

    def add_segment(self,food):
        if self.rect.colliderect(food.rect):
            snake_segment = Snake(GREEN,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
            self.body.append(snake_segment)
            print('this code works!')

    def draw_snake(self):
        if len(self.body) == 0:
            self.blit()
        elif len(self.body) >= 1:
            for snake_segment in self.body:
                snake_segment.blit()

class Food(object):
    def __init__(self,color,width,height):
        self.image = pygame.Surface((width,height))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(20,500,20) 
        self.rect.y = random.randrange(20,500,20) 
        self.state = 'uneaten'

    def check_eaten(self,snake):
        if snake.rect.colliderect(self.rect):
            self.state = 'eaten'

    def blit(self):
        SCREEN.blit(self.image,self.rect)

    def update_state(self,snake):
        self.check_eaten(snake)
        if self.state == 'uneaten':
            self.blit()
        elif self.state == 'eaten':
            self.rect.x = random.randrange(0,500,20) 
            self.rect.y = random.randrange(0,500,20) 

            if self.rect.x == snake.rect.x or self.rect.x == snake.rect.y:
                self.rect.x = random.randrange(0,500,20) 
                self.rect.y = random.randrange(0,500,20)

            self.blit()
            self.state = 'uneaten'

    def update(self,snake):
        self.update_state(snake)
        print(self.state)

def event_loop(snake,food):
    while True:
        SCREEN.fill(BLACK)

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    snake.move = (snake.speed,0)
                    snake.direction = 'right'
                elif event.key == K_LEFT:
                    snake.move = (-snake.speed,0)
                    snake.direction = 'left'
                elif event.key == K_UP:
                    snake.move = (0,-snake.speed)
                    snake.direction = 'up'
                elif event.key == K_DOWN:
                    snake.move = (0,snake.speed)
                    snake.direction = 'down'

        food.update(snake)
        snake.update(food)

        pygame.display.update()
        clock.tick(5)

SNAKE = Snake(GREEN,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
FOOD = Food(RED,RECTANGLE_WIDTH,RECTANGLE_HEIGHT)
event_loop(SNAKE,FOOD)

1 Ответ

0 голосов
/ 05 марта 2019

Это все в порядке.

food.update(snake) проверяет, сталкивается ли еда с коктейлем, и ставит пищу в новое положение.
snake.update(food) проверяет, сталкивается ли змеяеда и добавляет сегмент к змее.

Таким образом, если food.update(snake) выполняется до snake.update(food), то змея никогда не будет есть пищу, потому что пища удалена раньше:

food.update(snake)
snake.update(food)

snake.update(food)
food.update(snake)

Змея никогда не находится в том положении, в котором она нарисована, потому что змея оттягивается self.draw_snake() до того, как ее перемещают self.movement().

Вы должны сделать это в следующем порядке:

  1. Переместить змею
  2. Проверить, есть ли змея на еде
  3. Нарисуйте змею
class Snake(object):

    # [...]

    def update(self,food):
        self.movement()
        self.add_segment(food)
        self.draw_snake()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...