Exemple #1
0
        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);
        }
Exemple #2
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);
    }
Exemple #3
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);
    }