рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдЖрдЬ рд╣рдо C ++, Box2D рдФрд░ SFML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА
рдЯрд╛рдЗрд▓ рд╡рд╛рд▓реЗ рдореИрдк рдПрдбрд┐рдЯрд░ рдЧреЗрдореНрд╕ рдХреЗ рд▓рд┐рдП 2 рдбреА рдореИрдк рдПрдбрд┐рдЯрд░ред

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ (рдирдХреНрд╢рд╛ 5 рдорд┐рдирдЯ + рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╢реВрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЦреЗрд▓ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ + рд╕реНрдХреНрд░реАрди рдЗрддрдирд╛ рдлреИрд▓рд╛ рдирд╣реАрдВ рд╣реИ - Bandicam рджреЛрд╖):
рд╕реНрд░реЛрдд рдФрд░ exe - рд▓реЗрдЦ рдХреЗ рдиреАрдЪреЗред
рдХреНрдпрд╛, рдХрд╣рд╛рдБ, рдХрдм?
Box2D
рд╣рдо рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ (рдмреНрд▓реЙрдХ, рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡) рдореЗрдВ рднреМрддрд┐рдХреА рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдк рд╕реБрдВрджрд░ рдЬреАрд╡рди рдХреА рдордирд╛рд╣реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ;)
Box2D рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рдФрд░ рдореБрдлреНрдд рднреМрддрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ
SFML
рдХреНрдпреЛрдВ SFML? рдкрд╣рд▓реЗ рдореИрдВ рдПрд╕рдбреАрдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрд╕рдПрдлрдПрдордПрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ, рдореБрдЭреЗ рдЦреБрдж рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдмрдЪрд╛рдпрд╛ рд╕рдордп рдХреЗ рд▓рд┐рдП SFML рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!
рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ
рдЯрд╛рдЗрд▓ рд╡рд╛рд▓рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХ
рдЯрд╛рдЗрд▓ рдореИрдк рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдб рдХреБрдЫ рдРрд╕рд╛ рдерд╛ред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда1111111 1000001 1001001 1000011 1000111 1111111
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ! рдореИрдк рдПрдбрд┐рдЯрд░ рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЛрдЪ рдореЗрдВ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ 5 рдорд┐рдирдЯ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ "рдореИрдк" рдХрд╛рдлреА рд╣реИред
рдЯрд╛рдЗрд▓реНрдб рдореИрдк рдПрдбрд┐рдЯрд░ рдПрдХ рдРрд╕рд╛ рдореИрдк рдПрдбрд┐рдЯрд░ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдирдХреНрд╢реЗ (рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рдЯрд╛рдЗрд▓, рдЙрдирдХреА рдкрд░рддреЗрдВ) рдХреЛ рдПрдХ XML- рдЬреИрд╕реА .tmx рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рддред
рдирдХреНрд╢рд╛ рдирд┐рд░реНрдорд╛рдг
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рд╕рд╛рдЗрдЯ рд╕реЗ рдЯреАрдПрдордИ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдПрдХ рдирдпрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдПрдБ "рдлрд╝рд╛рдЗрд▓-> рдмрдирд╛рдПрдБ ..."

рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдУрд░реНрдереЛрдЧреЛрдирд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рдЖрдк рдПрдХ рдЖрдЗрд╕реЛрдореЗрдЯреНрд░рд┐рдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ), рдФрд░ рдПрдХреНрд╕рдПрдордПрд▓ рдкрд░рдд рдХрд╛ рдкреНрд░рд╛рд░реВрдк, рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ
рд╡реИрд╕реЗ, рдмрдирд╛рдП рдЧрдП рдирдХреНрд╢реЗ рдореЗрдВ рди рддреЛ рдкрд░рдд рдХрд╛ рдкреНрд░рд╛рд░реВрдк, рди рд╣реА рдЯрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯрд╛рдЗрд▓реНрд╕
рдлрд┐рд░ рд╣рдо "рдореИрдк-> рдЯрд╛рдЗрд▓реНрд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ ..." рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реА рдЯрд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:

рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

рдЯрд╛рдЗрд▓ рдкрд░рддреЛрдВ рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИ?
рд▓рдЧрднрдЧ рд╣рд░ рдЧреЗрдо рдореЗрдВ рдорд▓реНрдЯреА рд▓реЗрдпрд░ рдХрд╛рд░реНрдб рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдкрд░рдд рдкреГрдереНрд╡реА (рдмрд░реНрдл, рдЪреЗрд░рдиреЛрдЬрд╝реЗрдо, рдЖрджрд┐) рд╣реИ, рджреВрд╕рд░реА рдкрд░рдд рдЗрдорд╛рд░рддреЗрдВ (рдмреИрд░рдХ, рдХрд┐рд▓реЗ, рдЖрджрд┐, рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ), рддреАрд╕рд░рд╛ рдкреЗрдбрд╝ (рд╕реНрдкреНрд░реВрд╕, рджреЗрд╡рджрд╛рд░, рдЖрджрд┐), рдкреГрд╖реНрдарднреВрдорд┐ рднреА рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ)ред рдпрд╣реА рд╣реИ, рдкрд╣рд▓реА рдкрд░рдд рдкрд╣рд▓реЗ рдЦреАрдВрдЪреА рдЧрдИ рд╣реИ, рджреВрд╕рд░реА рдкрд░рдд рдЙрд╕рдХреЗ рдКрдкрд░ рд╕реБрдкрд░рд┐рдореНрдкреЛрдЬ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдлрд┐рд░ рддреАрд╕рд░реАред
рдкрд░рддреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 4 рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рд╣реИ:



рдкрд░рддреЛрдВ рдХреА рд╕реВрдЪреА:

рд╡рд╕реНрддреБрдПрдВ
TME рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреНрдпрд╛ рд╣реИ?
рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рдирд╛рдо, рдкреНрд░рдХрд╛рд░ рдФрд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдкреИрдирд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдЖрдк рдХреЛред
рдЕрдм рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
"Kolobosha" рдкрд░рдд рдХреЛ рд╣рдЯрд╛рдПрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдкрд░рдд рдмрдирд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди рдирд╛рдо "Kolobosha"ред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреИрдирд▓ рд╕реЗ "рдЗрдВрд╕рд░реНрдЯ рдЯрд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ" рдЪреБрдиреЗрдВ (рдпрд╛ рдЖрдк рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ - рдЖрдХреГрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдХреЛрд▓реЛрдмреЛрд╕реА рдЯрд╛рдЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдмрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рд╕реА рдЬрдЧрд╣ рдкрд░ рд░рдЦреЗрдВред
рдлрд┐рд░ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ "рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдг ..." рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Kolobosha рдХрд░реЗрдВред
рдлрд┐рд░ рдореИрдк рдХреЛ рд╕реЗрд╡ рдХрд░реЗрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХреЛрдВ рдореЗрдВ рдХреБрдЫ рднреА рдкреБрд░рд╛рддрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдб рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдХрд╛рд░реНрдб рд░реАрдбрд░
XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ
TinyXML рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛
рдЧрдпрд╛ рд╣реИ , рдЗрд╕рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
Visual Studio рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБред TinyXML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ (рдпрд╛ xmltest.cpp :) рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрди рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдзрдХреЗрд▓реЗрдВ
рдЕрдм рд╣рдо "рдкреНрд░реЛрдЬреЗрдХреНрдЯ-> рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ" рдореЗрдВ рд╢рд╛рдорд┐рд▓''рд╡рд╛рдИ рдФрд░ рд▓рд┐рдм'рдИ SFML рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рддреЛ Google рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдореИрдкреНрд╕ рдХреЗ рд▓рд┐рдП Level.h рдмрдирд╛рдПрдБ
#ifndef LEVEL_H #define LEVEL_H #pragma comment(lib,"Box2D.lib") #pragma comment(lib,"sfml-graphics.lib") #pragma comment(lib,"sfml-window.lib") #pragma comment(lib,"sfml-system.lib") #include <string> #include <vector> #include <map> #include <SFML/Graphics.hpp>
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред
рдЕрдЧрд▓рд╛ рд╡рд╕реНрддреБ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ
struct Object { int GetPropertyInt(std::string name); float GetPropertyFloat(std::string name); std::string GetPropertyString(std::string name); std::string name; std::string type; sf::Rect<int> rect; std::map<std::string, std::string> properties; sf::Sprite sprite; };
рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЯреАрдПрдордИ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВ, рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд╛рдо - рд╡рд╕реНрддреБ рдХрд╛ рдирд╛рдо, рдкреНрд░рдХрд╛рд░ - рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░, рдЖрдпрдд - рд╡рд╕реНрддреБ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрдпрддред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реНрдкреНрд░рд╛рдЗрдЯ - рд╕реНрдкреНрд░рд╛рдЗрдЯ (рдЫрд╡рд┐) - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЯрд╛рдЗрд▓рд╕реЗрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ред рд╕реНрдкреНрд░рд╛рдЗрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдкрд░рдд рд╕рдВрд░рдЪрдирд╛ рдЖрддреА рд╣реИ - рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ
struct Layer { int opacity; std::vector<sf::Sprite> tiles; };
рдкрд░рдд рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╣реИ (рд╣рд╛рдБ, рд╣рд╛рдБ, рд╣рдо рдкрд╛рд░рднрд╛рд╕реА рдкрд░рддреЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ!) рдФрд░ рдЯрд╛рдЗрд▓реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреАред
рдЕрдЧрд▓рд╛ рд╕реНрддрд░ рд╡рд░реНрдЧ рдЖрддрд╛ рд╣реИ:
class Level { public: bool LoadFromFile(std::string filename); Object GetObject(std::string name); std::vector<Object> GetObjects(std::string name); void Draw(sf::RenderWindow &window); sf::Vector2i GetTileSize(); private: int width, height, tileWidth, tileHeight; int firstTileID; sf::Rect<float> drawingBounds; sf::Texture tilesetImage; std::vector<Object> objects; std::vector<Layer> layers; }; #endif
LoadFromFile рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓реЗрд╡рд▓ рдХреНрд▓рд╛рд╕ рдХрд╛ рджрд┐рд▓ рд╣реИред
GetObject рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ;
GetObjects рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдФрд░ рдкреНрд▓реЗрдпрд░ рдХреЛ рдирд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдХрдбрд╝рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд╛рдо рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред
рд╕рднреА рдЯрд╛рдЗрд▓реЗрдВ рдЦреАрдВрдЪрддреА рд╣реИрдВ (рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ!), рд░реЗрдВрдбрд░рд╡рд┐рдВрдбреЛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реБрдПред
рдЕрдм Level.cpp рдмрдирд╛рдПрдВ:
#include "level.h" #include <iostream> #include "tinyxml.h"
рдкрд╣рд▓реЗ рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ
int Object::GetPropertyInt(std::string name) { return atoi(properties[name].c_str()); } float Object::GetPropertyFloat(std::string name) { return strtod(properties[name].c_str(), NULL); } std::string Object::GetPropertyString(std::string name) { return properties[name]; }
рд▓реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд╕реНрддрд░ рдкрд░ рдЬрд╛рдПрдВ:
рдмреВрд▓ рд╕реНрддрд░ :: LoadFromFile (std :: string filename) bool Level::LoadFromFile(std::string filename) { TiXmlDocument levelFile(filename.c_str());
рдЕрдиреНрдп рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдп:
Object Level::GetObject(std::string name) {
Level.h рдХреЗ рд╕рд╛рде рдпрд╣ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ!
рд╣рдо рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред
Main.cpp рдмрдирд╛рдПрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ:
#include "level.h" int main() { Level level; level.LoadFromFile("test.tmx"); sf::RenderWindow window; window.create(sf::VideoMode(800, 600), "Level.h test"); while(window.isOpen()) { sf::Event event; while(window.pollEvent(event)) { if(event.type == sf::Event::Closed) window.close(); } window.clear(); level.Draw(window); window.display(); } return 0; }
рдирдХреНрд╢рд╛ рдХреБрдЫ рднреА рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ!
рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

main.cpp
#include "level.h" #include <iostream> int main() { Level level; level.LoadFromFile("test.tmx"); Object kolobosha = level.GetObject("Kolobosha"); std::cout << kolobosha.name << std::endl; std::cout << kolobosha.type << std::endl; std::cout << kolobosha.GetPropertyInt("health") << std::endl; std::cout << kolobosha.GetPropertyString("mood") << std::endl; sf::RenderWindow window; window.create(sf::VideoMode(800, 600), "Kolobosha adventures"); while(window.isOpen()) { sf::Event event; while(window.pollEvent(event)) { if(event.type == sf::Event::Closed) window.close(); } window.clear(); level.Draw(window); window.display(); } return 0; }
рдкрд░рд┐рдгрд╛рдо:

рдЬрдм рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ Box2D рдХрд╛ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ:
рдмрдХреНрд╕реЗ, рдмрдХреНрд╕реЗ
рд╣рдо рдПрдХ
3 рдбреА рдХрд╛рд░реНрд░рд╡рд╛рдИ platformer рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╕рд╛рд░ рд╣реИ ...
рдирдХреНрд╢реЗ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣реИрдВ - рдирд╛рдо рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╛рдбрд╝реА - рдЦрд┐рд▓рд╛рдбрд╝реА, рджреБрд╢реНрдорди - рджреБрд╢реНрдорди, рдмреНрд▓реЙрдХ - рдмреНрд▓реЙрдХ, рдкреИрд╕рд╛ - рд╕рд┐рдХреНрдХреЗред
рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдФрд░ рдиреНрдпреВрдЯрди рдХреА рддрд╛рдХрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред
рджреБрд╢реНрдорди рдкреАрдЫреЗ-рдкреАрдЫреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдмрд╣реБрдд рдХрд░реАрдм рд╕реЗ рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдЙрди рдкрд░ рдХреВрджрддрд╛ рд╣реИ рддреЛ рдорд░ рдЬрд╛рддрд╛ рд╣реИ
рдмреНрд▓реЙрдХ "рд╕реНрдерд┐рд░" рд╣рд╡рд╛ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рддрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдЙрди рдкрд░ рдХреВрдж рд╕рдХрддрд╛ рд╣реИ
рд╕рд┐рдХреНрдХреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдмрд╕ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реЗ рдЯрдХрд░рд╛рддреЗ рд╣реИрдВ
рдУрдкрди рдореЗрди.рд╣, рдЬреЛ рд╡рд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЙрд╕реЗ рдорд┐рдЯрд╛ рджреЗрдВ, рдФрд░ рд▓рд┐рдЦреЗрдВ:
#include "level.h" #include <Box2D\Box2D.h> #include <iostream> #include <random> Object player; b2Body* playerBody; std::vector<Object> coin; std::vector<b2Body*> coinBody; std::vector<Object> enemy; std::vector<b2Body*> enemyBody;
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ level.h рдФрд░ Box2D.h рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП iostream рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ - рджреБрд╢реНрдорди рдХреЗ рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЕрдЧрд▓реЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдФрд░ рд╡реИрдХреНрдЯрд░ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рджреБрд╢реНрдорди, рд╕рд┐рдХреНрдХрд╛, рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкрдиреА рд╡рд╕реНрддреБ рдФрд░ b2Body (Box2D рдореЗрдВ рд╢рд░реАрд░) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ - рдмреНрд▓реЙрдХ рдРрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдмреЙрдХреНрд╕ 2 рдбреА рднреМрддрд┐рдХреА рд╕реНрддрд░ рдкрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЦреЗрд▓ рддрд░реНрдХ рдореЗрдВ рдирд╣реАрдВред
рдЕрдЧрд▓рд╛:
int main() { srand(time(NULL)); Level lvl; lvl.LoadFromFile("platformer.tmx"); b2Vec2 gravity(0.0f, 1.0f); b2World world(gravity); sf::Vector2i tileSize = lvl.GetTileSize();
рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП srand (рд╕рдордп (NULL)) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╣рдо рдирдХреНрд╢рд╛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдмреА 2 рд╡рд░реНрд▓реНрдб рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рджрд┐рд╢рд╛ рд╕реЗ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ (0.10) рд╕реЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг (0.1) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдордЬрдмреВрдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЙрди рдЯрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рдЕрдЧрд▓рд╛, рдмреНрд▓реЙрдХ рдмреЙрдбреА рдмрдирд╛рдПрдВ:
std::vector<Object> block = lvl.GetObjects("block"); for(int i = 0; i < block.size(); i++) { b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position.Set(block[i].rect.left + tileSize.x / 2 * (block[i].rect.width / tileSize.x - 1), block[i].rect.top + tileSize.y / 2 * (block[i].rect.height / tileSize.y - 1)); b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(block[i].rect.width / 2, block[i].rect.height / 2); body->CreateFixture(&shape,1.0f); }
bodyDef.type = b2_staticBody;
рдмреНрд▓реЙрдХ рд╕реНрдерд┐рд░ рдирд┐рдХрд╛рдп рд╣реИрдВ, рдЙрдирдХрд╛ рдХреЛрдИ рджреНрд░рд╡реНрдпрдорд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рд╡рд╛ рдореЗрдВ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ:
bodyDef.position.Set(block[i].rect.left + tileSize.x / 2 * (block[i].rect.width / tileSize.x - 1), block[i].rect.top + tileSize.y / 2 * (block[i].rect.height / tileSize.y - 1));
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдерд┐рддрд┐ рд╡рд╕реНрддреБ рдХреЗ рд╕рдорд╛рди рд╣реИ, рддреЛ рд╣рдо
рдПрдХ рдХрдкрдЯреА
рдЧрд▓рддреА рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред
b2Body* body = world.CreateBody(&bodyDef);
рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмреНрд▓реЙрдХ рдмреЙрдбреА рдмрдирд╛рдПрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╢рд░реАрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ):
b2PolygonShape shape; shape.SetAsBox(block[i].rect.width / 2, block[i].rect.height / 2);
рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реАрд░ рдХреЗ рдХрдИ рдЖрдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ - рдЖрдВрдХрдбрд╝реЗред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмреНрд▓реЙрдХ (рдФрд░ рдмрд╛рдХреА рдирд┐рдХрд╛рдпреЛрдВ) рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЖрдпрдд рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
body->CreateFixture(&shape,1.0f);
рд╣рдо рдЖрдХреГрддрд┐ рдХреЛ рд╢рд░реАрд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо рдХреБрдЫ рдорддрднреЗрджреЛрдВ рдХреЗ рд╕рд╛рде рджреБрд╢реНрдордиреЛрдВ, рд╕рд┐рдХреНрдХреЛрдВ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ:
coin = lvl.GetObjects("coin"); for(int i = 0; i < coin.size(); i++) { b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(coin[i].rect.left + tileSize.x / 2 * (coin[i].rect.width / tileSize.x - 1), coin[i].rect.top + tileSize.y / 2 * (coin[i].rect.height / tileSize.y - 1)); bodyDef.fixedRotation = true; b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(coin[i].rect.width / 2, coin[i].rect.height / 2); body->CreateFixture(&shape,1.0f); coinBody.push_back(body); } enemy = lvl.GetObjects("enemy"); for(int i = 0; i < enemy.size(); i++) { b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(enemy[i].rect.left + tileSize.x / 2 * (enemy[i].rect.width / tileSize.x - 1), enemy[i].rect.top + tileSize.y / 2 * (enemy[i].rect.height / tileSize.y - 1)); bodyDef.fixedRotation = true; b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(enemy[i].rect.width / 2, enemy[i].rect.height / 2); body->CreateFixture(&shape,1.0f); enemyBody.push_back(body); } player = lvl.GetObject("player"); b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(player.rect.left, player.rect.top); bodyDef.fixedRotation = true; playerBody = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(player.rect.width / 2, player.rect.height / 2); b2FixtureDef fixtureDef; fixtureDef.shape = &shape; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; playerBody->CreateFixture(&fixtureDef);
bodyDef.fixedRotation = true;
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╢рд░реАрд░ рдШреВрдо рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред
рд╕рднреА рдирд┐рдХрд╛рдп рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╢реЗрдбреНрдпреВрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ!
sf::Vector2i screenSize(800, 600); sf::RenderWindow window; window.create(sf::VideoMode(screenSize.x, screenSize.y), "Game");
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдХреЛрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рдФрд░ рд╢реАрд░реНрд╖рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд┐рдбрд╝рдХреА рдмрдирд╛рддрд╛ рд╣реИ:
sf::View view; view.reset(sf::FloatRect(0.0f, 0.0f, screenSize.x, screenSize.y)); view.setViewport(sf::FloatRect(0.0f, 0.0f, 2.0f, 2.0f));
рдпрд╣рд╛рдВ рд╣рдо рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдЧреЗрдо рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реИрд▓реА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо sf :: рд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░реАрди рдХрд╛ рдЖрдХрд╛рд░ 2 рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЪрд┐рддреНрд░ 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред
while(window.isOpen()) { sf::Event evt; while(window.pollEvent(evt)) { switch(evt.type) { case sf::Event::Closed: window.close(); break;
рд▓рд╛рд▓ X рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд╡рд┐рдВрдбреЛ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рдХреЛрдб рдкрд╣рд▓реЗ рдерд╛:
case sf::Event::KeyPressed: if(evt.key.code == sf::Keyboard::W) playerBody->SetLinearVelocity(b2Vec2(0.0f, -15.0f)); if(evt.key.code == sf::Keyboard::D) playerBody->SetLinearVelocity(b2Vec2(5.0f, 0.0f)); if(evt.key.code == sf::Keyboard::A) playerBody->SetLinearVelocity(b2Vec2(-5.0f, 0.0f)); break;
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ! рд╣рдо WAD рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рджрдмрд╛рдХрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЧрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:
world.Step(1.0f / 60.0f, 1, 1);
рдпрд╣рд╛рдВ рд╣рдо Box2D рдХреА рднреМрддрд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реНрдХ рджреБрдирд┐рдпрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡реГрддреНрддрд┐ (рдкреНрд░рддреНрдпреЗрдХ 1/60 рд╕реЗрдХрдВрдб) рд▓реЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡реЗрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рднреА рд╣реЛрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рдореВрд▓реНрдп рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛, рдЙрддрдирд╛ рд╣реА рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЦреЗрд▓ рдХрд╛ рднреМрддрд┐рдХреА рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЬрдЯрд┐рд▓ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдЧреНрд░реАрдмрд░реНрдбреНрд╕ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЖрдпрддреЗрдВ рд╣реИрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
for(b2ContactEdge* ce = playerBody->GetContactList(); ce; ce = ce->next) { b2Contact* c = ce->contact;
рдпрд╣рд╛рдВ рд╣рдо рдЕрдиреНрдп рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЯрдХреНрдХрд░ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ:
for(int i = 0; i < coinBody.size(); i++) if(c->GetFixtureA() == coinBody[i]->GetFixtureList()) { coinBody[i]->DestroyFixture(coinBody[i]->GetFixtureList()); coin.erase(coin.begin() + i); coinBody.erase(coinBody.begin() + i); }
рд╕рд┐рдХреНрдХрд╛ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдирд┐рдкрдЯрдиреЗред
рдпрджрд┐ рдХреЛрдИ рд╕рд┐рдХреНрдХрд╛ рдХрд┐рд╕реА рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдмрд╕ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реИрдХреНрдЯрд░ рд╕реЗ рдорд┐рдЯ рдЬрд╛рддрд╛ рд╣реИ:
for(int i = 0; i < enemyBody.size(); i++) if(c->GetFixtureA() == enemyBody[i]->GetFixtureList()) { if(playerBody->GetPosition().y < enemyBody[i]->GetPosition().y) { playerBody->SetLinearVelocity(b2Vec2(0.0f, -10.0f)); enemyBody[i]->DestroyFixture(enemyBody[i]->GetFixtureList()); enemy.erase(enemy.begin() + i); enemyBody.erase(enemyBody.begin() + i); }
рдпрджрд┐ рджреБрд╢реНрдорди рдХрд┐рд╕реА рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рджреБрд╢реНрдорди рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдзрд┐рдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рджреБрд╢реНрдорди рд╕реЗ рд▓рдВрдмрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдорд┐рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреВрдж рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЕрдиреНрдпрдерд╛, рдЦрд┐рд▓рд╛рдбрд╝реА рджреБрд╢реНрдорди рдХреЛ рдЙрдЫрд╛рд▓ рджреЗрддрд╛ рд╣реИ:
else { int tmp = (playerBody->GetPosition().x < enemyBody[i]->GetPosition().x) ? -1 : 1; playerBody->SetLinearVelocity(b2Vec2(10.0f * tmp, 0.0f)); } } }
рдЦрд┐рд▓рд╛рдбрд╝реА рджреБрд╢реНрдорди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЙрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджрд╛рдПрдВ рдпрд╛ рдмрд╛рдПрдВ рдЪрд▓рддрд╛ рд╣реИред
for(int i = 0; i < enemyBody.size(); i++) { if(enemyBody[i]->GetLinearVelocity() == b2Vec2_zero) { int tmp = (rand() % 2 == 1) ? 1 : -1; enemyBody[i]->SetLinearVelocity(b2Vec2(5.0f * tmp, 0.0f)); } }
рдпрджрд┐ рджреБрд╢реНрдорди рдХреА рдЧрддрд┐ 0 рд╣реИ, рддреЛ рдЧрддрд┐ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреА рдЬрд╛рддреА рд╣реИ - рд╡рд╣ рдпрд╛ рддреЛ рджрд╛рдИрдВ рдУрд░ рдпрд╛ рдмрд╛рдИрдВ рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдиреЗрддреНрд░рд╣реАрди, рдпрд╣ рдПрдХ рдЭрдЯрдХреЗрджрд╛рд░ рдЖрдВрджреЛрд▓рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
b2Vec2 pos = playerBody->GetPosition(); view.setCenter(pos.x + screenSize.x / 4, pos.y + screenSize.y / 4); window.setView(view);
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рд▓реЗрддреЗ рд╣реИрдВ, рджреГрд╢реНрдп рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
player.sprite.setPosition(pos.x, pos.y); for(int i = 0; i < coin.size(); i++) coin[i].sprite.setPosition(coinBody[i]->GetPosition().x, coinBody[i]->GetPosition().y); for(int i = 0; i < enemy.size(); i++) enemy[i].sprite.setPosition(enemyBody[i]->GetPosition().x, enemyBody[i]->GetPosition().y);
B2Body рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕, рд╕рд┐рдХреНрдХреЛрдВ рдФрд░ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ:
window.clear(); lvl.Draw(window); window.draw(player.sprite); for(int i = 0; i < coin.size(); i++) window.draw(coin[i].sprite); for(int i = 0; i < enemy.size(); i++) window.draw(enemy[i].sprite); window.display();
рд╣рдо рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ, рдирдХреНрд╢рд╛ рдЯрд╛рдЗрд▓реЗрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЦрд┐рд▓рд╛рдбрд╝реА, рд╕рд┐рдХреНрдХреЗ рдФрд░ рджреБрд╢реНрдорди, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЦрд┐рдбрд╝рдХреА рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред
} return 0; }
рд╣реЛ рдЧрдпрд╛!
рдирдореВрдирд╛ рдирдХреНрд╢рд╛:

рд╕реНрд░реЛрдд рдХреЛрдб
https://github.com/Izaron/PlatformerрдзрдиреНрдпрд╡рд╛рдж
рдЗрд╕
рд╡рд┐рд╖рдп рдХреЗ рд▓реЗрдЦрдХ рдХреЛ
SFML рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП
Box2D рд▓реЗрдЦрдХ
рд▓реЗрдЦрдХ
TinyXml