Как закрепить камеру на персонаже в pygame?

Рейтинг: 0Ответов: 1Опубликовано: 26.04.2023
import pygame as pg
from level_1 import*
pg.init()
tiles = 30
window=pg.display.set_mode((tiles*50,tiles*30))
pg.display.set_caption('Mario')

mario_walk = 0

class Game_sprite():
    def __init__(self, image, x,y , w,h, speed):
        self.image=pg.transform.scale(pg.image.load(image),(w,h))
        self.w=w
        self.h=h
        self.speed=speed
        self.rect=self.image.get_rect()
        self.rect.x=x
        self.rect.y=y
        self.isJump = False
        self.jumpCount=10
    def reset(self):
        window.blit(self.image,(self.rect.x,self.rect.y))

class Player(Game_sprite):
    def control(self):
        global mario_walk
        keys=pg.key.get_pressed()
        if keys[pg.K_SPACE]:
            self.isJump = True
        if self.isJump is True:
            if self.jumpCount >= -10:
                if self.jumpCount < 0:
                    self.rect.y += (self.jumpCount ** 2) // 2
                else:
                    self.rect.y -= (self.jumpCount ** 2) // 2
                self.jumpCount -= 1
            else:
                self.isJump = False
                self.jumpCount = 10
            

        if keys[pg.K_d]:
            self.rect.x+=self.speed

            self.image=pg.transform.scale(pg.image.load(f'images/mario_walk_right/mario_walk-{mario_walk}.png'),(self.w,self.h))
            mario_walk+=1
            if mario_walk>7:
                mario_walk=0

            if self.isJump == True:
                self.image = pg.transform.scale(
                pg.image.load("images/mario_walk_right/mario_walk-4.png"), (self.w, self.h)
                )
      
        if keys[pg.K_a] and self.rect.x>0:
            self.rect.x-=self.speed
            self.image=pg.transform.scale(pg.image.load(f'images/mario_walk_left/mario_walk-{mario_walk}.png'),(self.w,self.h))
            mario_walk+=1
            if mario_walk>7:
                mario_walk=0

            if self.isJump == True:
                self.image = pg.transform.scale(
                pg.image.load("images/mario_walk_left/mario_walk-4.png"), (self.w, self.h)
                )


platform = []

for i in range(len(map_list)):
    for j in range(len(map_list[i])):
        print(map_list[i][j])
        if map_list[i][j]=='1':
            platform.append(Game_sprite('images/objects/platform.png',j*tiles,i*tiles,tiles,tiles,0))
bg = Game_sprite('images/bg/bg.png', tiles-tiles, tiles-tiles, tiles*50,tiles*30, 0)
mario = Player('images/mario_walk_right/mario_walk-0.png', tiles, tiles*26, tiles*2, tiles*2, 15)
game = True
while game:
    pg.time.Clock().tick(120)
    for i in pg.event.get():
        if i.type==pg.QUIT:
            exit()
    bg.reset()
    mario.reset()
    mario.control()
    for i in platform:
        i.reset()
    pg.display.flip()

Ответы

▲ 0Принят
import pygame as pg
from level_1 import*
pg.init()
tiles = 30
window=pg.display.set_mode((tiles*50,tiles*30))
pg.display.set_caption('Mario')

mario_walk = 0

class Game_sprite():
    def __init__(self, image, x,y , w,h, speed):
        self.image=pg.transform.scale(pg.image.load(image),(w,h))
        self.w=w
        self.h=h
        self.speed=speed
        self.rect=self.image.get_rect()
        self.rect.x=x
        self.rect.y=y
        self.isJump = False
        self.jumpCount=10
    def reset(self):
        window.blit(self.image,(self.rect.x,self.rect.y))

class Player(Game_sprite):
    def control(self):
        global mario_walk
        keys=pg.key.get_pressed()
        if keys[pg.K_SPACE]:
            self.isJump = True

        if self.isJump is True:
            if self.jumpCount >= -10:
                if self.jumpCount < 0:
                    self.rect.y += (self.jumpCount ** 2) // 2
                else:
                    self.rect.y -= (self.jumpCount ** 2) // 2
                self.jumpCount -= 1
            else:
                self.isJump = False
                self.jumpCount = 10
            
        if keys[pg.K_d]:
            if self.rect.x<=tiles*25:
                self.rect.x+=self.speed
            else:
                for i in s:
                    i.rect.x -= self.speed

            self.image=pg.transform.scale(pg.image.load(f'images/mario_walk_right/mario_walk-{mario_walk}.png'),(self.w,self.h))
            mario_walk+=1
            if mario_walk>7:
                mario_walk=0

            if self.isJump == True:
                self.image = pg.transform.scale(
                pg.image.load("images/mario_walk_right/mario_walk-4.png"), (self.w, self.h)
                )
            
      
        if keys[pg.K_a] and self.rect.x>0:
            if self.rect.x>tiles*10:
                self.rect.x-=self.speed
            else:
                if ground[0].rect.x<0:
                    for i in s:
                        i.rect.x += self.speed

            self.image=pg.transform.scale(pg.image.load(f'images/mario_walk_left/mario_walk-{mario_walk}.png'),(self.w,self.h))
            mario_walk+=1
            if mario_walk>7:
                mario_walk=0

            if self.isJump == True:
                self.image = pg.transform.scale(
                pg.image.load("images/mario_walk_left/mario_walk-4.png"), (self.w, self.h)
                )

s = []

pipe = []
pipe_s = []
box = []
platform = []
ground = []
for i in range(len(map_list)):
    for j in range(len(map_list[i])):
        if map_list[i][j]=='p':
            pipe.append(Game_sprite('images/objects/pipe.png',j*tiles,i*tiles,tiles,tiles,0))

for i in range(len(map_list)):
    for j in range(len(map_list[i])):
        if map_list[i][j]=='s':
            pipe.append(Game_sprite('images/objects/pipe_s.png',j*tiles,i*tiles,tiles,tiles,0))

for i in range(len(map_list)):
    for j in range(len(map_list[i])):
        if map_list[i][j]=='b':
            box.append(Game_sprite('images/objects/box.png',j*tiles,i*tiles,tiles,tiles,0))

for i in range(len(map_list)):
    for j in range(len(map_list[i])):
        if map_list[i][j]=='1':
            platform.append(Game_sprite('images/objects/platform.png',j*tiles,i*tiles,tiles,tiles,0))

for i in range(len(map_list)):
    for j in range(len(map_list[i])):
        if map_list[i][j]=='g':
            ground.append(Game_sprite('images/objects/ground.png',j*tiles,i*tiles,tiles,tiles,0))

bg = Game_sprite('images/bg/bg.png', tiles-tiles, tiles-tiles, tiles*50,tiles*30, 0)
mario = Player('images/mario_walk_right/mario_walk-0.png', tiles*10, tiles*26, tiles*2, tiles*2, 15)
game = True

for i in ground:
    s.append(i)
for i in platform:
    s.append(i)
for i in pipe:
    s.append(i)
for i in pipe_s:
    s.append(i)
for i in box:
    s.append(i)
s.append(bg)
while game:
    pg.time.Clock().tick(120)
    for i in pg.event.get():
        if i.type==pg.QUIT:
            exit()
    bg.reset()
    mario.reset()
    for i in pipe:
        i.reset()
    for i in pipe_s:
        i.reset()
    for i in box:
        i.reset()
    for i in platform:
        i.reset()
    for i in ground:
        i.reset()
    mario.control()
    pg.display.flip()