1 /*******************************************************************************************
2 *
3 *   raylib [models] example - Detect basic 3d collisions (box vs sphere vs box)
4 *
5 *   This example has been created using raylib 1.3 (www.raylib.com)
6 *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
7 *
8 *   Copyright (c) 2015 Ramon Santamaria (@raysan5)
9 *
10 ********************************************************************************************/
11 
12 #include "raylib.h"
13 
main(void)14 int main(void)
15 {
16     // Initialization
17     //--------------------------------------------------------------------------------------
18     const int screenWidth = 800;
19     const int screenHeight = 450;
20 
21     InitWindow(screenWidth, screenHeight, "raylib [models] example - box collisions");
22 
23     // Define the camera to look into our 3d world
24     Camera camera = { { 0.0f, 10.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 };
25 
26     Vector3 playerPosition = { 0.0f, 1.0f, 2.0f };
27     Vector3 playerSize = { 1.0f, 2.0f, 1.0f };
28     Color playerColor = GREEN;
29 
30     Vector3 enemyBoxPos = { -4.0f, 1.0f, 0.0f };
31     Vector3 enemyBoxSize = { 2.0f, 2.0f, 2.0f };
32 
33     Vector3 enemySpherePos = { 4.0f, 0.0f, 0.0f };
34     float enemySphereSize = 1.5f;
35 
36     bool collision = false;
37 
38     SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
39     //--------------------------------------------------------------------------------------
40 
41     // Main game loop
42     while (!WindowShouldClose())    // Detect window close button or ESC key
43     {
44         // Update
45         //----------------------------------------------------------------------------------
46 
47         // Move player
48         if (IsKeyDown(KEY_RIGHT)) playerPosition.x += 0.2f;
49         else if (IsKeyDown(KEY_LEFT)) playerPosition.x -= 0.2f;
50         else if (IsKeyDown(KEY_DOWN)) playerPosition.z += 0.2f;
51         else if (IsKeyDown(KEY_UP)) playerPosition.z -= 0.2f;
52 
53         collision = false;
54 
55         // Check collisions player vs enemy-box
56         if (CheckCollisionBoxes(
57             (BoundingBox){(Vector3){ playerPosition.x - playerSize.x/2,
58                                      playerPosition.y - playerSize.y/2,
59                                      playerPosition.z - playerSize.z/2 },
60                           (Vector3){ playerPosition.x + playerSize.x/2,
61                                      playerPosition.y + playerSize.y/2,
62                                      playerPosition.z + playerSize.z/2 }},
63             (BoundingBox){(Vector3){ enemyBoxPos.x - enemyBoxSize.x/2,
64                                      enemyBoxPos.y - enemyBoxSize.y/2,
65                                      enemyBoxPos.z - enemyBoxSize.z/2 },
66                           (Vector3){ enemyBoxPos.x + enemyBoxSize.x/2,
67                                      enemyBoxPos.y + enemyBoxSize.y/2,
68                                      enemyBoxPos.z + enemyBoxSize.z/2 }})) collision = true;
69 
70         // Check collisions player vs enemy-sphere
71         if (CheckCollisionBoxSphere(
72             (BoundingBox){(Vector3){ playerPosition.x - playerSize.x/2,
73                                      playerPosition.y - playerSize.y/2,
74                                      playerPosition.z - playerSize.z/2 },
75                           (Vector3){ playerPosition.x + playerSize.x/2,
76                                      playerPosition.y + playerSize.y/2,
77                                      playerPosition.z + playerSize.z/2 }},
78             enemySpherePos, enemySphereSize)) collision = true;
79 
80         if (collision) playerColor = RED;
81         else playerColor = GREEN;
82         //----------------------------------------------------------------------------------
83 
84         // Draw
85         //----------------------------------------------------------------------------------
86         BeginDrawing();
87 
88             ClearBackground(RAYWHITE);
89 
90             BeginMode3D(camera);
91 
92                 // Draw enemy-box
93                 DrawCube(enemyBoxPos, enemyBoxSize.x, enemyBoxSize.y, enemyBoxSize.z, GRAY);
94                 DrawCubeWires(enemyBoxPos, enemyBoxSize.x, enemyBoxSize.y, enemyBoxSize.z, DARKGRAY);
95 
96                 // Draw enemy-sphere
97                 DrawSphere(enemySpherePos, enemySphereSize, GRAY);
98                 DrawSphereWires(enemySpherePos, enemySphereSize, 16, 16, DARKGRAY);
99 
100                 // Draw player
101                 DrawCubeV(playerPosition, playerSize, playerColor);
102 
103                 DrawGrid(10, 1.0f);        // Draw a grid
104 
105             EndMode3D();
106 
107             DrawText("Move player with cursors to collide", 220, 40, 20, GRAY);
108 
109             DrawFPS(10, 10);
110 
111         EndDrawing();
112         //----------------------------------------------------------------------------------
113     }
114 
115     // De-Initialization
116     //--------------------------------------------------------------------------------------
117     CloseWindow();        // Close window and OpenGL context
118     //--------------------------------------------------------------------------------------
119 
120     return 0;
121 }