коллизии pygame и мозаичных карт

Я пытаюсь заставить спрайт игрока не падать на верхнюю часть прямоугольника платформы. Я много чего перепробовал за последние два дня, и я потерялся больше, чем когда-либо. Большое спасибо. Я использую tmx для загрузки мозаичной карты. Я добавляю объект Platform при каждом обнаружении имени, а затем добавляю его в список. Я просматриваю список, чтобы проверить столкновение, используя sprite.collide (self.player, plat). Это не работает.

def update(self):
    for plat in self.platList:
        self.hits = pg.sprite.spritecollide(self.player,self.platList,False)
        if self.hits:
            if self.player.pos.y > self.hits[0].y:
                self.player.pos.y = self.hits[0].rect.top

 for tile in self.map.tmxdata.objects:
        if tile.name == "player":
            self.player = Player(self,tile.x,tile.y)
        if tile.name == "Platform":
            self.platList.append(Platform(self, tile.x, tile.y,tile.width,tile.height))
class Platform(pg.sprite.Sprite):
def __init__(self,game,x,y,width,height):
    self.game = game
    pg.sprite.Sprite.__init__(self)
    self.rect = pg.Rect(x,y,width,height)
    self.y = y
    self.rect.x = x
    self.rect.y = y

person CalmlyCoding    schedule 29.01.2018    source источник
comment
В будущем не забудьте правильно форматировать код. На данный момент ваш код имеет неправильный отступ.   -  person Micheal O'Dwyer    schedule 29.01.2018
comment
Покажите нам минимальный, полный и проверяемый пример и опишите свои цели и проблемы как можно яснее, иначе мы не сможем вам дать окончательный ответ, и вы получите только предположения и, возможно, вводящие в заблуждение ответы.   -  person skrx    schedule 30.01.2018


Ответы (1)


Думаю, ваша проблема в том, что вы не используете атрибут игрока rect для определения позиции игрока. Вы используете спрайты pygame, поэтому используйте их так, как задумано.

Все функции pygame, которые работают со спрайтами (например, spritecollide), будут использовать атрибут rect, но в вашем коде класс игрока имеет дополнительный атрибут pos, а Platform также имеет атрибут y.

Удалите их и используйте rect исключительно для хранения размера и положения ваших спрайтов.

Если вы хотите переместить спрайт, просто измените его rect (например, на move_ip и т. Д.) Или его атрибуты.

person sloth    schedule 29.01.2018