Обнаружение столкновения прямоугольника пигамей не работает - PullRequest
0 голосов
/ 24 апреля 2019

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

Я попытался добавить некоторые из типичных типов детекторов столкновений ниже, но все они имеют обратные стороны

class Platform:
    def __init__(self, x, y, background):
        self.xpos = x
        self.ypos = y
        self.picture = background
        self.picture = pygame.transform.scale(self.picture, (500, 100))
        self.rect = self.picture.get_rect()

    def draw(self):
        screen.blit(self.picture, (self.xpos, self.ypos))

class Player:
    def __init__(self, x, y, pic_one, pic_two, pic_three, pic_four):
        self.xpos = x
        self.ypos = y
        self.speed_y = 0
        self.speed_x = 0
        self.picture = pic_one
        self.picture_one = pic_one
        self.picture_two = pic_two
        self.picture_three = pic_three
        self.picture_four = pic_four
        self.on_ground = True
        self.picture = pygame.transform.scale(self.picture, (100, 100))
        self.rect = self.picture.get_rect()

    def update(self):
        self.xpos += self.speed_x
        self.ypos += self.speed_y

        GRAVITY = 0.9

        self.speed_y += GRAVITY  # Accelerate downwards.
        self.xpos += self.speed_x 
        self.ypos += self.speed_y


        if self.ypos >= 620:
            self.ypos = 620
            self.speed_y = 0
            self.on_ground = True


        if self.on_ground == True:
            self.speed_y = 0


    def jump(self):
        if self.on_ground:
            self.on_ground = False
            self.speed_y = -20#Makes you move upwards

    def draw(self):
        screen.blit(self.picture, (self.xpos, self.ypos))

    def is_collided_with(self, sprite):
        return self.rect.colliderect(sprite.rect)

player_one = Player(30, 600, player_one_first_pic)
wood_platform = Platform(400, 400, platform_pic)
while True:
    [...]

это типичный тип столкновенияЯ бы попробовал и использовал, но оператор if, кажется, никогда не встречается

if player_one.rect.bottom == wood_platform.rect.top:
    player_one.on_ground = True

, другой, на котором я пробовал, который обнаруживает, сталкиваются ли прямоугольники, и оператор if равен True, даже если прямоугольники не сталкиваются

if player_one.is_collided_with(wood_platform):
     player_one.on_ground = True 

этот метод мне неудобен, потому что его недостаточно

if player_one.ypos == 600:
    player_one.on_ground = True

Фактические результаты для метода, который я использовал, заключались в том, что игрок вообще не сталкивался с деревянной платформой

(Вот диаграмма, если вам нужно немного больше понимания :) player_platform Проверяет наличие столкновений, но не работает

if player_one.rect.y == wood_platform.rect.y:
        print(True)
        player_one.on_ground = True
        on_platform = True

    else:
        on_platform = False

меняется после каждого обновления

self.rect.x = self.xpos
self.rect.y = self.ypos

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Что касается меня, проблема в том, что вы используете self.xpos, self.ypos для перемещения объекта, и вы не меняете значения в self.rect (self.rect.x, self.rect.y), но вы используете self.rect для проверки столкновения ,

Вы должны установить

self.rect.x = self.xpos
self.rect.y = self.ypos 

перед проверкой столкновения.

И вы должны сделать это для всех движущихся объектов. Может быть, лучше делать это после каждого хода.


Вы можете использовать только self.rect.x, self.rect.y (вместо self.xpos, self.ypos), но он может хранить только целые значения. Вы используете значение с плавающей точкой в ​​гравитации, и self.rect.x, self.rect.y округляют позицию вниз и дают не очень плавную анимацию.

Но объекты, которые не используют гравитацию или скорость плавания, могут использовать только self.rect для сохранения позиции.

0 голосов
/ 25 апреля 2019

У меня часто бывает такая же проблема в моей работе.Проверка, равны ли числа, может не сработать при использовании чисел с плавающей запятой.Вы можете попытаться изменить это

if player_one.rect.bottom == wood_platform.rect.top:
    player_one.on_ground = True

на это:

margin = 0.001 # Whatever amount you feel comfy with.
if wood_platform.rect.top*(1-margin) <= player_one.rect.bottom <= wood_platform.rect.top*(1+margin):
    player_one.on_ground = True
...