Препятствие в 2D игре на pygame

Делаю 2D шутер на pygame, и собираюсь добавить препятствия.Уже получилось настроить так, чтобы игрок на него запрыгивал, но спрыгивать с него не получается. Перепробовал много вариантов, результат не очень. КОД:

import os

import pygame

FPS = 60

HEIGHT = 1024
WIDTH = 600

x0 = 450
y0 = 340
x1 = 1055
y1 = 400
GROUND_x = 0
GROUND_y = 550
OBSTACLE_x = 4000
OBSTACLE_y = 300

BLUE = (0, 0, 255)
BlACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

SPEED = 7
SPEED2 = 20
JUMP_SPEED = 25
ANIM_COUNT = 0

pygame.init()
screen = pygame.display.set_mode((HEIGHT, WIDTH))
pygame.display.set_caption('Niggers')
time = pygame.time.Clock()

game_dir = os.path.dirname(__file__)
img_dir = os.path.join(game_dir)
slaves_dir = os.path.join(game_dir, 'slave')
sound_dir = os.path.join(game_dir)
background_img = pygame.image.load(os.path.join(img_dir, 'background.jpg'))
ground_img = [pygame.image.load(os.path.join(img_dir, 'ground.png'))]
obstacle_img = pygame.image.load(os.path.join(img_dir, 'obstacle.jpg'))

right_imgs = [pygame.image.load(os.path.join(img_dir, 'soldat1.png')),
              pygame.image.load(os.path.join(img_dir, 'soldat2.png')),
              pygame.image.load(os.path.join(img_dir, 'soldat3.png')),
              pygame.image.load(os.path.join(img_dir, 'soldat4.png')),
              pygame.image.load(os.path.join(img_dir, 'soldat5.png')),
              pygame.image.load(os.path.join(img_dir, 'soldat6.png'))]

left_imgs = [pygame.image.load(os.path.join(img_dir, 'soldat7.png')),
             pygame.image.load(os.path.join(img_dir, 'soldat8.png')),
             pygame.image.load(os.path.join(img_dir, 'soldat9.png')),
             pygame.image.load(os.path.join(img_dir, 'soldat10.png')),
             pygame.image.load(os.path.join(img_dir, 'soldat11.png')),
             pygame.image.load(os.path.join(img_dir, 'soldat12.png')), ]

nigger_img = pygame.image.load(os.path.join(slaves_dir, 'nigger.png'))
music_file = pygame.mixer.music.load(os.path.join(sound_dir, 'trek.mp3'))


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.image = right_imgs[0]
        self.rect = self.image.get_rect()
        self.rect.x = x0
        self.rect.y = y0
        self.right = False
        self.left = False
        self.up = False
        self.isJump = False
        self.contact = False
        self.on_new = False
        self.on_obstacle = False
        self.gravity = 20
        self.animcount = ANIM_COUNT
        self.jump_speed = JUMP_SPEED

    def update(self):
        if self.isJump:
            if self.jump_speed >= -25:
                obstacle1.rect.y += self.jump_speed
                obstacle2.rect.y += self.jump_speed
                ground.rect.y += self.jump_speed
                ground2.rect.y += self.jump_speed
                nigger.rect.y += self.jump_speed
                nigger2.rect.y += self.jump_speed
                nigger3.rect.y += self.jump_speed
                nigger4.rect.y += self.jump_speed
                nigger5.rect.y += self.jump_speed
                nigger6.rect.y += self.jump_speed
                nigger7.rect.y += self.jump_speed
                self.jump_speed -= 1.5
            elif self.jump_speed <= -25:
                self.jump_speed = 25
                self.isJump = False

        if self.animcount + 1 >= 60:
            self.animcount = 0
        if not self.isJump and self.right:
            self.image = right_imgs[self.animcount // 20]
            self.animcount += 3
        if not self.isJump and self.left:
            self.image = left_imgs[self.animcount // 20]
            self.animcount += 3

    def OnNewBlock1(self):
        if ground2.rect.x < 800:
            self.rect.y = ground2.rect.y
            nigger6.rect.y = 200
            nigger7.rect.y = 200
            ground2.rect.y = 400
            self.rect.y -= 200
            ground.kill()
            obstacle1.kill()
            self.on_new = True

    def shot_right(self):
        self.bullet1 = Bullet1(self.rect.x + 140, self.rect.y + 65)
        bullets.add(self.bullet1)

    def shot_left(self):
        self.bullet2 = Bullet2(self.rect.x, self.rect.y + 65)
        bullets.add(self.bullet2)


class Bullet1(pygame.sprite.Sprite):
    def __init__(self, x0, y0):
        super(Bullet1, self).__init__()
        self.image = pygame.Surface((30, 10))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = x0
        self.rect.y = y0

    def update(self):
        self.rect.x += SPEED2
        if player.contact:
            self.kill()


class Bullet2(pygame.sprite.Sprite):
    def __init__(self, x0, y0):
        super(Bullet2, self).__init__()
        self.image = pygame.Surface((30, 10))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = x0
        self.rect.y = y0

    def update(self):
        self.rect.x -= SPEED2
        if player.contact:
            self.kill()


class Niggers(pygame.sprite.Sprite):
    def __init__(self):
        super(Niggers, self).__init__()
        self.image = nigger_img
        self.rect = self.image.get_rect()
        self.rect.x = x1
        self.rect.y = y1
        self.dead = False

    def update(self):
        if player.right:
            self.rect.x -= SPEED
        elif player.left:
            self.rect.x += SPEED

        if self.dead:
            self.rect.y += SPEED2 + 10


class Ground(pygame.sprite.Sprite):
    def __init__(self):
        super(Ground, self).__init__()
        self.image = ground_img[0]
        self.rect = self.image.get_rect()
        self.rect.x = GROUND_x
        self.rect.y = GROUND_y

    def update(self):
        if player.right:
            self.rect.x -= SPEED
            if self.rect.x < -450:
                self.rect.x = GROUND_x
        if player.left:
            self.rect.x += SPEED
            if self.rect.x > 500:
                self.rect.x -= SPEED
        if not player.on_new and player.left:
            ground2.rect.x += SPEED


class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super(Obstacle, self).__init__()
        self.image = obstacle_img
        self.rect = self.image.get_rect()
        self.rect.x = OBSTACLE_x
        self.rect.y = OBSTACLE_y

    def update(self):
        if player.right:
            self.rect.x -= SPEED
        elif player.left:
            self.rect.x += SPEED + 7


pygame.mixer.music.play(-1)
pygame.mixer.music.set_volume(0.5)
all_sprites = pygame.sprite.Group()
ground_objects = pygame.sprite.Group()
obstacles = pygame.sprite.Group()
bullets = pygame.sprite.Group()
niggers = pygame.sprite.Group()
player = Player()
nigger = Niggers()
ground = Ground()
obstacle1 = Obstacle()
all_sprites.add(player)
all_sprites.add(ground)
niggers.add(nigger)
obstacles.add(obstacle1)

nigger2 = Niggers()
niggers.add(nigger2)
nigger2.rect.x += 500

nigger3 = Niggers()
niggers.add(nigger3)
nigger3.rect.x += 1500

nigger4 = Niggers()
niggers.add(nigger4)
nigger4.rect.x += 2000

nigger5 = Niggers()
niggers.add(nigger5)
nigger5.rect.x += 2500

nigger6 = Niggers()
niggers.add(nigger6)
nigger6.rect.x += 4000
nigger6.rect.y -= 360

nigger7 = Niggers()
niggers.add(nigger7)
nigger7.rect.x += 5000
nigger7.rect.y -= 360

ground2 = Ground()
ground_objects.add(ground2)
coords = (ground2.rect.x + 100, ground2.rect.y + 30, 300, 50)
ground2.rect.y -= 350
ground2.rect.x += 4000
if ground2.rect.x < 800:
    nigger6.kill()
    nigger7.kill()
if ground2.rect.x > 800 and player.on_new:
    niggers.add(nigger6)

obstacle2 = Obstacle()
obstacles.add(obstacle2)
obstacle2.rect.x += 1000
obstacle2.rect.y -= 100

run = True
while run:
    time.tick(FPS)
    if player.on_new:
        nigger6.rect.x -= SPEED
    if nigger6.rect.y > 400:
        nigger7.rect.x -= SPEED
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_d:
                player.right = True
                player.left = False
            if event.key == pygame.K_a:
                player.left = True
                player.right = False
            if event.key == pygame.K_SPACE:
                player.isJump = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                player.right = False
            if event.key == pygame.K_a:
                player.left = False
        elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
            if player.image == left_imgs[player.animcount // 20]:
                player.shot_left()
            if player.image == right_imgs[player.animcount // 20]:
                player.shot_right()

    collide_bullet = [pygame.sprite.spritecollide(nigger, bullets, False),
                      pygame.sprite.spritecollide(nigger2, bullets, False),
                      pygame.sprite.spritecollide(nigger3, bullets, False),
                      pygame.sprite.spritecollide(nigger4, bullets, False),
                      pygame.sprite.spritecollide(nigger5, bullets, False),
                      pygame.sprite.spritecollide(nigger6, bullets, False),
                      pygame.sprite.spritecollide(nigger7, bullets, False)]
    if collide_bullet[0]:
        nigger.dead = True
        player.contact = True

    if collide_bullet[1]:
        nigger2.dead = True
        player.contact = True

    if collide_bullet[2]:
        nigger3.dead = True
        player.contact = True

    if collide_bullet[3]:
        nigger4.dead = True
        player.contact = True

    if collide_bullet[4]:
        nigger5.dead = True
        player.contact = True

    if collide_bullet[5]:
        nigger6.dead = True
        player.contact = True

    if collide_bullet[6]:
        nigger7.dead = True
        player.contact = True

    if not collide_bullet[0] and not collide_bullet[1] and not \
            collide_bullet[2] and not collide_bullet[3] and not collide_bullet[4] and not \
            collide_bullet[5] and not collide_bullet[6]:
        player.contact = False

    collide_nigger = pygame.sprite.spritecollide(player, niggers, False)
    if collide_nigger:
        run = False

    collide_block = pygame.sprite.spritecollide(player, ground_objects, False, pygame.sprite.collide_rect)
    if collide_block:
        player.OnNewBlock1()

    collide_obstacle = pygame.sprite.spritecollide(obstacle1, all_sprites, False, pygame.sprite.collide_rect)
    if collide_obstacle:
        obstacle1.rect.x += SPEED
        ground.rect.x += SPEED
        ground2.rect.x += SPEED

collide_obstacle_new = pygame.Rect.colliderect(player.rect, obstacle2.rect)
if collide_obstacle_new:
    obstacle2.rect.x += SPEED
    ground.rect.x += SPEED
    ground2.rect.x += SPEED
    if obstacle2.rect.y > 300:
        ground2.rect.y += 25
        obstacle2.rect.y += 25
if obstacle2.rect.x <= 226 and obstacle2.rect.y >= 500:
    ground2.rect.y -= 25
    obstacle2.rect.y -= 25

    screen.blit(background_img, (0, 0))
    all_sprites.update()
    niggers.update()
    bullets.update()
    ground_objects.update()
    obstacles.update()
    all_sprites.draw(screen)
    ground_objects.draw(screen)
    niggers.draw(screen)
    bullets.draw(screen)
    obstacles.draw(screen)
    pygame.display.flip()
# x= 226 y= 500

Часть кода отвечающая за 'запрыгивание' игрока на препятствие

collide_obstacle_new = pygame.Rect.colliderect(player.rect, obstacle2.rect)
if collide_obstacle_new:
    obstacle2.rect.x += SPEED
    ground.rect.x += SPEED
    ground2.rect.x += SPEED
    if obstacle2.rect.y > 300:
        ground2.rect.y += 25
        obstacle2.rect.y += 25
if obstacle2.rect.x <= 226 and obstacle2.rect.y >= 500:
    ground2.rect.y -= 25
    obstacle2.rect.y -= 25

Скрин игры с багомвведите сюда описание изображения

введите сюда описание изображения


Ответы (0 шт):