Итак, у вас есть Player.colliderect(Enemy)
, чтобы вы знали, когда он сталкивается, вам просто нужно выяснить, откуда и перемещать игрока соответственно.
Простой способ сделать это, который не идеален, - это иметь Направление движения игрока, и если игрок движется вниз, переместите игрока над противником.
В вашем коде вам нужно направление
direction = "not moving"
...
if keys[pygame.K_LEFT]:
x -= speed
direction = "left"
if keys[pygame.K_RIGHT]:
x += speed
direction = "right"
...
else:
if JumpCount >= -10:
y -= (JumpCount *abs(JumpCount))
JumpCount -= 1
if (JumpCount *abs(JumpCount)) > 0:
direction = "down"
else:
direction = "up"
...
if Player.colliderect(Enemy):
if direction == "down":
y -= player.bottom - enemy.top #get the amount that that the player is overlapping the enemy and take it off y so it no longer overlapping
elif direction == "up":
y += player.top - enemy.bottom
#do the same for left and right
, другой путь - сделайте игрока и врага Rects
и используйте их для замены x
и y
, чтобы
# first squrae
x = 50
y = 50
height= 50
width = 50
player = pygame.Rect(x,y,width,height)
speed = 5
isJump = False
JumpCount = 10
# square 2
cordx = 100
cordy = 200
cordheight = 100
cordwidth = 100
enemy = pygame.Rect(cordc,cordy,cordwidth,cordheight)
вы могли нарисовать их с помощью
win.fill((0,0,0))
# I added a varabial to my player square
pygame.draw.rect(win, (115, 235, 174),player)
# second square
# this is the big box and its the enemy square that I want my script to stand on
pygame.draw.rect(win, (202, 185 , 241), enemy)
и обновите позиции с помощью
if keys[pygame.K_LEFT]:
player.x -= speed
if keys[pygame.K_RIGHT]:
player.x += speed
и для столкновений
if player.colliderect(enemy):
if player.centerx < enemy.left: #if the center of player is left of the enemy
player.right = enemy.left
if player.centerx > enemy.right:
player.left = enemy.right
if player.centery < enemy.top:
player.bottom = enemy.top
if player.centery > enemy.bottom:
player.top = enemy.bottom
оба способа работают, и ни один из них не идеален, есть и другие способы сделать это, но я думаю, что я бы порекомендовал Первый способ, так как его легче понять и легче добавить в ваш код. Прокомментируйте, если вам нужно больше объяснений о том, как это работает или больше способов сделать это
import pygame
pygame.init()
win = pygame.display.set_mode((500,500))
pygame.display.set_caption("THIS GAME IS KINDA ASS")
class Player(pygame.sprite.Sprite):
def __init__(self, x, y, w, h, col):
pygame.sprite.Sprite.__init__(self)
self.rect = pygame.Rect(x,y,w,h)
self.image = pygame.Surface((w,h))
self.image.fill(col)
self.isJump = False
self.JumpCount = 8
def update(self):
if self.isJump:
if self.JumpCount >= -8:
self.rect.y -= (self.JumpCount *abs(self.JumpCount))
self.JumpCount -= 1
else:
self.isJump = False
self.JumpCount = 8
class Platform(pygame.sprite.Sprite):
def __init__(self, x, y, w, h, col):
pygame.sprite.Sprite.__init__(self)
self.rect = pygame.Rect(x,y,w,h)
self.image = pygame.Surface((w,h))
self.image.fill(col)
# first squrae
x = 50
y = 50
height= 50
width = 50
speed = 5
player = Player(x,y,width, height, (115, 235, 174))
# square 2
cordx = 100
cordy = 200
cordheight = 100
cordwidth = 100
enemy1 = Platform(cordx,cordy,cordwidth, cordheight, (202, 185 , 241))
#square 3
enemy2 = Platform(300,90,100,30,(202, 185 , 241))
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
all_sprites.add(enemy1)
all_sprites.add(enemy2)
enemy_sprites = pygame.sprite.Group()
enemy_sprites.add(enemy1, enemy2)
clock = pygame.time.Clock()
# main loop
runningame = True
while runningame:
clock.tick(50)
for event in pygame.event.get():
if event.type == pygame.QUIT:
runningame = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.rect.x -= speed
if keys[pygame.K_RIGHT]:
player.rect.x += speed
if not(player.isJump):
if keys[pygame.K_UP]:
player.rect.y -= speed
if keys[pygame.K_DOWN]:
player.rect.y += speed
if keys[pygame.K_SPACE]:
player.isJump = True
for enemy in enemy_sprites.sprites():
if player.rect.colliderect(enemy.rect):
if player.rect.centerx < enemy.rect.left: #if the center of player is left of the enemy
player.rect.right = enemy.rect.left
if player.rect.centerx > enemy.rect.right:
player.rect.left = enemy.rect.right
if player.rect.centery < enemy.rect.top:
player.rect.bottom = enemy.rect.top
if player.rect.centery > enemy.rect.bottom:
player.rect.top = enemy.rect.bottom
all_sprites.update()
win.fill((0,0,0))
all_sprites.draw(win)
pygame.display.update()
pygame.quit()
Вот ваша программа, но с использованием спрайтов
Как вы можете видеть, я переместил любой код, касающийся квадратов для их классов. каждый спрайт имеет rect
и image
. Прямоугольник используется так же, как и прямоугольник, который я показал выше. Изображение является поверхностью, потому что именно так Pygame выводит его на экран. он точно такой же, как и раньше, сделав его такого же размера и залейв его цветом.
У меня есть 2 группы спрайтов, группа all_sprites
, которая имеет все из них, и группа enemy_sprites
, которая только есть враги (платформы, на которых вы можете стоять). Я могу нарисовать все спрайты, вызвав all_sprites.draw(win)
.
Для столкновений точно так же, за исключением того, что я хочу l oop через каждого врага (как у меня сейчас 2). поэтому я могу позвонить enemy_sprites.sprites()
, чтобы получить каждый спрайт.
Если вам нужны дополнительные объяснения или примеры, начните чат.