physac modules is being redesigned. Physics base behaviour is done and it is composed by three steps: apply physics, resolve collisions and fix overlapping. A basic example is currently in progress. The next steps are try to add torque and unoriented physic collisions and implement physics basic functions to add forces. Rigidbody grounding state is automatically calculated and has a perfect result. Rigidbodies interacts well with each others. To achieve physics accuracy, UpdatePhysics() is called a number of times per frame. In a future, it should be changed to another thread and call it without any target frame restriction. Basic physics example has been redone (not finished) using the new module functions. Forces examples will be redone so I removed it from branch.
127 lines
No EOL
6.2 KiB
C
127 lines
No EOL
6.2 KiB
C
/*******************************************************************************************
|
|
*
|
|
* 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)
|
|
*
|
|
* Copyright (c) 2016 Victor Fisac and Ramon Santamaria (@raysan5)
|
|
*
|
|
********************************************************************************************/
|
|
|
|
#include "raylib.h"
|
|
|
|
#define MOVE_VELOCITY 5
|
|
#define JUMP_VELOCITY 35
|
|
|
|
int main()
|
|
{
|
|
// Initialization
|
|
//--------------------------------------------------------------------------------------
|
|
int screenWidth = 800;
|
|
int screenHeight = 450;
|
|
|
|
InitWindow(screenWidth, screenHeight, "raylib [physac] example - basic rigidbody");
|
|
InitPhysics(); // Initialize physics module
|
|
|
|
SetTargetFPS(60);
|
|
|
|
// Debug variables
|
|
bool isDebug = false;
|
|
|
|
// Player physic object
|
|
PhysicObject *player = CreatePhysicObject((Vector2){ screenWidth*0.25f, screenHeight/2 }, 0.0f, (Vector2){ 50, 50 });
|
|
player->rigidbody.enabled = true; // Enable physic object rigidbody behaviour
|
|
player->rigidbody.applyGravity = true;
|
|
player->rigidbody.friction = 0.3f;
|
|
player->collider.enabled = true; // Enable physic object collisions detection
|
|
|
|
// Player physic object
|
|
PhysicObject *player2 = CreatePhysicObject((Vector2){ screenWidth*0.75f, screenHeight/2 }, 0.0f, (Vector2){ 50, 50 });
|
|
player2->rigidbody.enabled = true;
|
|
player2->rigidbody.applyGravity = true;
|
|
player2->rigidbody.friction = 0.1f;
|
|
player2->collider.enabled = true;
|
|
|
|
// Floor physic object
|
|
PhysicObject *floor = CreatePhysicObject((Vector2){ screenWidth/2, screenHeight*0.95f }, 0.0f, (Vector2){ screenWidth*0.9f, 100 });
|
|
floor->collider.enabled = true; // Enable just physic object collisions detection
|
|
|
|
// Left wall physic object
|
|
PhysicObject *leftWall = CreatePhysicObject((Vector2){ 0.0f, screenHeight/2 }, 0.0f, (Vector2){ screenWidth*0.1f, screenHeight });
|
|
leftWall->collider.enabled = true;
|
|
|
|
// Right wall physic object
|
|
PhysicObject *rightWall = CreatePhysicObject((Vector2){ screenWidth, screenHeight/2 }, 0.0f, (Vector2){ screenWidth*0.1f, screenHeight });
|
|
rightWall->collider.enabled = true;
|
|
|
|
// Platform physic objectdd
|
|
PhysicObject *platform = CreatePhysicObject((Vector2){ screenWidth/2, screenHeight*0.7f }, 0.0f, (Vector2){ screenWidth*0.25f, 20 });
|
|
platform->collider.enabled = true;
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
// Main game loop
|
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
{
|
|
// Update
|
|
//----------------------------------------------------------------------------------
|
|
UpdatePhysics(); // Update all created physic objects
|
|
|
|
// Check debug switch input
|
|
if (IsKeyPressed('P')) isDebug = !isDebug;
|
|
|
|
// Check player movement inputs
|
|
if (IsKeyDown('W') && player->rigidbody.isGrounded) player->rigidbody.velocity.y = JUMP_VELOCITY;
|
|
|
|
if (IsKeyDown('A')) player->rigidbody.velocity.x = -MOVE_VELOCITY;
|
|
else if (IsKeyDown('D')) player->rigidbody.velocity.x = MOVE_VELOCITY;
|
|
|
|
// Check player 2 movement inputs
|
|
if (IsKeyDown(KEY_UP) && player2->rigidbody.isGrounded) player2->rigidbody.velocity.y = JUMP_VELOCITY;
|
|
|
|
if (IsKeyDown(KEY_LEFT)) player2->rigidbody.velocity.x = -MOVE_VELOCITY;
|
|
else if (IsKeyDown(KEY_RIGHT)) player2->rigidbody.velocity.x = MOVE_VELOCITY;
|
|
//----------------------------------------------------------------------------------
|
|
|
|
// Draw
|
|
//----------------------------------------------------------------------------------
|
|
BeginDrawing();
|
|
|
|
ClearBackground(RAYWHITE);
|
|
|
|
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(platform->collider.bounds.x, platform->collider.bounds.y, platform->collider.bounds.width, platform->collider.bounds.height, GREEN);
|
|
DrawRectangleLines(player->collider.bounds.x, player->collider.bounds.y, player->collider.bounds.width, player->collider.bounds.height, GREEN);
|
|
DrawRectangleLines(player2->collider.bounds.x, player2->collider.bounds.y, player2->collider.bounds.width, player2->collider.bounds.height, GREEN);
|
|
}
|
|
else
|
|
{
|
|
// Convert transform values to rectangle data type variable
|
|
DrawRectangleRec(TransformToRectangle(floor->transform), DARKGRAY);
|
|
DrawRectangleRec(TransformToRectangle(leftWall->transform), DARKGRAY);
|
|
DrawRectangleRec(TransformToRectangle(rightWall->transform), DARKGRAY);
|
|
DrawRectangleRec(TransformToRectangle(platform->transform), DARKGRAY);
|
|
DrawRectangleRec(TransformToRectangle(player->transform), RED);
|
|
DrawRectangleRec(TransformToRectangle(player2->transform), BLUE);
|
|
}
|
|
|
|
// Draw all physic object information in specific screen position and font size
|
|
// DrawPhysicObjectInfo(player, (Vector2){ 10.0f, 10.0f }, 10);
|
|
|
|
EndDrawing();
|
|
//----------------------------------------------------------------------------------
|
|
}
|
|
|
|
// De-Initialization
|
|
//--------------------------------------------------------------------------------------
|
|
ClosePhysics(); // Unitialize physics module
|
|
CloseWindow(); // Close window and OpenGL context
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
return 0;
|
|
} |