рд╣рдо 30 рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рдмрдирд╛рддреЗ рд╣реИрдВ

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдЖрдЬ рд╣рдо 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()); //  XML- if(!levelFile.LoadFile()) { std::cout << "Loading level \"" << filename << "\" failed." << std::endl; return false; } //    map TiXmlElement *map; map = levelFile.FirstChildElement("map"); //  : <map version="1.0" orientation="orthogonal" // width="10" height="10" tilewidth="34" tileheight="34"> width = atoi(map->Attribute("width")); height = atoi(map->Attribute("height")); tileWidth = atoi(map->Attribute("tilewidth")); tileHeight = atoi(map->Attribute("tileheight")); //        TiXmlElement *tilesetElement; tilesetElement = map->FirstChildElement("tileset"); firstTileID = atoi(tilesetElement->Attribute("firstgid")); // source -      image TiXmlElement *image; image = tilesetElement->FirstChildElement("image"); std::string imagepath = image->Attribute("source"); //    sf::Image img; if(!img.loadFromFile(imagepath)) { std::cout << "Failed to load tile sheet." << std::endl; return false; } //     (109, 159, 185) // -       ,     ,  16-  //  "6d9fb9"    img.createMaskFromColor(sf::Color(109, 159, 185)); //     tilesetImage.loadFromImage(img); //   tilesetImage.setSmooth(false); //       int columns = tilesetImage.getSize().x / tileWidth; int rows = tilesetImage.getSize().y / tileHeight; //     (TextureRect) std::vector<sf::Rect<int>> subRects; for(int y = 0; y < rows; y++) for(int x = 0; x < columns; x++) { sf::Rect<int> rect; rect.top = y * tileHeight; rect.height = tileHeight; rect.left = x * tileWidth; rect.width = tileWidth; subRects.push_back(rect); } //    TiXmlElement *layerElement; layerElement = map->FirstChildElement("layer"); while(layerElement) { Layer layer; //   opacity,    ,     if (layerElement->Attribute("opacity") != NULL) { float opacity = strtod(layerElement->Attribute("opacity"), NULL); layer.opacity = 255 * opacity; } else { layer.opacity = 255; } //  <data> TiXmlElement *layerDataElement; layerDataElement = layerElement->FirstChildElement("data"); if(layerDataElement == NULL) { std::cout << "Bad map. No layer information found." << std::endl; } //  <tile> -     TiXmlElement *tileElement; tileElement = layerDataElement->FirstChildElement("tile"); if(tileElement == NULL) { std::cout << "Bad map. No tile information found." << std::endl; return false; } int x = 0; int y = 0; while(tileElement) { int tileGID = atoi(tileElement->Attribute("gid")); int subRectToUse = tileGID - firstTileID; //  TextureRect   if (subRectToUse >= 0) { sf::Sprite sprite; sprite.setTexture(tilesetImage); sprite.setTextureRect(subRects[subRectToUse]); sprite.setPosition(x * tileWidth, y * tileHeight); sprite.setColor(sf::Color(255, 255, 255, layer.opacity)); layer.tiles.push_back(sprite); } tileElement = tileElement->NextSiblingElement("tile"); x++; if (x >= width) { x = 0; y++; if(y >= height) y = 0; } } layers.push_back(layer); layerElement = layerElement->NextSiblingElement("layer"); } //    TiXmlElement *objectGroupElement; //     if (map->FirstChildElement("objectgroup") != NULL) { objectGroupElement = map->FirstChildElement("objectgroup"); while (objectGroupElement) { //  <object> TiXmlElement *objectElement; objectElement = objectGroupElement->FirstChildElement("object"); while(objectElement) { //    - , , , etc std::string objectType; if (objectElement->Attribute("type") != NULL) { objectType = objectElement->Attribute("type"); } std::string objectName; if (objectElement->Attribute("name") != NULL) { objectName = objectElement->Attribute("name"); } int x = atoi(objectElement->Attribute("x")); int y = atoi(objectElement->Attribute("y")); int width, height; sf::Sprite sprite; sprite.setTexture(tilesetImage); sprite.setTextureRect(sf::Rect<int>(0,0,0,0)); sprite.setPosition(x, y); if (objectElement->Attribute("width") != NULL) { width = atoi(objectElement->Attribute("width")); height = atoi(objectElement->Attribute("height")); } else { width = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].width; height = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].height; sprite.setTextureRect(subRects[atoi(objectElement->Attribute("gid")) - firstTileID]); } //   Object object; object.name = objectName; object.type = objectType; object.sprite = sprite; sf::Rect <int> objectRect; objectRect.top = y; objectRect.left = x; objectRect.height = height; objectRect.width = width; object.rect = objectRect; // ""  TiXmlElement *properties; properties = objectElement->FirstChildElement("properties"); if (properties != NULL) { TiXmlElement *prop; prop = properties->FirstChildElement("property"); if (prop != NULL) { while(prop) { std::string propertyName = prop->Attribute("name"); std::string propertyValue = prop->Attribute("value"); object.properties[propertyName] = propertyValue; prop = prop->NextSiblingElement("property"); } } } //     objects.push_back(object); objectElement = objectElement->NextSiblingElement("object"); } objectGroupElement = objectGroupElement->NextSiblingElement("objectgroup"); } } else { std::cout << "No object layers found..." << std::endl; } return true; } 



рдЕрдиреНрдп рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдп:

 Object Level::GetObject(std::string name) { //       for (int i = 0; i < objects.size(); i++) if (objects[i].name == name) return objects[i]; } std::vector<Object> Level::GetObjects(std::string name) { //      std::vector<Object> vec; for(int i = 0; i < objects.size(); i++) if(objects[i].name == name) vec.push_back(objects[i]); return vec; } sf::Vector2i Level::GetTileSize() { return sf::Vector2i(tileWidth, tileHeight); } void Level::Draw(sf::RenderWindow &window) { //    (  !) for(int layer = 0; layer < layers.size(); layer++) for(int tile = 0; tile < layers[layer].tiles.size(); tile++) window.draw(layers[layer].tiles[tile]); } 


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

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


All Articles