From d0fca7e02b56a88d26a40d96e8e4842c8c29a2fd Mon Sep 17 00:00:00 2001 From: victorfisac Date: Mon, 21 Nov 2016 20:31:07 +0100 Subject: [PATCH] Removed old Physac examples --- examples/physics_basic_rigidbody.c | 135 ------------------- examples/physics_basic_rigidbody.png | Bin 15294 -> 0 bytes examples/physics_forces.c | 193 --------------------------- examples/physics_forces.png | Bin 17935 -> 0 bytes 4 files changed, 328 deletions(-) delete mode 100644 examples/physics_basic_rigidbody.c delete mode 100644 examples/physics_basic_rigidbody.png delete mode 100644 examples/physics_forces.c delete mode 100644 examples/physics_forces.png diff --git a/examples/physics_basic_rigidbody.c b/examples/physics_basic_rigidbody.c deleted file mode 100644 index 87316a981..000000000 --- a/examples/physics_basic_rigidbody.c +++ /dev/null @@ -1,135 +0,0 @@ -/******************************************************************************************* -* -* raylib [physac] example - Basic rigidbody -* -* This example has been created using raylib 1.5 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* NOTE: -* Physac requires multi-threading, when InitPhysics() a second thread is created to manage -* physics calculations. To accomplish that, physac uses pthread Win32 library that can be -* found inside raylib/src/external/pthread directory. -* -* Add pthread library when compiling physac example: -* gcc -o $(NAME_PART).exe $(FILE_NAME) $(RAYLIB_DIR)\raylib_icon -L../src/external/pthread/lib \ -* -I../src -I../src/external/pthread/include -lraylib -lglfw3 -lopengl32 -lgdi32 -lpthreadGC2 -std=c99 -Wall -* -* Note that pthreadGC2.dll must be also copied to project directory! -* -* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -#define PHYSAC_IMPLEMENTATION -#include "physac.h" - -#define MOVE_VELOCITY 5 -#define JUMP_VELOCITY 30 - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [physac] example - basic rigidbody"); - InitPhysics((Vector2){ 0.0f, -9.81f/2 }); // Initialize physics module - - // Debug variables - bool isDebug = false; - - // Create rectangle physic object - PhysicBody rectangle = CreatePhysicBody((Vector2){ screenWidth*0.25f, screenHeight/2 }, 0.0f, (Vector2){ 75, 50 }); - rectangle->rigidbody.enabled = true; // Enable physic object rigidbody behaviour - rectangle->rigidbody.applyGravity = true; - rectangle->rigidbody.friction = 0.1f; - rectangle->rigidbody.bounciness = 6.0f; - - // Create square physic object - PhysicBody square = CreatePhysicBody((Vector2){ screenWidth*0.75f, screenHeight/2 }, 0.0f, (Vector2){ 50, 50 }); - square->rigidbody.enabled = true; // Enable physic object rigidbody behaviour - square->rigidbody.applyGravity = true; - square->rigidbody.friction = 0.1f; - - // Create walls physic objects - PhysicBody floor = CreatePhysicBody((Vector2){ screenWidth/2, screenHeight*0.95f }, 0.0f, (Vector2){ screenWidth*0.9f, 100 }); - PhysicBody leftWall = CreatePhysicBody((Vector2){ 0.0f, screenHeight/2 }, 0.0f, (Vector2){ screenWidth*0.1f, screenHeight }); - PhysicBody rightWall = CreatePhysicBody((Vector2){ screenWidth, screenHeight/2 }, 0.0f, (Vector2){ screenWidth*0.1f, screenHeight }); - PhysicBody roof = CreatePhysicBody((Vector2){ screenWidth/2, screenHeight*0.05f }, 0.0f, (Vector2){ screenWidth*0.9f, 100 }); - - // Create pplatform physic object - PhysicBody platform = CreatePhysicBody((Vector2){ screenWidth/2, screenHeight*0.7f }, 0.0f, (Vector2){ screenWidth*0.25f, 20 }); - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - // Check rectangle movement inputs - if (IsKeyPressed('W')) rectangle->rigidbody.velocity.y = JUMP_VELOCITY; - if (IsKeyDown('A')) rectangle->rigidbody.velocity.x = -MOVE_VELOCITY; - else if (IsKeyDown('D')) rectangle->rigidbody.velocity.x = MOVE_VELOCITY; - - // Check square movement inputs - if (IsKeyDown(KEY_UP) && square->rigidbody.isGrounded) square->rigidbody.velocity.y = JUMP_VELOCITY; - if (IsKeyDown(KEY_LEFT)) square->rigidbody.velocity.x = -MOVE_VELOCITY; - else if (IsKeyDown(KEY_RIGHT)) square->rigidbody.velocity.x = MOVE_VELOCITY; - - // Check debug switch input - if (IsKeyPressed('P')) isDebug = !isDebug; - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - // Draw floor, roof and walls rectangles - DrawRectangleRec(TransformToRectangle(floor->transform), DARKGRAY); // Convert transform values to rectangle data type variable - DrawRectangleRec(TransformToRectangle(leftWall->transform), DARKGRAY); - DrawRectangleRec(TransformToRectangle(rightWall->transform), DARKGRAY); - DrawRectangleRec(TransformToRectangle(roof->transform), DARKGRAY); - - // Draw middle platform rectangle - DrawRectangleRec(TransformToRectangle(platform->transform), DARKGRAY); - - // Draw physic objects - DrawRectangleRec(TransformToRectangle(rectangle->transform), RED); - DrawRectangleRec(TransformToRectangle(square->transform), BLUE); - - // Draw collider lines if debug is enabled - if (isDebug) - { - DrawRectangleLines(floor->collider.bounds.x, floor->collider.bounds.y, floor->collider.bounds.width, floor->collider.bounds.height, GREEN); - DrawRectangleLines(leftWall->collider.bounds.x, leftWall->collider.bounds.y, leftWall->collider.bounds.width, leftWall->collider.bounds.height, GREEN); - DrawRectangleLines(rightWall->collider.bounds.x, rightWall->collider.bounds.y, rightWall->collider.bounds.width, rightWall->collider.bounds.height, GREEN); - DrawRectangleLines(roof->collider.bounds.x, roof->collider.bounds.y, roof->collider.bounds.width, roof->collider.bounds.height, GREEN); - DrawRectangleLines(platform->collider.bounds.x, platform->collider.bounds.y, platform->collider.bounds.width, platform->collider.bounds.height, GREEN); - DrawRectangleLines(rectangle->collider.bounds.x, rectangle->collider.bounds.y, rectangle->collider.bounds.width, rectangle->collider.bounds.height, GREEN); - DrawRectangleLines(square->collider.bounds.x, square->collider.bounds.y, square->collider.bounds.width, square->collider.bounds.height, GREEN); - } - - // Draw help message - DrawText("Use WASD to move rectangle and ARROWS to move square", screenWidth/2 - MeasureText("Use WASD to move rectangle and ARROWS to move square", 20)/2, screenHeight*0.075f, 20, LIGHTGRAY); - - DrawFPS(10, 10); - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - ClosePhysics(); // Unitialize physics (including all loaded objects) - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} \ No newline at end of file diff --git a/examples/physics_basic_rigidbody.png b/examples/physics_basic_rigidbody.png deleted file mode 100644 index 52f265acf9a73ee1fcc41cdcc545fa841ce59354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15294 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ1{4ubUVDOp!MfGc#WAEJE}4gelKR^Gp|3~5$djgf8r~-lCK7K8{f6I@~{0W*u`G* zoo`!(#?%tTYxi`0JdzEYoCXU)zBUjthD$8KM6k%v!m0 zd+iHF_qU%aO>)5!J#7pdA>~CF_Cga_nu3ZfV}-*i8wGcZH(l9!KkN8sho_Gh&XRM#&2?Cr#qIQIu0={k z8>UX*amP8c)*#^NgN#b2`vMXmw-;hBj)CQL2{*|5iPLU)%-yJ9(&YI5fnwPc=DV?1 zQ}W;J{GEU69p9|FMPW6( zruByp&A;}Pf9KO{2`iUngr4i0HhqGGT-H<7rB4kO*0`_zG~-T&2Ibq8g)&!jZc4+IiNQ(k9&YXqY-$VnOLp{^{PyfE&1$_Ka5n$S zteqhFILrMm}a=AJGfQvCKM8r zZdk3@bFIdNzpss2k2dr%tM1ul@=h6|kS5a<7 z*X@F;do}bvXKXc_98{dS)lF>r&KJri%zM+OhWz%FUAQ##htTX?PhbSRdMSJU$u#jL zyCz=|bcWk~(pWg&khN7< z+?fk)IJ9MO@O-lsSj?G?+>+P;an>%J6)z~P-hnbAUWB>7We#q_x3Sm`brE}t z2``4rV6Nra4~dPdI6Vo<@xTU7k~A(SfLmzT8fOqOU_t%K{2#c!EN<9TN7SNMgejh9$swND=f3k-Sk^ zpdu&(7|t7e@i-xZtvW(Kc2|jsCC=CokYu`e@nW;p8c?#D{0X~nfK>#+WJR!5OZ${P z>I6`iV>A>-LjhL2kEVsuv@n_$kedOcIbt+NjOK{Z9DzPSJX$V{mJ6fh!f3fLS}tH4 zlNc=>M@z@i(s8tO94#G3aOv2PYO)5nqQIc#fV=SWiyaC^EI-b_k>*{EIxr0yg5Lz0 zPplw+{Q>ON1X58sMzR2k`9j#SmM3lk30*K?AuMXEZZFRsoF8 z34)g;P%tMrBr=1};zVF>Y*qwUFTEX@)eCQqgzx6&U!eEZqxy8qZ$nbP)m3;6h=b{L@pP&E$ diff --git a/examples/physics_forces.c b/examples/physics_forces.c deleted file mode 100644 index e45cb44cc..000000000 --- a/examples/physics_forces.c +++ /dev/null @@ -1,193 +0,0 @@ -/******************************************************************************************* -* -* raylib [physac] example - Forces -* -* This example has been created using raylib 1.5 (www.raylib.com) -* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -* -* NOTE: -* Physac requires multi-threading, when InitPhysics() a second thread is created to manage -* physics calculations. To accomplish that, physac uses pthread Win32 library that can be -* found inside raylib/src/external/pthread directory. -* -* Add pthread library when compiling physac example: -* gcc -o $(NAME_PART).exe $(FILE_NAME) $(RAYLIB_DIR)\raylib_icon -L../src/external/pthread/lib \ -* -I../src -I../src/external/pthread/include -lraylib -lglfw3 -lopengl32 -lgdi32 -lpthreadGC2 -std=c99 -Wall -* -* Note that pthreadGC2.dll must be also copied to project directory! -* -* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5) -* -********************************************************************************************/ - -#include "raylib.h" - -#define PHYSAC_IMPLEMENTATION -#include "physac.h" - -#define FORCE_AMOUNT 5.0f -#define FORCE_RADIUS 150 -#define LINE_LENGTH 75 -#define TRIANGLE_LENGTH 12 - -int main() -{ - // Initialization - //-------------------------------------------------------------------------------------- - int screenWidth = 800; - int screenHeight = 450; - - InitWindow(screenWidth, screenHeight, "raylib [physac] example - forces"); - InitPhysics((Vector2){ 0.0f, -9.81f/2 }); // Initialize physics module - - // Global variables - Vector2 mousePosition; - bool isDebug = false; - - // Create rectangle physic objects - PhysicBody rectangles[3]; - for (int i = 0; i < 3; i++) - { - rectangles[i] = CreatePhysicBody((Vector2){ screenWidth/4*(i+1), (((i % 2) == 0) ? (screenHeight/3) : (screenHeight/1.5f)) }, 0.0f, (Vector2){ 50, 50 }); - rectangles[i]->rigidbody.enabled = true; // Enable physic object rigidbody behaviour - rectangles[i]->rigidbody.friction = 0.1f; - } - - // Create circles physic objects - // NOTE: when creating circle physic objects, transform.scale must be { 0, 0 } and object radius must be defined in collider.radius and use this value to draw the circle. - PhysicBody circles[3]; - for (int i = 0; i < 3; i++) - { - circles[i] = CreatePhysicBody((Vector2){ screenWidth/4*(i+1), (((i % 2) == 0) ? (screenHeight/1.5f) : (screenHeight/4)) }, 0.0f, (Vector2){ 0, 0 }); - circles[i]->rigidbody.enabled = true; // Enable physic object rigidbody behaviour - circles[i]->rigidbody.friction = 0.1f; - circles[i]->collider.type = COLLIDER_CIRCLE; - circles[i]->collider.radius = 25; - } - - // Create walls physic objects - PhysicBody leftWall = CreatePhysicBody((Vector2){ -25, screenHeight/2 }, 0.0f, (Vector2){ 50, screenHeight }); - PhysicBody rightWall = CreatePhysicBody((Vector2){ screenWidth + 25, screenHeight/2 }, 0.0f, (Vector2){ 50, screenHeight }); - PhysicBody topWall = CreatePhysicBody((Vector2){ screenWidth/2, -25 }, 0.0f, (Vector2){ screenWidth, 50 }); - PhysicBody bottomWall = CreatePhysicBody((Vector2){ screenWidth/2, screenHeight + 25 }, 0.0f, (Vector2){ screenWidth, 50 }); - - SetTargetFPS(60); - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - - // Update mouse position value - mousePosition = GetMousePosition(); - - // Check force input - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) ApplyForceAtPosition(mousePosition, FORCE_AMOUNT, FORCE_RADIUS); - - // Check reset input - if (IsKeyPressed('R')) - { - // Reset rectangle physic objects positions - for (int i = 0; i < 3; i++) - { - rectangles[i]->transform.position = (Vector2){ screenWidth/4*(i+1) - rectangles[i]->transform.scale.x/2, (((i % 2) == 0) ? (screenHeight/3) : (screenHeight/1.5f)) - rectangles[i]->transform.scale.y/2 }; - rectangles[i]->rigidbody.velocity =(Vector2){ 0.0f, 0.0f }; - } - - // Reset circles physic objects positions - for (int i = 0; i < 3; i++) - { - circles[i]->transform.position = (Vector2){ screenWidth/4*(i+1), (((i % 2) == 0) ? (screenHeight/1.5f) : (screenHeight/4)) }; - circles[i]->rigidbody.velocity =(Vector2){ 0.0f, 0.0f }; - } - } - - // Check debug switch input - if (IsKeyPressed('P')) isDebug = !isDebug; - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - - ClearBackground(RAYWHITE); - - // Draw rectangles - for (int i = 0; i < 3; i++) - { - // Convert transform values to rectangle data type variable - DrawRectangleRec(TransformToRectangle(rectangles[i]->transform), RED); - if (isDebug) DrawRectangleLines(rectangles[i]->collider.bounds.x, rectangles[i]->collider.bounds.y, rectangles[i]->collider.bounds.width, rectangles[i]->collider.bounds.height, GREEN); - - // Draw force radius - DrawCircleLines(mousePosition.x, mousePosition.y, FORCE_RADIUS, BLACK); - - // Draw direction lines - if (CheckCollisionPointCircle((Vector2){ rectangles[i]->transform.position.x + rectangles[i]->transform.scale.x/2, rectangles[i]->transform.position.y + rectangles[i]->transform.scale.y/2 }, mousePosition, FORCE_RADIUS)) - { - Vector2 direction = { rectangles[i]->transform.position.x + rectangles[i]->transform.scale.x/2 - mousePosition.x, rectangles[i]->transform.position.y + rectangles[i]->transform.scale.y/2 - mousePosition.y }; - float angle = atan2l(direction.y, direction.x); - - // Calculate arrow start and end positions - Vector2 startPosition = { rectangles[i]->transform.position.x + rectangles[i]->transform.scale.x/2, rectangles[i]->transform.position.y + rectangles[i]->transform.scale.y/2 }; - Vector2 endPosition = { rectangles[i]->transform.position.x + rectangles[i]->transform.scale.x/2 + (cos(angle)*LINE_LENGTH), rectangles[i]->transform.position.y + rectangles[i]->transform.scale.y/2 + (sin(angle)*LINE_LENGTH) }; - - // Draw arrow line - DrawLineV(startPosition, endPosition, BLACK); - - // Draw arrow triangle - DrawTriangleLines((Vector2){ endPosition.x - cos(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH, endPosition.y - sin(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH }, - (Vector2){ endPosition.x + cos(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH, endPosition.y + sin(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH }, - (Vector2){ endPosition.x + cos(angle)*LINE_LENGTH/TRIANGLE_LENGTH*2, endPosition.y + sin(angle)*LINE_LENGTH/TRIANGLE_LENGTH*2 }, BLACK); - } - } - - // Draw circles - for (int i = 0; i < 3; i++) - { - DrawCircleV(circles[i]->transform.position, circles[i]->collider.radius, BLUE); - if (isDebug) DrawCircleLines(circles[i]->transform.position.x, circles[i]->transform.position.y, circles[i]->collider.radius, GREEN); - - // Draw force radius - DrawCircleLines(mousePosition.x, mousePosition.y, FORCE_RADIUS, BLACK); - - // Draw direction lines - if (CheckCollisionPointCircle((Vector2){ circles[i]->transform.position.x, circles[i]->transform.position.y }, mousePosition, FORCE_RADIUS)) - { - Vector2 direction = { circles[i]->transform.position.x - mousePosition.x, circles[i]->transform.position.y - mousePosition.y }; - float angle = atan2l(direction.y, direction.x); - - // Calculate arrow start and end positions - Vector2 startPosition = { circles[i]->transform.position.x, circles[i]->transform.position.y }; - Vector2 endPosition = { circles[i]->transform.position.x + (cos(angle)*LINE_LENGTH), circles[i]->transform.position.y + (sin(angle)*LINE_LENGTH) }; - - // Draw arrow line - DrawLineV(startPosition, endPosition, BLACK); - - // Draw arrow triangle - DrawTriangleLines((Vector2){ endPosition.x - cos(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH, endPosition.y - sin(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH }, - (Vector2){ endPosition.x + cos(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH, endPosition.y + sin(angle + 90*DEG2RAD)*LINE_LENGTH/TRIANGLE_LENGTH }, - (Vector2){ endPosition.x + cos(angle)*LINE_LENGTH/TRIANGLE_LENGTH*2, endPosition.y + sin(angle)*LINE_LENGTH/TRIANGLE_LENGTH*2 }, BLACK); - } - } - - // Draw help messages - DrawText("Use LEFT MOUSE BUTTON to apply a force", screenWidth/2 - MeasureText("Use LEFT MOUSE BUTTON to apply a force", 20)/2, screenHeight*0.075f, 20, LIGHTGRAY); - DrawText("Use R to reset objects position", screenWidth/2 - MeasureText("Use R to reset objects position", 20)/2, screenHeight*0.875f, 20, GRAY); - - DrawFPS(10, 10); - - EndDrawing(); - //---------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - ClosePhysics(); // Unitialize physics module - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -} \ No newline at end of file diff --git a/examples/physics_forces.png b/examples/physics_forces.png deleted file mode 100644 index 832bdbd9ecf79940c404362ba94916ac59f31022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17935 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 Q(F