|
@@ -0,0 +1,174 @@
|
|
|
|
+
|
|
|
|
+#include "raylib.h"
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+#include <math.h>
|
|
|
|
+
|
|
|
|
+int main(void)
|
|
|
|
+{
|
|
|
|
+ // Initialization
|
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
|
+ const int screenWidth = 800;
|
|
|
|
+ const int screenHeight = 450;
|
|
|
|
+
|
|
|
|
+ InitWindow(screenWidth, screenHeight, "raylib example.");
|
|
|
|
+
|
|
|
|
+ // We generate a checked image for texturing
|
|
|
|
+ Image checked = GenImageChecked(2, 2, 1, 1, BLACK, DARKGRAY);
|
|
|
|
+ Texture2D texture = LoadTextureFromImage(checked);
|
|
|
|
+ UnloadImage(checked);
|
|
|
|
+
|
|
|
|
+ Model model = { 0 };
|
|
|
|
+ model = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f));
|
|
|
|
+
|
|
|
|
+ // Set checked texture as default diffuse component for all models material
|
|
|
|
+ model.materials[0].maps[MAP_DIFFUSE].texture = texture;
|
|
|
|
+
|
|
|
|
+ // Define the camera to look into our 3d world
|
|
|
|
+ Camera camera = { { 5.0f, 5.0f, 5.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 };
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ SetCameraMode(camera, CAMERA_FIRST_PERSON); // Set camera mode
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // Our bullet setup
|
|
|
|
+ //
|
|
|
|
+ Vector3 bulletpos;
|
|
|
|
+ bulletpos = camera.position;
|
|
|
|
+ Vector3 bulletinc;
|
|
|
|
+ bulletinc.x = 0.05;
|
|
|
|
+ bulletinc.y = 0.00;
|
|
|
|
+ bulletinc.z = 0.0;
|
|
|
|
+
|
|
|
|
+ // Our bullet model
|
|
|
|
+ Model bullet = { 0 };
|
|
|
|
+ bullet = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f));
|
|
|
|
+
|
|
|
|
+ // Set checked texture as default diffuse component for all models material
|
|
|
|
+ bullet.materials[0].maps[MAP_DIFFUSE].texture = texture;
|
|
|
|
+
|
|
|
|
+ // Our target model
|
|
|
|
+ //
|
|
|
|
+ Vector3 targetboxposition;
|
|
|
|
+ targetboxposition.x = 20;
|
|
|
|
+ targetboxposition.y = 10;
|
|
|
|
+ targetboxposition.z = 20;
|
|
|
|
+
|
|
|
|
+ Model targetbox = { 0 };
|
|
|
|
+ targetbox = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f));
|
|
|
|
+ // Set checked texture as default diffuse component for all models material
|
|
|
|
+ targetbox.materials[0].maps[MAP_DIFFUSE].texture = texture;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+ // Main game loop
|
|
|
|
+ while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
|
|
+ {
|
|
|
|
+ // Update
|
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
|
+ UpdateCamera(&camera); // Update internal camera and our camera
|
|
|
|
+
|
|
|
|
+ // Shoot the bullet.
|
|
|
|
+ if(IsKeyDown(KEY_SPACE)){
|
|
|
|
+ bulletpos = camera.position;
|
|
|
|
+ // Get the direction of where to shoot the bullet at.
|
|
|
|
+ float x1 = camera.position.x;
|
|
|
|
+ float y1 = camera.position.y;
|
|
|
|
+ float z1 = camera.position.z;
|
|
|
|
+ float x2 = camera.target.x;
|
|
|
|
+ float y2 = camera.target.y;
|
|
|
|
+ float z2 = camera.target.z;
|
|
|
|
+ float delta_x = x2 - x1;
|
|
|
|
+ float delta_y = y2 - y1;
|
|
|
|
+ float delta_z = z2 - z1;
|
|
|
|
+
|
|
|
|
+ float len = sqrt(delta_x*delta_x+delta_y*delta_y+delta_z*delta_z);
|
|
|
|
+ delta_x = delta_x / len;
|
|
|
|
+ delta_y = delta_y / len;
|
|
|
|
+ delta_z = delta_z / len;
|
|
|
|
+ bulletinc.x = delta_x;
|
|
|
|
+ bulletinc.y = delta_y;
|
|
|
|
+ bulletinc.z = delta_z;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // update the bullet position.
|
|
|
|
+ bulletpos.x += bulletinc.x;
|
|
|
|
+ bulletpos.y += bulletinc.y;
|
|
|
|
+ bulletpos.z += bulletinc.z;
|
|
|
|
+
|
|
|
|
+ // collision between the bullet and the targetbox.
|
|
|
|
+ // Check collisions player vs enemy-box
|
|
|
|
+ if (CheckCollisionBoxes(
|
|
|
|
+ (BoundingBox){(Vector3){ bulletpos.x - 0.5f,
|
|
|
|
+ bulletpos.y - 0.5f,
|
|
|
|
+ bulletpos.z - 0.5f },
|
|
|
|
+ (Vector3){ bulletpos.x + 0.5f,
|
|
|
|
+ bulletpos.y + 0.5f,
|
|
|
|
+ bulletpos.z + 0.5f }},
|
|
|
|
+ (BoundingBox){(Vector3){ targetboxposition.x - 0.5f,
|
|
|
|
+ targetboxposition.y - 0.5f,
|
|
|
|
+ targetboxposition.z - 0.5f },
|
|
|
|
+ (Vector3){ targetboxposition.x + 0.5f,
|
|
|
|
+ targetboxposition.y + 0.5f,
|
|
|
|
+ targetboxposition.z + 0.5f }})){
|
|
|
|
+ // Put the target box at a new position.
|
|
|
|
+ targetboxposition = (Vector3){(float)GetRandomValue(5,40),10.0f,(float)GetRandomValue(5,40)};
|
|
|
|
+ }
|
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
|
+ // Draw
|
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
|
+ BeginDrawing();
|
|
|
|
+
|
|
|
|
+ ClearBackground(RAYWHITE);
|
|
|
|
+
|
|
|
|
+ BeginMode3D(camera);
|
|
|
|
+
|
|
|
|
+ // Draw a floor.
|
|
|
|
+ for(int x=0;x<50;x++){
|
|
|
|
+ for(int z=0;z<50;z++){
|
|
|
|
+ Vector3 position;
|
|
|
|
+ position.x = x;
|
|
|
|
+ position.y = 0;
|
|
|
|
+ position.z = z;
|
|
|
|
+ DrawModel(model, position, 1.0f, WHITE);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Draw our bullet.
|
|
|
|
+ DrawModel(bullet, bulletpos, 1.0f, WHITE);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // Draw our targetbox.
|
|
|
|
+ DrawModel(targetbox, targetboxposition, 1.0f, WHITE);
|
|
|
|
+
|
|
|
|
+ EndMode3D();
|
|
|
|
+
|
|
|
|
+ // Draw our Crosshair - Simply a PLUS character drawn with DrawText in RED.
|
|
|
|
+ DrawText("+",screenWidth/2-20,screenHeight/2-20,40,RED);
|
|
|
|
+
|
|
|
|
+ DrawText("Press space and aim to shoot bullet.",100,100,30,RED);
|
|
|
|
+ DrawFPS(0,0);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ EndDrawing();
|
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // De-Initialization
|
|
|
|
+ UnloadTexture(texture); // Unload texture
|
|
|
|
+
|
|
|
|
+ // Unload models data (GPU VRAM)
|
|
|
|
+ UnloadModel(model);
|
|
|
|
+ UnloadModel(bullet);
|
|
|
|
+ UnloadModel(targetbox);
|
|
|
|
+
|
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
|
+ CloseWindow(); // Close window and OpenGL context
|
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|