рдореБрд░рдмреНрдмрд╛ рдПрд╕рдбреАрдХреЗ рдореЗрдВ 2 рдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛрд▓рд┐рдЬрд╝реЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛

рдореБрд░рдмреНрдмрд╛ рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореИрдВ рдореБрд░рдмреНрдмрд╛ рдПрд╕рдбреАрдХреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБ-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд░рдмреНрдмрд╛ рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИред рдЖрдк рдПрд▓рдЬреА рдЯреАрд╡реА рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ (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" рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ), рд╕рд╛рде рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде "рдбреЗрдЯрд╛" рдлрд╝реЛрд▓реНрдбрд░ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдм рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рдЫрд╡рд┐

рддреЛ, рд╣рдо 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(); /*      */ /*         */ /* b_revert -   . */ 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); } } 


рдареАрдХ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рд╣реИред рдЕрдм рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВред



рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝реНрд▓реЛрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдПрдХ рдореЛрдЯрд╛, рд▓реЗрдХрд┐рди рддреЗрдЬ, рдкреНрд░рд╛рдердорд┐рдХ рдЯрдХреНрдХрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЯрдХрд░рд╛рд╡реЛрдВ рдореЗрдВ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрдХрд░рд╛рд╡ рдХреЗ рджреМрд░рд╛рди рдЙрдЫрд▓реЗрдВ) рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред

рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛, рдЯрд┐рдкреНрдкрдгреА, рдкрд░рд┐рд╡рд░реНрдзрди рдФрд░ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд┐рдХрд▓рд╛ред рдЕрдЪреНрдЫреЗ рджреГрд╢реНрдп рдлреНрд▓реИрд╢ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рдеред

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


All Articles