100 lines
1.9 KiB
C++
100 lines
1.9 KiB
C++
#include "raylib.h"
|
|
#include "raymath.h"
|
|
|
|
class Entity {
|
|
|
|
protected:
|
|
Vector3 position{};
|
|
|
|
public:
|
|
virtual ~Entity() = default;
|
|
|
|
explicit Entity(Vector3 position) {
|
|
this->position = position;
|
|
}
|
|
|
|
virtual void updatePos() = 0;
|
|
};
|
|
|
|
|
|
class Player: Entity {
|
|
Camera3D camera{};
|
|
Vector3 camera_offset = {0, 4.0f, 0};
|
|
|
|
void updateCameraPos() {
|
|
camera.position = Vector3Add(position, camera_offset);
|
|
UpdateCamera(&camera, CAMERA_FIRST_PERSON);
|
|
};
|
|
|
|
public:
|
|
|
|
Player(Vector3 position) : Entity(position) {
|
|
camera.target = (Vector3){0.0f, 0.0f, 0.0F};
|
|
camera.up = (Vector3){0.0f, 1.0f, 0.0f};
|
|
camera.fovy = 60.0f;
|
|
camera.projection = CAMERA_PERSPECTIVE;
|
|
}
|
|
|
|
Camera3D& getCamera() {
|
|
return this->camera;
|
|
}
|
|
|
|
void updatePos() override {
|
|
|
|
if (IsKeyDown(KEY_W)) {
|
|
position.x+=0.1;
|
|
};
|
|
|
|
|
|
|
|
updateCameraPos();
|
|
};
|
|
};
|
|
|
|
|
|
int main(void) {
|
|
const int screenWidth = 1500;
|
|
const int screenHeight = 800;
|
|
|
|
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
|
|
|
|
|
|
InitWindow(screenWidth, screenHeight, "Simple 3D cube");
|
|
|
|
SetTargetFPS(75);
|
|
|
|
Mesh cubeMesh = GenMeshCube(1.0f, 1.0f, 1.0f);
|
|
Model cubeModel = LoadModelFromMesh(cubeMesh);
|
|
|
|
Player player(Vector3{4, 0, 4});
|
|
|
|
Camera3D& cur_camera = player.getCamera();
|
|
|
|
while (!WindowShouldClose()) {
|
|
|
|
|
|
player.updatePos();
|
|
|
|
BeginDrawing();
|
|
|
|
ClearBackground(RAYWHITE);
|
|
|
|
BeginMode3D(cur_camera);
|
|
|
|
static float rotation = 0.0f;
|
|
rotation += 0.01f; // Increment for smooth spin
|
|
|
|
DrawModelEx(cubeModel, (Vector3){0, 0, 0}, (Vector3){0, 1, 0}, rotation * RAD2DEG, (Vector3){2, 2, 2}, RED);
|
|
|
|
EndMode3D();
|
|
|
|
DrawText("3D mode", 10, 10, 20, DARKGRAY);
|
|
EndDrawing();
|
|
|
|
|
|
}
|
|
|
|
CloseWindow();
|
|
return 0;
|
|
}
|