Препятствие в 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

