public static int Main() { // Initialization //-------------------------------------------------------------------------------------- const int screenWidth = 800; const int screenHeight = 450; SetConfigFlags(ConfigFlag.FLAG_MSAA_4X_HINT); InitWindow(screenWidth, screenHeight, "Physac [raylib] - Physics movement"); // Physac logo drawing position int logoX = screenWidth - MeasureText("Physac", 30) - 10; int logoY = 15; // Initialize physics and default physics bodies InitPhysics(); // Create floor and walls rectangle physics body PhysicsBodyData floor = CreatePhysicsBodyRectangle(new Vector2(screenWidth / 2, screenHeight), screenWidth, 100, 10); PhysicsBodyData platformLeft = CreatePhysicsBodyRectangle(new Vector2(screenWidth * 0.25f, screenHeight * 0.6f), screenWidth * 0.25f, 10, 10); PhysicsBodyData platformRight = CreatePhysicsBodyRectangle(new Vector2(screenWidth * 0.75f, screenHeight * 0.6f), screenWidth * 0.25f, 10, 10); PhysicsBodyData wallLeft = CreatePhysicsBodyRectangle(new Vector2(-5, screenHeight / 2), 10, screenHeight, 10); PhysicsBodyData wallRight = CreatePhysicsBodyRectangle(new Vector2(screenWidth + 5, screenHeight / 2), 10, screenHeight, 10); // Disable dynamics to floor and walls physics bodies floor.enabled = false; platformLeft.enabled = false; platformRight.enabled = false; wallLeft.enabled = false; wallRight.enabled = false; // Create movement physics body PhysicsBodyData body = CreatePhysicsBodyRectangle(new Vector2(screenWidth / 2, screenHeight / 2), 50, 50, 1); body.freezeOrient = true; // Constrain body rotation to avoid little collision torque amounts SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- RunPhysicsStep(); if (IsKeyPressed(KEY_R)) // Reset physics input { // Reset movement physics body position, velocity and rotation body.position = new Vector2(screenWidth / 2, screenHeight / 2); body.velocity = new Vector2(0, 0); SetPhysicsBodyRotation(body, 0); } // Horizontal movement input if (IsKeyDown(KEY_RIGHT)) { body.velocity.x = VELOCITY; } else if (IsKeyDown(KEY_LEFT)) { body.velocity.x = -VELOCITY; } // Vertical movement input checking if player physics body is grounded if (IsKeyDown(KEY_UP) && body.isGrounded) { body.velocity.y = -VELOCITY * 4; } //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(BLACK); DrawFPS(screenWidth - 90, screenHeight - 30); // Draw created physics bodies int bodiesCount = GetPhysicsBodiesCount(); for (int i = 0; i < bodiesCount; i++) { var ibody = GetPhysicsBody(i); int vertexCount = GetPhysicsShapeVerticesCount(i); for (int j = 0; j < vertexCount; j++) { // Get physics bodies shape vertices to draw lines // Note: GetPhysicsShapeVertex() already calculates rotation transformations Vector2 vertexA = GetPhysicsShapeVertex(ibody, j); int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape Vector2 vertexB = GetPhysicsShapeVertex(ibody, jj); DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions } } DrawText("Use 'ARROWS' to move player", 10, 10, 10, WHITE); DrawText("Press 'R' to reset example", 10, 30, 10, WHITE); DrawText("Physac", logoX, logoY, 30, WHITE); DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- ClosePhysics(); // Unitialize physics CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return(0); }
/******************************************************************************************* * * Physac - Body shatter * * NOTE 1: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. * NOTE 2: Physac requires static C library linkage to avoid dependency on MinGW DLL (-static -lpthread) * * Use the following line to compile: * * gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib.rc.o -static -lraylib -lpthread * -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition * * Copyright (c) 2016-2018 Victor Fisac * ********************************************************************************************/ public static int Main() { // Initialization //-------------------------------------------------------------------------------------- int screenWidth = 800; int screenHeight = 450; SetConfigFlags(ConfigFlag.FLAG_MSAA_4X_HINT); InitWindow(screenWidth, screenHeight, "Physac [raylib] - Body shatter"); // Physac logo drawing position int logoX = screenWidth - MeasureText("Physac", 30) - 10; int logoY = 15; bool needsReset = false; // Initialize physics and default physics bodies InitPhysics(); SetPhysicsGravity(0, 0); // Create random polygon physics body to shatter CreatePhysicsBodyPolygon(new Vector2(screenWidth / 2, screenHeight / 2), GetRandomValue(80, 200), GetRandomValue(3, 8), 10); SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- RunPhysicsStep(); // Delay initialization of variables due to physics reset asynchronous if (needsReset) { // Create random polygon physics body to shatter CreatePhysicsBodyPolygon(new Vector2(screenWidth / 2, screenHeight / 2), GetRandomValue(80, 200), GetRandomValue(3, 8), 10); } if (IsKeyPressed(KeyboardKey.KEY_R)) // Reset physics input { ResetPhysics(); needsReset = true; } if (IsMouseButtonPressed(MouseButton.MOUSE_LEFT_BUTTON)) // Physics shatter input { // Note: some values need to be stored in variables due to asynchronous changes during main thread int count = GetPhysicsBodiesCount(); for (int i = count - 1; i >= 0; i--) { PhysicsBodyData currentBody = GetPhysicsBody(i); if (currentBody.id != 0) { PhysicsShatter(currentBody, GetMousePosition(), 10 / currentBody.inverseMass); } } } //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(BLACK); // Draw created physics bodies int bodiesCount = GetPhysicsBodiesCount(); for (int i = 0; i < bodiesCount; i++) { PhysicsBodyData currentBody = GetPhysicsBody(i); int vertexCount = GetPhysicsShapeVerticesCount(i); for (int j = 0; j < vertexCount; j++) { // Get physics bodies shape vertices to draw lines // Note: GetPhysicsShapeVertex() already calculates rotation transformations Vector2 vertexA = GetPhysicsShapeVertex(currentBody, j); int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape Vector2 vertexB = GetPhysicsShapeVertex(currentBody, jj); DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions } } DrawText("Left mouse button in polygon area to shatter body\nPress 'R' to reset example", 10, 10, 10, WHITE); DrawText("Physac", logoX, logoY, 30, WHITE); DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- ClosePhysics(); // Unitialize physics CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return(0); }
/******************************************************************************************* * * Physac - Physics restitution * * NOTE 1: Physac requires multi-threading, when InitPhysics() a second thread is created to manage physics calculations. * NOTE 2: Physac requires static C library linkage to avoid dependency on MinGW DLL (-static -lpthread) * * Use the following line to compile: * * gcc -o $(NAME_PART).exe $(FILE_NAME) -s $(RAYLIB_DIR)\raylib\raylib.rc.o -static -lraylib -lpthread * -lglfw3 -lopengl32 -lgdi32 -lopenal32 -lwinmm -std=c99 -Wl,--subsystem,windows -Wl,-allow-multiple-definition * * Copyright (c) 2016-2018 Victor Fisac * ********************************************************************************************/ public static int Main() { // Initialization //-------------------------------------------------------------------------------------- int screenWidth = 800; int screenHeight = 450; SetConfigFlags(ConfigFlag.FLAG_MSAA_4X_HINT); InitWindow(screenWidth, screenHeight, "Physac [raylib] - Physics restitution"); // Physac logo drawing position int logoX = screenWidth - MeasureText("Physac", 30) - 10; int logoY = 15; // Initialize physics and default physics bodies InitPhysics(); // Create floor rectangle physics body PhysicsBodyData floor = CreatePhysicsBodyRectangle(new Vector2(screenWidth / 2, screenHeight), screenWidth, 100, 10); floor.enabled = false; // Disable body state to convert it to static (no dynamics, but collisions) floor.restitution = 1; // Create circles physics body PhysicsBodyData circleA = CreatePhysicsBodyCircle(new Vector2(screenWidth * 0.25f, screenHeight / 2), 30, 10); circleA.restitution = 0; PhysicsBodyData circleB = CreatePhysicsBodyCircle(new Vector2(screenWidth * 0.5f, screenHeight / 2), 30, 10); circleB.restitution = 0.5f; PhysicsBodyData circleC = CreatePhysicsBodyCircle(new Vector2(screenWidth * 0.75f, screenHeight / 2), 30, 10); circleC.restitution = 1; SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- RunPhysicsStep(); if (IsKeyPressed(KeyboardKey.KEY_R)) // Reset physics input { // Reset circles physics bodies position and velocity circleA.position = new Vector2(screenWidth * 0.25f, screenHeight / 2); circleA.velocity = new Vector2(0, 0); circleB.position = new Vector2(screenWidth * 0.5f, screenHeight / 2); circleB.velocity = new Vector2(0, 0); circleC.position = new Vector2(screenWidth * 0.75f, screenHeight / 2); circleC.velocity = new Vector2(0, 0); } //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(BLACK); DrawFPS(screenWidth - 90, screenHeight - 30); // Draw created physics bodies int bodiesCount = GetPhysicsBodiesCount(); for (int i = 0; i < bodiesCount; i++) { PhysicsBodyData body = GetPhysicsBody(i); int vertexCount = GetPhysicsShapeVerticesCount(i); for (int j = 0; j < vertexCount; j++) { // Get physics bodies shape vertices to draw lines // Note: GetPhysicsShapeVertex() already calculates rotation transformations Vector2 vertexA = GetPhysicsShapeVertex(body, j); int jj = (((j + 1) < vertexCount) ? (j + 1) : 0); // Get next vertex or first to close the shape Vector2 vertexB = GetPhysicsShapeVertex(body, jj); DrawLineV(vertexA, vertexB, GREEN); // Draw a line between two vertex positions } } DrawText("Restitution amount", (screenWidth - MeasureText("Restitution amount", 30)) / 2, 75, 30, WHITE); DrawText("0", (int)circleA.position.x - MeasureText("0", 20) / 2, (int)circleA.position.y - 7, 20, WHITE); DrawText("0.5", (int)circleB.position.x - MeasureText("0.5", 20) / 2, (int)circleB.position.y - 7, 20, WHITE); DrawText("1", (int)circleC.position.x - MeasureText("1", 20) / 2, (int)circleC.position.y - 7, 20, WHITE); DrawText("Press 'R' to reset example", 10, 10, 10, WHITE); DrawText("Physac", logoX, logoY, 30, WHITE); DrawText("Powered by", logoX + 50, logoY - 7, 10, WHITE); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- ClosePhysics(); // Unitialize physics CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return(0); }