Обработка столкновений в pygamePython

Программы на Python
Ответить
Anonymous
 Обработка столкновений в pygame

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-pygame
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»