
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореИрдВ рдореБрд░рдмреНрдмрд╛ рдПрд╕рдбреАрдХреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБ-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд░рдмреНрдмрд╛ рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИред рдЖрдк рдПрд▓рдЬреА рдЯреАрд╡реА рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ (Android, Bada, iOS, рд╕рд┐рдореНрдмрд┐рдпрди рдФрд░ WindowsMobile рдкрд░ рдЖрдзрд╛рд░рд┐рдд) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдк рдкрд╛рдПрдВрдЧреЗ:
- рдореБрд░рдмреНрдмрд╛ рдПрд╕рдбреАрдХреЗ рдХреЗ рддрд╣рдд рдПрдХ рдЖрд╡реЗрджрди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛;
- рдкреНрд░рдХреНрд╖реЗрдкрдг рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрддрд▓ рдмрд╣реБрднреБрдЬ рдХрд╛ рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛
- рдЯрдХрд░рд╛рд╡ (рдиреНрдпреВрдирддрдо рдкрде рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ) рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдгред
рдереЛрдбрд╛ рдкреВрд░реНрд╡рдЬрдиреНрдоред рдПрдХ рдмрд╛рд░, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдФрд░ рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛ рдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдЦреЗрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЯрдХрд░рд╛рд╡ рдФрд░ рдЪреМрд░рд╛рд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдвреВрдВрдврдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рдеред рдореБрдЭреЗ рдЦреБрдж рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред
рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЗрдЦ рдХрд╛ рд╕рднреА рдХреЛрдб C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдЗрдЯ рдкрд░, рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рд╡рд░реНрдгрди рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдФрд░ рдХрд╛рдлреА рддреЗрдЬ рд╣реИред рд╕рдВрднрд╡рддрдГ рдЗрд╕рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЙрддреНрддрд▓ рдмрд╣реБрднреБрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдЕрд╡рддрд▓ рдмрд╣реБрднреБрдЬ рдХреЛ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдЙрддреНрддрд▓ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ, рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдореБрд░рдмреНрдмрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
рдореБрд░рдмреНрдмрд╛ рдореЗрдВ, рдпрд╣ рд╕рдм mkb рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓
test2d.mkb рдФрд░
рд╕реНрд░реЛрдд рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБред Mkb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦреЗрдВ:
#!/usr/bin/env mkb
files {
[Source]
(source)
main.cpp
entity.cpp
entity.h
}
subprojects {
iw2d
}
рдЯреИрдЧ "рдлрд╛рдЗрд▓реЛрдВ" рдореЗрдВ рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рддреАрди рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА рдЬреЛ рд╕реНрд░реЛрдд рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВ (рдХреЛрд╖реНрдардХреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ)ред "рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕" рдЯреИрдЧ рдореЗрдВ, рд╣рдо рдЙрди рдореБрд░рдмреНрдмрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред
"рд╕реНрд░реЛрдд" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рддреАрди рдЦрд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ (main.cpp, unit.cpp рдФрд░ unit.h) рдмрдирд╛рдПрдВ, рдФрд░ рдлрд┐рд░ test2d.mkb рдЪрд▓рд╛рдПрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрд░рдмреНрдмрд╛ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП "build_test2d_vc10" рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ), рд╕рд╛рде рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде "рдбреЗрдЯрд╛" рдлрд╝реЛрд▓реНрдбрд░ред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдм рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рдордВрдЪ рдкрд░ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ;
- рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдирд┐рдпрдВрддреНрд░рдг рдХреАрдмреЛрд░реНрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рддреАрд░ - рдЖрдВрджреЛрд▓рди, 1 рдФрд░ 2 - рд░реЛрдЯреЗрд╢рди);
- рд╣рдо рджреГрд╢реНрдп рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд╕реНрддреБ рдХреЗ рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЯрдХрд░рд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рд╣рдо main.cpp рдлрд╝рд╛рдЗрд▓ рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрд░рдВрдн рдХрд░реЗрдВрдЧреЗ, рдЖрд╡рд╢реНрдпрдХ рдЖрдХреГрддрд┐рдпреЛрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдмрдирд╛рдПрдВрдЧреЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рдЪрдХреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдбреЗрдЯрд╛ рдХреА рд╕рдлрд╛рдИ рднреА рдХрд░реЗрдВрдЧреЗред
#include "iw2d.h" #include "iwArray.h" #include "entity.h" #include "s3eKeyboard.h" #include "s3eDevice.h" #include <time.h> #include <s3e.h> #define FPS 30 #define MOVE_SPEED 100 #define OBJECT_DIMENSION 50 /***************************************************************/ int main(int argc, char* argv[]) { s3eResult result = S3E_RESULT_SUCCESS; /* 2D */ Iw2DInit(); /* */ uint32 width = Iw2DGetSurfaceWidth(); uint32 height = Iw2DGetSurfaceHeight(); /* "" */ int wall_size = MAX(width, height); /* */ CIwArray<CEntity*> arr_objects; /* 3 */ /* */ CIwSVec2 m_Verts1[5]; CIwSVec2 m_Verts2[4]; CIwSVec2 m_Verts3[4]; /* 1 */ m_Verts1[0] = CIwVec2(-OBJECT_DIMENSION, -OBJECT_DIMENSION); m_Verts1[1] = CIwVec2(OBJECT_DIMENSION, -OBJECT_DIMENSION); m_Verts1[2] = CIwVec2(OBJECT_DIMENSION, 0); m_Verts1[3] = CIwVec2(0, OBJECT_DIMENSION); m_Verts1[4] = CIwVec2(-OBJECT_DIMENSION, OBJECT_DIMENSION); /* 2 */ m_Verts2[0] = CIwVec2(-OBJECT_DIMENSION/2, OBJECT_DIMENSION + OBJECT_DIMENSION/2); m_Verts2[1] = CIwVec2(OBJECT_DIMENSION/2, OBJECT_DIMENSION/2); m_Verts2[2] = CIwVec2(OBJECT_DIMENSION/2, -OBJECT_DIMENSION/2); m_Verts2[3] = CIwVec2(-OBJECT_DIMENSION/2, -OBJECT_DIMENSION/2); /* 3: */ m_Verts3[0] = CIwVec2(-5, wall_size/2); m_Verts3[1] = CIwVec2(5, wall_size/2); m_Verts3[2] = CIwVec2(5, -wall_size/2); m_Verts3[3] = CIwVec2(-5, -wall_size/2); /* , */ /* , */ CEntity *main_object = new CEntity(CIwSVec2(width/2, height/2), &m_Verts2[0], 4, 0xFFff0000); arr_objects.append(main_object); /* , . */ CEntity *tmp_object = new CEntity(CIwSVec2(width/2, height/2), &m_Verts1[0], 5, 0xFF0000ff); tmp_object->SetAngle(IW_ANGLE_PI/3); arr_objects.append(tmp_object); tmp_object = new CEntity(CIwSVec2(50, 50), &m_Verts1[0], 5, 0xFF0000ff); tmp_object->SetAngle(IW_ANGLE_PI/2); arr_objects.append(tmp_object); /* 4 "" */ tmp_object = new CEntity(CIwSVec2(0, height/2), &m_Verts3[0], 4, 0xFFff0000); arr_objects.append(tmp_object); tmp_object = new CEntity(CIwSVec2(width, height/2), &m_Verts3[0], 4, 0xFFff0000); arr_objects.append(tmp_object); tmp_object = new CEntity(CIwSVec2(width/2, 0), &m_Verts3[0], 4, 0xFFff0000); tmp_object->SetAngle(IW_ANGLE_PI/2); arr_objects.append(tmp_object); tmp_object = new CEntity(CIwSVec2(width/2, height), &m_Verts3[0], 4, 0xFFff0000); tmp_object->SetAngle(IW_ANGLE_PI/2); arr_objects.append(tmp_object); /* */ int time_between_frames = 1000/FPS; /* */ uint32 timer = (uint32)s3eTimerGetMs(); while(result == S3E_RESULT_SUCCESS) { /* */ s3eKeyboardUpdate(); /* . . */ if (s3eDeviceCheckQuitRequest()) break; /* . */ uint32 now_time = (uint32)s3eTimerGetMs(); int delta = now_time - timer; if (delta < 0) delta = 0; /* */ main_object->Move(CIwSVec2::g_Zero); main_object->Rotate(0); /* */ if ( (s3eKeyboardGetState(s3eKeyLeft) & S3E_KEY_STATE_DOWN) ) { main_object->Move(CIwSVec2(-MOVE_SPEED, 0)); } else if ( (s3eKeyboardGetState(s3eKeyRight) & S3E_KEY_STATE_DOWN) ) { main_object->Move(CIwSVec2(MOVE_SPEED, 0)); } else if ( (s3eKeyboardGetState(s3eKeyUp) & S3E_KEY_STATE_DOWN) ) { main_object->Move(CIwSVec2(0, -MOVE_SPEED)); } else if ( (s3eKeyboardGetState(s3eKeyDown) & S3E_KEY_STATE_DOWN) ) { main_object->Move(CIwSVec2(0, MOVE_SPEED)); } if ( (s3eKeyboardGetState(s3eKey1) & S3E_KEY_STATE_DOWN) ) { main_object->Rotate(-IW_ANGLE_PI / 2); } else if ( (s3eKeyboardGetState(s3eKey2) & S3E_KEY_STATE_DOWN) ) { main_object->Rotate(IW_ANGLE_PI / 2); } /* */ Iw2DSurfaceClear(0xffffffff); /* */ for(int i=0; i < (int)arr_objects.size(); ++i) { arr_objects[i]->Update(delta); } /* (). . */ main_object->SetColour(0xff00ff00); /* , . */ int try_count = 10; bool b_collide; do{ b_collide = false; /* */ for(int i = 0; i < (int)arr_objects.size(); ++i) { /* */ if(arr_objects[i] != main_object){ /* . vec_reaction , . */ CIwVec2 vec_reaction = main_object->CollideRect(arr_objects[i], true); if(!vec_reaction.IsZero()){ main_object->SetColour(0xff000000); b_collide = true; } } } --try_count; /* , "" , . */ } while(b_collide && try_count > 0); /* */ for(int i=0; i < (int)arr_objects.size(); ++i) { arr_objects[i]->Render(); } /* */ Iw2DSurfaceShow(); /* . */ int32 wait_time = (uint32)time_between_frames - ((uint32)s3eTimerGetMs() - now_time); if(wait_time<0)wait_time = 0; timer = now_time; s3eDeviceYield(wait_time); } /* */ for(int i=0; i < (int)arr_objects.size(); ++i) { delete arr_objects[i]; } /* */ arr_objects.clear_optimised(); /* 2d . */ Iw2DTerminate(); return 0; }
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрдм рдЖрдЗрдП рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдВрдЧреА:
- рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЖрдХрд╛рд░ рдФрд░ рд░рдВрдЧ рд╣реИ;
- рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд┐рддрд┐ (рдЪрд╛рд▓) рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдШреБрдорд╛ рд╕рдХрддрд╛ рд╣реИ;
- рдПрдХ рд╡рд╕реНрддреБ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреА рд╣реИ;
- рд╡рд╕реНрддреБ рд╣реА рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ;
рдЖрдЗрдП рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд░реНрдЧ (рдЗрдХрд╛рдИ.рд╣ рдлрд╝рд╛рдЗрд▓) рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╕реНрддреБ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
#pragma once #include "iw2d.h" #include "iwArray.h" #include "IwMath.h" class CEntity{ private: CIwMat2D m_MatLocal; iwangle angle; iwangle angle_velocity; CIwSVec2 m_MoveVelocity; uint32 m_NumPoints; CIwSVec2 *m_Points; CIwVec2 *m_PointsMod; CIwVec2 *m_Axis; uint32 colour; public: CEntity(CIwSVec2 position, CIwSVec2 *verts, int num_verts, uint32 colour = 0xff000000); virtual ~CEntity(); void Update(int speed); void Render(); void SetAngle(iwangle angle) {this->angle = angle % IW_ANGLE_PI;}; void Rotate(iwangle rot_angle) { angle_velocity = rot_angle; } void Move(CIwSVec2 move_velocity) { m_MoveVelocity = move_velocity; } void SetColour(int colour){this->colour = colour;} const CIwVec2 *GetVerts(){ return m_PointsMod; } int GetNumVerts() {return m_NumPoints;} CIwVec2 CollideRect(CEntity *other, bool b_uncollide = false); private: void UpdateVerts(); bool TestOverlaps(CEntity *other, CIwVec2 &min_axis, int &min_t, int b_revert); void GetInterval(const CIwVec2 *verts, int count, CIwVec2 axis, int &min, int &max); };
рдЖрдЗрдП рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВред рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
CollideRect рдФрд░
TestOverlaps ред
#include "entity.h" CEntity::CEntity(CIwSVec2 position, CIwSVec2 *verts, int num_verts, uint32 colour ): m_MatLocal(CIwMat2D::g_Identity), m_MoveVelocity(CIwSVec2::g_Zero), angle(0), angle_velocity(0) { this->colour = colour; this->m_NumPoints = num_verts; m_Points = NULL; m_PointsMod = new CIwVec2[m_NumPoints]; m_Axis = new CIwVec2[num_verts]; m_MatLocal.t = position; m_Points = verts; } CEntity::~CEntity() { if(m_PointsMod)delete m_PointsMod; delete m_Axis; } void CEntity::Update(int speed) { angle += (angle_velocity * speed) / 1000; angle = angle % IW_ANGLE_2PI; m_MatLocal.SetRot(angle, false); if(!m_MoveVelocity.IsZero()) { m_MatLocal.t += ( m_MoveVelocity * speed) / 1000; } UpdateVerts(); } void CEntity::UpdateVerts() { if(!m_Points) return; for(uint32 i = 0; i < m_NumPoints; ++i) { m_PointsMod[i] = m_MatLocal.TransformVec(m_Points[i]); } /* */ for(uint32 i = 0; i < m_NumPoints; ++i) { /* */ m_Axis[i] = m_PointsMod[(i + 1) % m_NumPoints] - m_PointsMod[i]; /* */ m_Axis[i].Normalise(); /* */ m_Axis[i] = CIwVec2(-m_Axis[i].y, m_Axis[i].x); } } void CEntity::Render() { /* */ Iw2DSetColour(colour); if(!m_Points)return; /* */ Iw2DSetTransformMatrix(m_MatLocal); /* */ Iw2DFillPolygon(m_Points, m_NumPoints); /* */ Iw2DSetColour(0xff00ffff); Iw2DFillArc(CIwSVec2::g_Zero, CIwSVec2(5,5), 0, IW_ANGLE_2PI); } CIwVec2 CEntity::CollideRect(CEntity *other, bool b_uncollide) { /* , */ int min_t(0); CIwVec2 min_axis(CIwFVec2::g_Zero); /* , */ /* .. , */ /* , , . */ if(!TestOverlaps(other, min_axis, min_t, false))return CIwVec2::g_Zero; if(!other->TestOverlaps(this, min_axis, min_t, true))return CIwVec2::g_Zero; /* , */ if(b_uncollide){ CIwVec2 fvec = min_axis * min_t; /* */ m_MatLocal.t += fvec; /* . */ UpdateVerts(); } return min_axis * min_t; } bool CEntity::TestOverlaps(CEntity *other, CIwVec2 &min_axis, int &min_t, int b_revert) { /* , */ const CIwVec2 *other_corner = other->GetVerts(); int other_corner_count = other->GetNumVerts(); /* */ for (uint32 i = 0; i < m_NumPoints; ++i) { int aMin; int aMax; int bMin; int bMax; /* */ GetInterval(m_PointsMod, m_NumPoints, m_Axis[i], aMin, aMax); GetInterval(other_corner, other_corner_count, m_Axis[i], bMin, bMax); /* , */ if ((aMax <= bMin) || (bMax <= aMin)) { /* . */ return false; } /* . , , */ /* */ int t = 0; if(aMax >= bMin) { t = bMin - aMax ; if(min_axis.IsZero() || ABS(min_t) > ABS(t)){ min_t = t * (b_revert?-1:1); min_axis = m_Axis[i]; } } if(bMax >= aMin) { t = bMax - aMin; if(min_axis.IsZero() || ABS(min_t) > ABS(t)){ min_t = t * (b_revert?-1:1); min_axis = m_Axis[i]; } } } return true; } void CEntity::GetInterval(const CIwVec2 *verts, int count, CIwVec2 axis, int &min, int &max) { min = max = axis.Dot(verts[0]); for (int i = 1; i < count; i++) { int value = axis.Dot(verts[i]); min = MIN(min, value); max = MAX(max, value); } }
рдареАрдХ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рд╣реИред рдЕрдм рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВред
рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝реНрд▓реЛрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдПрдХ рдореЛрдЯрд╛, рд▓реЗрдХрд┐рди рддреЗрдЬ, рдкреНрд░рд╛рдердорд┐рдХ рдЯрдХреНрдХрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЯрдХрд░рд╛рд╡реЛрдВ рдореЗрдВ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрдХрд░рд╛рд╡ рдХреЗ рджреМрд░рд╛рди рдЙрдЫрд▓реЗрдВ) рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред
рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛, рдЯрд┐рдкреНрдкрдгреА, рдкрд░рд┐рд╡рд░реНрдзрди рдФрд░ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдПрдХ
рд╕рдВрд╕рд╛рдзрди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд┐рдХрд▓рд╛ред рдЕрдЪреНрдЫреЗ рджреГрд╢реНрдп рдлреНрд▓реИрд╢ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рдеред