Я делаю платформер. Я пробовал все, даже округлял позицию, прежде чем помещать ее в прямоугольник. Я не могу найти ничего, что могло бы решить эту проблему. Игра представляет собой пиксельную графику (масштабируется с учетом соотношения сторон, поэтому все должно быть медленным). Игрок всегда перекрывается с землей. Гравитация всегда будет толкать игрока вниз. Нигде не могу найти решение.
class Player(Sprite):
def __init__(self, pos=(10, -10), config=None):
super().__init__()
self.pos = pg.math.Vector2(self.rect.center)
self.vel = pg.math.Vector2(0, 0)
self.speed = 3
self.max_speed = 15
self.gravity = 1
self.jump_strength = -3
self.is_jumping = False
self.idle_timer = 0
self.colls = {"left": False, "right": False, "up": False, "down": False}
def update(self, dt):
self.rect.size = self.image.get_size()
self.rect.center = self.pos
if not self.colls["down"]:
self.vel.y += self.gravity * dt
else:
self.vel.y = 0
if self.keys["left"]:
self.vel.x = -self.speed
elif self.keys["right"]:
self.vel.x = self.speed
else:
self.vel.x = 0
if self.colls["down"]:
if abs(self.vel.x) > 0:
self.state = "run"
else:
self.state = "idle"
elif self.is_jumping:
self.state = "jump"
self.colls = {key: False for key in self.colls}
def handle_collisions(self, tiles):
self.pos.x += self.vel.x
self.rect.centerx = self.pos.x
for tile in tiles:
if self.rect.colliderect(tile.rect) and tile.type in TOUCHABLES:
if self.vel.x > 0:
self.rect.right = tile.rect.left
self.colls["right"] = True
elif self.vel.x < 0:
self.rect.left = tile.rect.right
self.colls["left"] = True
self.pos.x = self.rect.centerx
self.pos.y += self.vel.y
self.rect.centery = int(self.pos.y)
for tile in tiles:
if self.rect.colliderect(tile.rect) and tile.type in TOUCHABLES:
if self.vel.y > 0:
self.rect.bottom = tile.rect.top
self.colls["down"] = True
self.is_jumping = False
self.vel.y = 0
elif self.vel.y < 0:
self.rect.top = tile.rect.bottom
self.colls["up"] = True
self.vel.y = 0
self.pos.y = self.rect.centery
if self.colls["left"] or self.colls["right"]:
self.vel.x = 0
if self.colls["up"] or self.colls["down"]:
self.vel.y = 0
Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-pygame
Обработка столкновений в pygame ⇐ Python
Программы на Python
1735500278
Anonymous
Я делаю платформер. Я пробовал все, даже округлял позицию, прежде чем помещать ее в прямоугольник. Я не могу найти ничего, что могло бы решить эту проблему. Игра представляет собой пиксельную графику (масштабируется с учетом соотношения сторон, поэтому все должно быть медленным). Игрок всегда перекрывается с землей. Гравитация всегда будет толкать игрока вниз. Нигде не могу найти решение.
class Player(Sprite):
def __init__(self, pos=(10, -10), config=None):
super().__init__()
self.pos = pg.math.Vector2(self.rect.center)
self.vel = pg.math.Vector2(0, 0)
self.speed = 3
self.max_speed = 15
self.gravity = 1
self.jump_strength = -3
self.is_jumping = False
self.idle_timer = 0
self.colls = {"left": False, "right": False, "up": False, "down": False}
def update(self, dt):
self.rect.size = self.image.get_size()
self.rect.center = self.pos
if not self.colls["down"]:
self.vel.y += self.gravity * dt
else:
self.vel.y = 0
if self.keys["left"]:
self.vel.x = -self.speed
elif self.keys["right"]:
self.vel.x = self.speed
else:
self.vel.x = 0
if self.colls["down"]:
if abs(self.vel.x) > 0:
self.state = "run"
else:
self.state = "idle"
elif self.is_jumping:
self.state = "jump"
self.colls = {key: False for key in self.colls}
def handle_collisions(self, tiles):
self.pos.x += self.vel.x
self.rect.centerx = self.pos.x
for tile in tiles:
if self.rect.colliderect(tile.rect) and tile.type in TOUCHABLES:
if self.vel.x > 0:
self.rect.right = tile.rect.left
self.colls["right"] = True
elif self.vel.x < 0:
self.rect.left = tile.rect.right
self.colls["left"] = True
self.pos.x = self.rect.centerx
self.pos.y += self.vel.y
self.rect.centery = int(self.pos.y)
for tile in tiles:
if self.rect.colliderect(tile.rect) and tile.type in TOUCHABLES:
if self.vel.y > 0:
self.rect.bottom = tile.rect.top
self.colls["down"] = True
self.is_jumping = False
self.vel.y = 0
elif self.vel.y < 0:
self.rect.top = tile.rect.bottom
self.colls["up"] = True
self.vel.y = 0
self.pos.y = self.rect.centery
if self.colls["left"] or self.colls["right"]:
self.vel.x = 0
if self.colls["up"] or self.colls["down"]:
self.vel.y = 0
Подробнее здесь: [url]https://stackoverflow.com/questions/79316157/collision-handling-in-pygame[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия