I'm creating a platformer on pygame based on a YouTube tutorial, but I don't know how to make the camera scroll vertically. I think I have to connect world_shift with player, but I dont know how. When I tried to run the program world_shift_y did not work.
import pygame
from support import import_csv_layout, import_cut_graphics
from settings import tile_size, screen_height, screen_width
from tiles import *
from player import Player
class Level:
def __init__(self,level_data,surface):
self.display_surface = surface
self.world_shift = 0
self.world_shift_height = 0
self.current_x = None
player_layout = import_csv_layout(level_data['player'])
self.player = pygame.sprite.GroupSingle()
self.player_setup(player_layout)
self.dust_sprite = pygame.sprite.GroupSingle()
self.player_on_ground = False
terrain_layout = import_csv_layout(level_data['terrain'])
self.terrain_sprites = self.create_tile_group(terrain_layout,'terrain')
def create_tile_group(self,layout,type):
sprite_group = pygame.sprite.Group()
for row_index, row in enumerate(layout):
for col_index,val in enumerate(row):
if val != '-1':
x = col_index * tile_size
y = row_index * tile_size
if type == 'terrain':
sprite = Tile(tile_size, x, y)
sprite_group.add(sprite)
return sprite_group
def player_setup(self,layout):
for row_index, row in enumerate(layout):
for col_index,val in enumerate(row):
x = col_index * tile_size
y = row_index * tile_size
if val == '0':
sprite = Player((x,y),self.display_surface,self.create_jump_particles)
self.player.add(sprite)
def horizontal_movement_collision(self):
player = self.player.sprite
player.rect.x += player.direction.x * player.speed
collidable_sprites = self.terrain_sprites.sprites()
for sprite in collidable_sprites:
if sprite.rect.colliderect(player.rect):
if player.direction.x < 0:
player.rect.left = sprite.rect.right
player.on_left = True
self.current_x = player.rect.left
elif player.direction.x > 0:
player.rect.right = sprite.rect.left
player.on_right = True
self.current_x = player.rect.right
if player.on_left and (player.rect.left < self.current_x or player.direction.x >= 0):
player.on_left = False
if player.on_right and (player.rect.right > self.current_x or player.direction.x <= 0):
player.on_right = False
def vertical_movement_collision(self):
player = self.player.sprite
player.apply_gravity()
collidable_sprites = self.terrain_sprites.sprites()
for sprite in collidable_sprites:
if sprite.rect.colliderect(player.rect):
if player.direction.y > 0:
player.rect.bottom = sprite.rect.top
player.direction.y = 0
player.on_ground = True
elif player.direction.y < 0:
player.rect.top = sprite.rect.bottom
player.direction.y = 0
player.on_ceiling = True
if player.on_ground and player.direction.y < 0 or player.direction.y > 1:
player.on_ground = False
if player.on_ceiling and player.direction.y > 0.1:
player.on_ceiling = False
def scroll_x(self):
player = self.player.sprite
player_x = player.rect.centerx
direction_x = player.direction.x
if player_x < screen_width / 4 and direction_x < 0:
self.world_shift = 6
player.speed = 0
elif player_x > screen_width - (screen_width / 4) and direction_x > 0:
self.world_shift = -6
player.speed = 0
else:
self.world_shift = 0
player.speed = 6
def scroll_y(self):
player = self.player.sprite
player_y = player.rect.centery
direction_y = player.direction.y
if player_y < screen_height / 6 and direction_y < 0:
self.world_shift_height = -20
player.jump_speed = 0
elif player_y > screen_height - (screen_height / 6) and direction_y > 0:
self.world_shift_height = 20
player.jump_speed = 0
else:
self.world_shift_height = 0
player.jump_speed = -20
def get_player_on_ground(self):
if self.player.sprite.on_ground:
self.player_on_ground = True
else:
self.player_on_ground = False
def run(self):
self.terrain_sprites.update(self.world_shift)
self.terrain_sprites.update(self.world_shift_height)
self.terrain_sprites.draw(self.display_surface)
self.player.update()
self.horizontal_movement_collision()
self.get_player_on_ground()
self.vertical_movement_collision()
self.create_landing_dust()
self.scroll_x()
self.player.draw(self.display_surface)