2015-12-21 23:12:35 +03:00
/*******************************************************************************************
*
2016-03-05 19:05:02 +03:00
* raylib [ physac ] example - Basic rigidbody
2015-12-21 23:12:35 +03:00
*
2016-03-05 19:05:02 +03:00
* This example has been created using raylib 1.5 ( www . raylib . com )
2015-12-21 23:12:35 +03:00
* raylib is licensed under an unmodified zlib / libpng license ( View raylib . h for details )
*
2016-08-15 17:18:04 +03:00
* 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 .
2016-06-14 21:31:48 +03:00
*
2016-08-15 17:18:04 +03:00
* 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 !
2016-06-14 21:31:48 +03:00
*
2016-02-13 19:09:53 +03:00
* Copyright ( c ) 2016 Victor Fisac and Ramon Santamaria ( @ raysan5 )
2015-12-21 23:12:35 +03:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "raylib.h"
2016-06-09 21:02:42 +03:00
# define PHYSAC_IMPLEMENTATION
# include "physac.h"
2016-03-05 19:05:02 +03:00
# define MOVE_VELOCITY 5
2016-03-16 14:46:12 +03:00
# define JUMP_VELOCITY 30
2015-12-21 23:12:35 +03:00
int main ( )
{
// Initialization
//--------------------------------------------------------------------------------------
int screenWidth = 800 ;
int screenHeight = 450 ;
2016-01-20 21:09:48 +03:00
2016-03-05 19:05:02 +03:00
InitWindow ( screenWidth , screenHeight , " raylib [physac] example - basic rigidbody " ) ;
2016-06-14 21:40:12 +03:00
InitPhysics ( ( Vector2 ) { 0.0f , - 9.81f / 2 } ) ; // Initialize physics module
2015-12-21 23:12:35 +03:00
2016-03-05 19:05:02 +03:00
// Debug variables
bool isDebug = false ;
2015-12-21 23:12:35 +03:00
2016-03-16 14:46:12 +03:00
// Create rectangle physic object
2016-06-09 21:02:42 +03:00
PhysicBody rectangle = CreatePhysicBody ( ( Vector2 ) { screenWidth * 0.25f , screenHeight / 2 } , 0.0f , ( Vector2 ) { 75 , 50 } ) ;
2016-03-16 14:46:12 +03:00
rectangle - > rigidbody . enabled = true ; // Enable physic object rigidbody behaviour
rectangle - > rigidbody . applyGravity = true ;
rectangle - > rigidbody . friction = 0.1f ;
rectangle - > rigidbody . bounciness = 6.0f ;
2016-01-20 21:09:48 +03:00
2016-03-16 14:46:12 +03:00
// Create square physic object
2016-06-09 21:02:42 +03:00
PhysicBody square = CreatePhysicBody ( ( Vector2 ) { screenWidth * 0.75f , screenHeight / 2 } , 0.0f , ( Vector2 ) { 50 , 50 } ) ;
2016-03-16 14:46:12 +03:00
square - > rigidbody . enabled = true ; // Enable physic object rigidbody behaviour
square - > rigidbody . applyGravity = true ;
square - > rigidbody . friction = 0.1f ;
2016-03-05 19:05:02 +03:00
2016-03-16 14:46:12 +03:00
// Create walls physic objects
2016-06-09 21:02:42 +03:00
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 } ) ;
2016-03-05 19:05:02 +03:00
2016-03-16 14:46:12 +03:00
// Create pplatform physic object
2016-06-09 21:02:42 +03:00
PhysicBody platform = CreatePhysicBody ( ( Vector2 ) { screenWidth / 2 , screenHeight * 0.7f } , 0.0f , ( Vector2 ) { screenWidth * 0.25f , 20 } ) ;
2016-02-13 19:09:53 +03:00
2016-06-09 21:02:42 +03:00
SetTargetFPS ( 60 ) ;
2015-12-21 23:12:35 +03:00
//--------------------------------------------------------------------------------------
// Main game loop
while ( ! WindowShouldClose ( ) ) // Detect window close button or ESC key
{
// Update
2016-06-14 21:38:49 +03:00
//----------------------------------------------------------------------------------
2016-03-16 14:46:12 +03:00
// Check rectangle movement inputs
2016-06-11 20:11:30 +03:00
if ( IsKeyPressed ( ' W ' ) ) rectangle - > rigidbody . velocity . y = JUMP_VELOCITY ;
2016-03-16 14:46:12 +03:00
if ( IsKeyDown ( ' A ' ) ) rectangle - > rigidbody . velocity . x = - MOVE_VELOCITY ;
else if ( IsKeyDown ( ' D ' ) ) rectangle - > rigidbody . velocity . x = MOVE_VELOCITY ;
2015-12-21 23:12:35 +03:00
2016-03-23 17:50:41 +03:00
// Check square movement inputs
2016-03-16 14:46:12 +03:00
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 ;
2015-12-21 23:12:35 +03:00
2016-03-16 14:46:12 +03:00
// Check debug switch input
if ( IsKeyPressed ( ' P ' ) ) isDebug = ! isDebug ;
2015-12-21 23:12:35 +03:00
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing ( ) ;
ClearBackground ( RAYWHITE ) ;
2016-03-16 14:46:12 +03:00
2016-03-23 17:50:41 +03:00
// Draw floor, roof and walls rectangles
DrawRectangleRec ( TransformToRectangle ( floor - > transform ) , DARKGRAY ) ; // Convert transform values to rectangle data type variable
2016-03-16 14:46:12 +03:00
DrawRectangleRec ( TransformToRectangle ( leftWall - > transform ) , DARKGRAY ) ;
DrawRectangleRec ( TransformToRectangle ( rightWall - > transform ) , DARKGRAY ) ;
DrawRectangleRec ( TransformToRectangle ( roof - > transform ) , DARKGRAY ) ;
2016-03-23 17:50:41 +03:00
// Draw middle platform rectangle
2016-03-16 14:46:12 +03:00
DrawRectangleRec ( TransformToRectangle ( platform - > transform ) , DARKGRAY ) ;
2016-03-23 17:50:41 +03:00
// Draw physic objects
2016-03-16 14:46:12 +03:00
DrawRectangleRec ( TransformToRectangle ( rectangle - > transform ) , RED ) ;
DrawRectangleRec ( TransformToRectangle ( square - > transform ) , BLUE ) ;
2015-12-21 23:12:35 +03:00
2016-03-23 17:50:41 +03:00
// Draw collider lines if debug is enabled
2016-03-05 19:05:02 +03:00
if ( isDebug )
2015-12-21 23:12:35 +03:00
{
2016-03-05 19:05:02 +03:00
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 ) ;
2016-03-16 14:46:12 +03:00
DrawRectangleLines ( roof - > collider . bounds . x , roof - > collider . bounds . y , roof - > collider . bounds . width , roof - > collider . bounds . height , GREEN ) ;
2016-03-05 19:05:02 +03:00
DrawRectangleLines ( platform - > collider . bounds . x , platform - > collider . bounds . y , platform - > collider . bounds . width , platform - > collider . bounds . height , GREEN ) ;
2016-03-16 14:46:12 +03:00
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 ) ;
2015-12-21 23:12:35 +03:00
}
2016-03-05 19:05:02 +03:00
2016-03-16 14:46:12 +03:00
// 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 ) ;
2015-12-21 23:12:35 +03:00
2016-06-14 21:23:46 +03:00
DrawFPS ( 10 , 10 ) ;
2015-12-21 23:12:35 +03:00
EndDrawing ( ) ;
//----------------------------------------------------------------------------------
}
// De-Initialization
2016-06-14 21:38:49 +03:00
//--------------------------------------------------------------------------------------
2016-05-20 11:53:31 +03:00
ClosePhysics ( ) ; // Unitialize physics (including all loaded objects)
2015-12-21 23:12:35 +03:00
CloseWindow ( ) ; // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0 ;
}