#ifndef PHYSICS_HEADER #define PHYSICS_HEADER class BlockProjectile { public: const int block_size = 30; const float G = 98.0f * 2; Vector2 display_offset; Vector2 position; Vector2 velocity; double last_update; /* Used for tracing the block visually, * not for calculations */ vector<Vector2> trajectory; void reset(void) { position = { 0, 0 }; velocity.y = (rand() % 400) + 3; velocity.x = (rand() % (150*2)) - 150; trajectory.clear(); } BlockProjectile() { display_offset.x = (screenWidth / 2) - (block_size - 2); display_offset.y = screenHeight - 100 - (block_size - 2); reset(); } double speed(Vector2 velocity) { return sqrt(pow(velocity.x, 2) + pow(velocity.y, 2)); } void display(void) { for (auto &p : trajectory) { DrawPixelV( (Vector2) { .x = p.x + display_offset.x, .y = p.y + display_offset.y, }, BLUE ); } DrawCircleV(display_offset, 7, GREEN); DrawRectangle( position.x + display_offset.x - (block_size/2), position.y + display_offset.y - (block_size/2), block_size, block_size, RED ); // HUD DrawText("Stone Trajectory Simulation", 10, 10, 20, DARKGRAY); DrawText(TextFormat("Time: %.2f s", last_update), 10, 40, 20, DARKGRAY); DrawText(TextFormat("Speed: %.2f", speed(velocity)), 10, 70, 20, DARKGRAY); } void control(Vector2 click) { /* NOTE: this module is automatic*/; } void update(void) { if (position.y + display_offset.y > screenHeight) { reset(); return; } trajectory.push_back(position); double update_time = GetTime(); Vector2 delta; delta.x = velocity.x * (update_time - last_update); delta.y = velocity.y * (update_time - last_update); position.x += delta.x; position.y -= delta.y; velocity.y -= G * (update_time - last_update); last_update = update_time; } } content; #endif