#ifndef PHYSICS_HEADER #define PHYSICS_HEADER /* A red cube which can only move horizontally and is mode of rubber. */ class Block1D { public: // Block properties const int block_size = 30; const int guard_size = 10; const float restitution = 0.72f; // Movement bounds const float min_x = screenWidth/10; const float max_x = screenWidth-(screenWidth/10); // Movement state Vector2 position = {min_x, screenHeight/2}; Vector2 direction = {0, 0}; float speed = 0; double last_update; // --- void display(void) { /* Guard line top * Block * Guard line bottom */ DrawRectangle(min_x, position.y-guard_size, max_x-min_x, guard_size, GRAY); DrawRectangle(position.x, position.y, block_size, block_size, RED); DrawRectangle(min_x, position.y+block_size, max_x-min_x, guard_size, GRAY); // Hud DrawText(TextFormat("X: %5.2f", position.x), 10, 10, 20, DARKGRAY); DrawText(TextFormat("Y: %5.2f", position.y), 10, 40, 20, DARKGRAY); DrawText(TextFormat("Speed: %5.2f", speed), 10, 70, 20, DARKGRAY); } void control(Vector2 click) { direction = diff(click, position); speed += abs(direction.x); direction = (Vector2) { .x = signum(direction.x), .y = 0, }; } void update(void) { double update_time = GetTime(); float delta = speed * (update_time - last_update) * direction.x; if (position.x + delta < min_x) { position.x = min_x; speed = speed * restitution; direction.x = direction.x * -1; } else if (position.x + delta > (max_x-block_size)) { position.x = max_x-block_size; speed = speed * restitution; direction.x = direction.x * -1; } else { position.x += speed * (update_time - last_update) * direction.x; if (speed - 1.1f > 0) { speed -= 1.1f; } else { speed = 0; } } last_update = update_time; } } content; #endif