рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐
рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЦреБрдж рдХреЛ рдЧреЗрдо рдореЗрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдкрд╛рдпрдерди рд╕реАрдЦрдиреЗ рдФрд░ рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕рдкрдиреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред

рдПрдХ platformer рдХреНрдпрд╛ рд╣реИ?


рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ (рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░) - рдХрдВрдкреНрдпреВрдЯрд░ рдЧреЗрдо рдХреА рдПрдХ рд╢реИрд▓реА рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдордкреНрд▓реЗ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдХреВрджрдирд╛, рд╕реАрдврд╝рд┐рдпрд╛рдВ рдЪрдврд╝рдирд╛, рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╕реНрддрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреА рд╣реИрдВред
рд╡рд┐рдХреА

рдЗрд╕ рд╢реИрд▓реА рдХреЗ рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдЦреЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реБрдкрд░ рдорд╛рд░рд┐рдпреЛ рдмреНрд░рджрд░реНрд╕ рдФрд░ рд╕реБрдкрд░ рдореАрдЯ рдмреЙрдп рд╣реИрдВред рдЪрд▓реЛ рдмреАрдЪ рдореЗрдВ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


рд╕рдмрд╕реЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╣реИред


рдЪреЗрддрд╛рд╡рдиреА! рд╣рдо рдЕрдЬрдЧрд░ рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ 2.x, 3.x рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ!

рд╢рд╛рдпрдж, рди рдХреЗрд╡рд▓ рдЦреЗрд▓, рд▓реЗрдХрд┐рди pygame рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ:

#!/usr/bin/env python # -*- coding: utf-8 -*- #   pygame import pygame from pygame import * #  WIN_WIDTH = 800 #   WIN_HEIGHT = 640 #  DISPLAY = (WIN_WIDTH, WIN_HEIGHT) #        BACKGROUND_COLOR = "#004400" def main(): pygame.init() #  PyGame,   screen = pygame.display.set_mode(DISPLAY) #   pygame.display.set_caption("Super Mario Boy") #    bg = Surface((WIN_WIDTH,WIN_HEIGHT)) #    #     bg.fill(Color(BACKGROUND_COLOR)) #     while 1: #    for e in pygame.event.get(): #   if e.type == QUIT: raise SystemExit, "QUIT" screen.blit(bg, (0,0)) #      pygame.display.update() #        if __name__ == "__main__": main() 


рдЦреЗрд▓ рдПрдХ рд▓реВрдк ("1) рдореЗрдВ" рд╕реНрдкрд┐рди "рдХрд░реЗрдЧрд╛, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд╕рдм рдХреБрдЫ (рдкреГрд╖реНрдарднреВрдорд┐, рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ, рд░рд╛рдХреНрд╖рд╕реЛрдВ, рдбрд┐рдЬрд┐рдЯрд▓ рд╕рдВрджреЗрд╢реЛрдВ, рдЖрджрд┐) рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред" рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрдВрдЧ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╣реИ, рдЕрд░реНрдерд╛рддред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рдПрдХ рдирд╛рдпрдХ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рднрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд╛рдпрдХ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред

рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рд╣рд░реЗ рд░рдВрдЧ рд╕реЗ рднрд░реА рдПрдХ рд╡рд┐рдВрдбреЛ рджреЗрдЦреЗрдВрдЧреЗред


(рдЫрд╡рд┐ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ)

рдареАрдХ рд╣реИ, рд╢реБрд░реБрдЖрдд рдХреА рдЧрдИ рд╣реИ, рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рд╕реНрддрд░ред



рдФрд░ рдЙрд╕рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ? рд╢рдмреНрдж "рд╕реНрддрд░" рд╕реЗ рд╣рдорд╛рд░рд╛ рддрд╛рддреНрдкрд░реНрдп рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рди рд╕реЗ рднрд░реЗ рдПрдХ рдЖрднрд╛рд╕реА рджреЛ-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдХрд╛ рдПрдХ рд╕реАрдорд┐рдд рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдЪрд░рд┐рддреНрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛ред

рд╕реНрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, n рджреНрд╡рд╛рд░рд╛ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рд╕рд░рдгреА m рдмрдирд╛рдПрдБред рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ (m, n) рдПрдХ рдЖрдпрдд рд╣реЛрдЧреАред рдПрдХ рдЖрдпрдд рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЖрдпрддреЛрдВ рдореЗрдВ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝реЗрдВ

 PLATFORM_WIDTH = 32 PLATFORM_HEIGHT = 32 PLATFORM_COLOR = "#FF6262" 


рдлрд┐рд░ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╕реНрддрд░ рдХреА рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ

 level = [ "-------------------------", "- -", "- -", "- -", "- -- -", "- -", "-- -", "- -", "- --- -", "- -", "- -", "- --- -", "- -", "- ----------- -", "- -", "- - -", "- -- -", "- -", "- -", "-------------------------"] 

рдФрд░ рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:
 x=y=0 #  for row in level: #   for col in row: #   if col == "-": # ,       pf = Surface((PLATFORM_WIDTH,PLATFORM_HEIGHT)) pf.fill(Color(PLATFORM_COLOR)) screen.blit(pf,(x,y)) x += PLATFORM_WIDTH #      y += PLATFORM_HEIGHT #      x = 0 #       


рдпрд╛рдиреА рд╣рдо рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╕реНрддрд░ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╣рдореЗрдВ рдкреНрд░рддреАрдХ "-" рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ (x * PLATFORM_WIDTH, y * PLATFORM_HEIGHT), рдЬрд╣рд╛рдВ x, y рд╕рдорддрд▓ рд╕рд░рдгреА рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ

рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:



рдЪрд░рд┐рддреНрд░



рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдмрд╕ рдХреНрдпреВрдмреНрд╕ рдмрд╣реБрдд рдЙрдмрд╛рдК рд╣реИрдВред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЪрд░рд┐рддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЪрд▓реЗ рдФрд░ рдХреВрджреЗрдВред

рд╣рдо рдЕрдкрдиреЗ рдирд╛рдпрдХ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд▓реЗрдпрд░ - рдереНрд░реВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ

 #!/usr/bin/env python # -*- coding: utf-8 -*- from pygame import * MOVE_SPEED = 7 WIDTH = 22 HEIGHT = 32 COLOR = "#888888" class Player(sprite.Sprite): def __init__(self, x, y): sprite.Sprite.__init__(self) self.xvel = 0 # . 0 -    self.startX = x #   ,      self.startY = y self.image = Surface((WIDTH,HEIGHT)) self.image.fill(Color(COLOR)) self.rect = Rect(x, y, WIDTH, HEIGHT) #   def update(self, left, right): if left: self.xvel = -MOVE_SPEED #  = x- n if right: self.xvel = MOVE_SPEED #  = x + n if not(left or right): # ,     self.xvel = 0 self.rect.x += self.xvel #     xvel def draw(self, screen): #     screen.blit(self.image, (self.rect.x,self.rect.y)) 



рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ?
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдИ рдХрдХреНрд╖рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ pygame.sprite.Sprite рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА, рдЬрд┐рд╕рд╕реЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред
рд╕реНрдкреНрд░рд╛рдЗрдЯ рдПрдХ рдЧрддрд┐рдорд╛рди рдмрд┐рдЯрдореИрдк рд╣реИред рдЗрд╕рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рдФрд░ рдЧреБрдг рд╣реИрдВред

self.rect = Rect (x, y, WIDTH, HEIGHT) , рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдЪрд░рд┐рддреНрд░ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдорд╛рдУрдВ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдПрдХ рдЖрдпрдд рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рди рдХреЗрд╡рд▓ рдирд╛рдпрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдЯрдХреНрдХрд░реЛрдВ рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдиреАрдЪреЗред

рдЕрджреНрдпрддрди (рд╕реНрд╡рдпрдВ, рдмрд╛рдПрдВ, рджрд╛рдПрдВ) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрднрд┐рднрд╛рд╡рдХ рдЕрджреНрдпрддрди (* args) -> рдХреЛрдИ рдирд╣реАрдВ ред рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд░рд┐рддреНрд░ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛ (рд╕реЗрд▓реНрдл, рд╕реНрдХреНрд░реАрди) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ рдФрд░ рдирд╛рдпрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░реЗ рдирд╛рдпрдХ рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

рд╕реНрддрд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирд╛рдпрдХ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдЙрд╕рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЗ рдЪрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

 hero = Player(55,55) #    (x,y)  left = right = False #   тАФ  


рдИрд╡реЗрдВрдЯ рдЬрд╛рдБрдЪ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 if e.type == KEYDOWN and e.key == K_LEFT: left = True if e.type == KEYDOWN and e.key == K_RIGHT: right = True if e.type == KEYUP and e.key == K_RIGHT: right = False if e.type == KEYUP and e.key == K_LEFT: left = False 


рдпрд╛рдиреА рдпрджрд┐ рдЖрдк рдмрд╛рдИрдВ рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдПрдВ рдЬрд╛рдПрдВред рдпрджрд┐ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд░реБрдХ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рд╣реА рдмрдЯрди рдХреЗ рд╕рд╛рде рднреА

рдЗрд╕ рдЖрдВрджреЛрд▓рди рдХреЛ рд╣реА рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: (рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж)

 hero.update(left, right) #  hero.draw(screen) #  


рдЫрд╡рд┐

рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ рдЧреНрд░реЗ рдмреНрд▓реЙрдХ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рд╣рдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлрд╝реНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рд╕реАрдорд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрддрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝реЗрдВ

 timer = pygame.time.Clock() 


рдФрд░ рдореБрдЦреНрдп рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 timer.tick(60) 


рд╣рд╡рд╛ рдореЗрдВ рд▓рдЯрдХ рд░рд╣рд╛ рд╣реИ



рд╣рд╛рдВ, рд╣рдорд╛рд░рд╛ рдирд╛рдпрдХ рдПрдХ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рд╡рд╣ рд╣рд╡рд╛ рдореЗрдВ рдордБрдбрд░рд╛ рд░рд╣рд╛ рд╣реИред
рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдФрд░ рдХреВрджрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдлрд╝рд╛рдЗрд▓

рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝реЗрдВ

 JUMP_POWER = 10 GRAVITY = 0.35 # ,      


рд▓рд╛рдЗрдиреЛрдВ рдХреЛ _init_ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

  self.yvel = 0 #    self.onGround = False #    ? 


рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ
рдбреАрдИрдПрдлрд╝ рдЕрдкрдбреЗрдЯ (рд╕реНрд╡рдпрдВ, рдмрд╛рдПрдБ, рджрд╛рдПрдБ, рдКрдкрд░):
рдФрд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ:
 if up: if self.onGround: # ,       self.yvel = -JUMP_POWER 


рдФрд░ рд▓рд╛рдЗрди рд╕реЗ рдкрд╣рд▓реЗ self.rect.x + = self.xvel
рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

 if not self.onGround: self.yvel += GRAVITY self.onGround = False; #   ,    (( self.rect.y += self.yvel 


рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рдмрд╛рдПрдБ = рджрд╛рдПрдБ = рдЧрд▓рдд
рдЪрд░ рдХреЛ рдЬреЛрдбрд╝реЗрдВ
 up = false 


рдШрдЯрдирд╛ рдХреА рдЬрд╛рдБрдЪ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ

 if e.type == KEYDOWN and e.key == K_UP: up = True if e.type == KEYUP and e.key == K_UP: up = False 


рдФрд░ рдирдпрд╛ рдЕрдк рддрд░реНрдХ рдЬреЛрдбрд╝рдХрд░ рдХреЙрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдмрджрд▓реЗрдВ:
рд╣реАрд░реЛред рдЪреБрдк (рдмрд╛рдПрдВ, рджрд╛рдПрдВ )
рдкрд░
 hero.update(left, right, up) 


рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдмрд▓ рдмрдирд╛рдпрд╛, рдЬреЛ рд╣рдореЗрдВ рдиреАрдЪреЗ рдЦреАрдВрдЪреЗрдЧрд╛, рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝рддреА рдЧрддрд┐, рдЕрдЧрд░ рд╣рдо рдЬрдореАрди рдкрд░ рдирд╣реАрдВ рдЦрдбрд╝реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдбрд╝рд╛рди рдореЗрдВ рдирд╣реАрдВ рдХреВрдж рд╕рдХрддреЗред рдФрд░ рд╣рдо рдЕрднреА рднреА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд┐рдХ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реЗ рдПрдиреАрдореЗрд╢рди рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд╣реАрд░реЛ рджреГрд╢реНрдпрддрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред
рдЫрд╡рд┐

рдЕрдкрдиреА рдЬрдореАрди рдкрд░ рджреЛрдиреЛрдВ рдкреИрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЦрдбрд╝реЗ рд░рд╣реЗрдВред



рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рд╣рдо рдЬрдореАрди рдпрд╛ рдЕрдиреНрдп рдареЛрд╕ рд╕рддрд╣ рдкрд░ рд╣реИрдВ? рдЙрддреНрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред

рдПрдХ рдФрд░ blocks.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рд╡рд░рдг рдХреЛ рдЙрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред

 PLATFORM_WIDTH = 32 PLATFORM_HEIGHT = 32 PLATFORM_COLOR = "#FF6262" 


рдЗрд╕рдХреЗ рдмрд╛рдж, pygame.sprite.Sprite рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ

 class Platform(sprite.Sprite): def __init__(self, x, y): sprite.Sprite.__init__(self) self.image = Surface((PLATFORM_WIDTH, PLATFORM_HEIGHT)) self.image.fill(Color(PLATFORM_COLOR)) self.rect = Rect(x, y, PLATFORM_WIDTH, PLATFORM_HEIGHT) 


рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╕реНрддрд░ рд╕рд░рдгреА рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ, рдЬреЛрдбрд╝реЗрдВ

 entities = pygame.sprite.Group() #   platforms = [] # ,        entities.add(hero) 


рдЗрд╕ рд╕рдореВрд╣ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдерд╛рдУрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╕рд╛рде рдЪреМрд░рд╛рд╣реЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдЧрд▓рд╛ рдмреНрд▓реЙрдХ
 if col == "-": # ,       pf = Surface((PLATFORM_WIDTH,PLATFORM_HEIGHT)) pf.fill(Color(PLATFORM_COLOR)) screen.blit(pf,(x,y)) 


рд╕реЗ рдмрджрд▓реЗрдВ
 if col == "-": pf = Platform(x,y) entities.add(pf) platforms.append(pf) 


рдпрд╛рдиреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рд╕реНрдкреНрд░рд┐рдЯ рд╕рдореВрд╣ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ , рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рддрд░реНрдХ рди рд▓рд┐рдЦреЗрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╛рдж рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕рд╛рде рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХреА рд╕рд░рдгреА рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдкреВрд░реЗ рд╕реНрддрд░ рдХреА рдкреАрдврд╝реА рдХреЛрдб рдХреЛ рд▓реВрдк рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред

рдФрд░ рдПрдХ рд▓рд╛рдЗрди рднреА
Hero.draw (рд╕реНтАНрдХреНрд░реАрди) # рдореИрдкрд┐рдВрдЧ
рд╕реЗ рдмрджрд▓реЗрдВ
 entities.draw(screen) #   


рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдареАрдХ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдЯрдХрд░рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдирд╛рдпрдХ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдЦрд┐рд▓рд╛рдбреА рдлрд╛рдЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рд╣рдо рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдПрдХ рдирдпрд╛ рдЯрдХрд░рд╛рд╡ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ

 def collide(self, xvel, yvel, platforms): for p in platforms: if sprite.collide_rect(self, p): #       if xvel > 0: #    self.rect.right = p.rect.left #     if xvel < 0: #    self.rect.left = p.rect.right #     if yvel > 0: #    self.rect.bottom = p.rect.top #     self.onGround = True #    -  self.yvel = 0 #     if yvel < 0: #    self.rect.top = p.rect.bottom #     self.yvel = 0 #     

рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдирд╛рдпрдХ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдПрдХ рд╣реИ, рддреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реЛрддреА рд╣реИред

рдЦреИрд░, рдФрд░ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрджреНрдпрддрди рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓реЗрдВ, рдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 update(self, left, right, up, platforms) 


рдФрд░ рдореБрдЦреНрдп рдлрд╛рдЗрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдирд╛ рди рднреВрд▓реЗрдВред

рдФрд░ рддрд░реНрдЬ
 self.rect.y += self.yvel self.rect.x += self.xvel #     xvel 


рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:
 self.rect.y += self.yvel self.collide(0, self.yvel, platforms) self.rect.x += self.xvel #     xvel self.collide(self.xvel, 0, platforms) 


рдпрд╛рдиреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рдирд╛рдпрдХ рдХреЛ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЧрдпрд╛, рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдХреНрд╖реИрддрд┐рдЬ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХреА рдЧрдИред

рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдлреВ [рдп]! рдПрдХ рдЪрд▓рддреА рдЖрдпрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ!



рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдорд╛рд░рд┐рдпреЛ рдмреЙрдп рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдВрдХреГрдд рдХрд░реЗрдВред

рдЖрдЗрдП рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, blocks.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВред

рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП, рдЪрд┐рддреНрд░ рдкрд░ рд░рдВрдЧ рднрд░реЗрдВ
self.image.fill (рд░рдВрдЧ (PLATFORM_COLOR))
рд╕реЗ рдмрджрд▓реЗрдВ
 self.image = image.load("blocks/platform.png") 


рд╣рдо рдПрдХ рдареЛрд╕ рд░рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддрд╕реНрд╡реАрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, platform.png рдлрд╝рд╛рдЗрд▓ рдмреНрд▓реЙрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рд╕реНрд░реЛрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╣реА рд╣реБрдЖ



рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдирд╛рдпрдХ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рдЪрд▓рддреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд┐рддреНрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрджреНрднреБрдд pyganim рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

 ANIMATION_DELAY = 0.1 #    ANIMATION_RIGHT = [('mario/r1.png'), ('mario/r2.png'), ('mario/r3.png'), ('mario/r4.png'), ('mario/r5.png')] ANIMATION_LEFT = [('mario/l1.png'), ('mario/l2.png'), ('mario/l3.png'), ('mario/l4.png'), ('mario/l5.png')] ANIMATION_JUMP_LEFT = [('mario/jl.png', 0.1)] ANIMATION_JUMP_RIGHT = [('mario/jr.png', 0.1)] ANIMATION_JUMP = [('mario/j.png', 0.1)] ANIMATION_STAY = [('mario/0.png', 0.1)] 


рдпрд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдирд╛рдпрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдиреАрдореЗрд╢рдиред

рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ __init__ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 self.image.set_colorkey(Color(COLOR)) #    #    boltAnim = [] for anim in ANIMATION_RIGHT: boltAnim.append((anim, ANIMATION_DELAY)) self.boltAnimRight = pyganim.PygAnimation(boltAnim) self.boltAnimRight.play() #    boltAnim = [] for anim in ANIMATION_LEFT: boltAnim.append((anim, ANIMATION_DELAY)) self.boltAnimLeft = pyganim.PygAnimation(boltAnim) self.boltAnimLeft.play() self.boltAnimStay = pyganim.PygAnimation(ANIMATION_STAY) self.boltAnimStay.play() self.boltAnimStay.blit(self.image, (0, 0)) # -,  self.boltAnimJumpLeft= pyganim.PygAnimation(ANIMATION_JUMP_LEFT) self.boltAnimJumpLeft.play() self.boltAnimJumpRight= pyganim.PygAnimation(ANIMATION_JUMP_RIGHT) self.boltAnimJumpRight.play() self.boltAnimJump= pyganim.PygAnimation(ANIMATION_JUMP) self.boltAnimJump.play() 


рдпрд╣рд╛рдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдлреНрд░реЗрдо рдкрд░рд┐рд╡рд░реНрддрди рдЪрд╛рд▓реВ рдХрд░реЗрдВ)ред
 for anim in ANIMATION_LEFT: boltAnim.append((anim, ANIMATION_DELAY 
))
рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рдПрдХ рдЪрд┐рддреНрд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдордп рд╣реЛрддрд╛ рд╣реИред

рд╡рд╛рдВрдЫрд┐рдд рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╣реА рд╕рдордп рдкрд░ рд░рд╣рддрд╛ рд╣реИред


рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛрдбрд╝реЗрдВ ред

 if up: if self.onGround: # ,       self.yvel = -JUMP_POWER self.image.fill(Color(COLOR)) self.boltAnimJump.blit(self.image, (0, 0)) if left: self.xvel = -MOVE_SPEED #  = x- n self.image.fill(Color(COLOR)) if up: #       self.boltAnimJumpLeft.blit(self.image, (0, 0)) else: self.boltAnimLeft.blit(self.image, (0, 0)) if right: self.xvel = MOVE_SPEED #  = x + n self.image.fill(Color(COLOR)) if up: self.boltAnimJumpRight.blit(self.image, (0, 0)) else: self.boltAnimRight.blit(self.image, (0, 0)) if not(left or right): # ,     self.xvel = 0 if not up: self.image.fill(Color(COLOR)) self.boltAnimStay.blit(self.image, (0, 0)) 

рджреЗрдЦрд╛!
рдЫрд╡рд┐

рдЬреНрдпрд╛рджрд╛ рдЬрдЧрд╣ рдХреА рдЬрд░реВрд░рдд рд╣реИ


рд╣рдо рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХреИрдорд░рд╛ рдмрдирд╛рдХрд░ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрдорд░рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ

 class Camera(object): def __init__(self, camera_func, width, height): self.camera_func = camera_func self.state = Rect(0, 0, width, height) def apply(self, target): return target.rect.move(self.state.topleft) def update(self, target): self.state = self.camera_func(self.state, target.rect) 


рдЕрдЧрд▓рд╛, рдХреИрдорд░реЗ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝реЗрдВред

 def camera_configure(camera, target_rect): l, t, _, _ = target_rect _, _, w, h = camera l, t = -l+WIN_WIDTH / 2, -t+WIN_HEIGHT / 2 l = min(0, l) #      l = max(-(camera.width-WIN_WIDTH), l) #      t = max(-(camera.height-WIN_HEIGHT), t) #      t = min(0, t) #      return Rect(l, t, w, h) 


рдЖрдЗрдП рдПрдХ рдХреИрдорд░рд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рдореБрдЦреНрдп рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗрдВ:

 total_level_width = len(level[0])*PLATFORM_WIDTH #     total_level_height = len(level)*PLATFORM_HEIGHT #  camera = Camera(camera_configure, total_level_width, total_level_height) 


рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ?

рд╣рдордиреЗ рдПрдХ рдмрдбрд╝реА рдЖрдпрдд рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЧрдИ рд╣реИ:

 total_level_width = len(level[0])*PLATFORM_WIDTH #     total_level_height = len(level)*PLATFORM_HEIGHT #  


рдЫреЛрдЯреА рдЖрдпрдд, рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рдорд╛рдиред

рдЫреЛрдЯреА рдЖрдпрдд рдореБрдЦреНрдп рдЪрд░рд┐рддреНрд░ ( рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐) рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдФрд░ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдЯреЗ рдЖрдпрдд ( рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐) рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреИрдорд░рд╛ рдЖрдВрджреЛрд▓рди рдХреА рдЫрд╛рдк рдмрдирд╛рддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд▓рд╛рдЗрди рдмрджрд▓реЗрдВ
рд╕рдВрд╕реНрдерд╛рдУрдВред рд╡рд╛рдкрд╕ (рд╕реНрдХреНрд░реАрди) # рдорд╛рдирдЪрд┐рддреНрд░рдг
рдкрд░
 for e in entities: screen.blit(e.image, camera.apply(e)) 


рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗрдВ
 camera.update(hero) #     


рдЕрдм рд╣рдо рд╕реНрддрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

 level = [ "----------------------------------", "- -", "- -- -", "- -", "- -- -", "- -", "-- -", "- -", "- ---- --- -", "- -", "-- -", "- -", "- --- -", "- -", "- -", "- --- -", "- -", "- ------- ---- -", "- -", "- - -", "- -- -", "- -", "- -", "----------------------------------"] 

рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╣реИ
рдЫрд╡рд┐

рд░рд┐рдЬрд▓реНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, GitHub рдХрд╛ рд▓рд┐рдВрдХ

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдпрджрд┐ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ, рд░рд╛рдХреНрд╖рд╕реЛрдВ, рдЯреЗрд▓реАрдкреЛрд░реНрдЯрд░реНрд╕ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рд╛рдЬрдХреБрдорд╛рд░реА рдХреЗ рд╕рд╛рде рд▓рд╛рдареА рдФрд░ рд╡реЗрд╢реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕реНрддрд░ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗред

upd pygame рдХреЛ рдпрд╣рд╛рдБ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдзрдиреНрдпрд╡рд╛рдж, рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП Chris_Griffin
upd1 рджреВрд╕рд░рд╛ рднрд╛рдЧ

Source: https://habr.com/ru/post/In193888/


All Articles