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 | |
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 | } |