init
This commit is contained in:
commit
707a0bd9b1
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*.out
|
||||
.gdb_history
|
76
Block1D.hpp
Normal file
76
Block1D.hpp
Normal file
@ -0,0 +1,76 @@
|
||||
#ifndef PHYSICS_HEADER
|
||||
#define PHYSICS_HEADER
|
||||
|
||||
/* A red cube which can only move horizontally.
|
||||
* NOTES:
|
||||
* > there is no speed limit, but touching either end of
|
||||
* the movement area will reset the speed to 0.
|
||||
*/
|
||||
class Block1D {
|
||||
public:
|
||||
// Block properties
|
||||
const int block_size = 30;
|
||||
const int guard_size = 10;
|
||||
// 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 = 0;
|
||||
} else
|
||||
if (position.x + delta > (max_x-block_size)) {
|
||||
position.x = max_x-block_size;
|
||||
speed = 0;
|
||||
} 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
|
71
Block2D.hpp
Normal file
71
Block2D.hpp
Normal file
@ -0,0 +1,71 @@
|
||||
#ifndef PHYSICS_HEADER
|
||||
#define PHYSICS_HEADER
|
||||
|
||||
class Block2d {
|
||||
public:
|
||||
Vector2 position = {screenWidth/2, screenHeight/2};
|
||||
Vector2 direction = {0, 0};
|
||||
const float max_speed = 1200;
|
||||
Vector2 speed = {0, 0};
|
||||
double last_update;
|
||||
|
||||
Block2d(void) {
|
||||
last_update = GetTime();
|
||||
}
|
||||
|
||||
void accelerate(float * v, float extra) {
|
||||
if (abs(*v + extra) < max_speed) {
|
||||
*v = abs(*v + extra);
|
||||
} else {
|
||||
*v = max_speed;
|
||||
}
|
||||
}
|
||||
|
||||
void control(Vector2 click) {
|
||||
direction = diff(position, click);
|
||||
Vector2 speed_addition = {
|
||||
direction.x,
|
||||
direction.y,
|
||||
};
|
||||
accelerate(&speed.x, speed_addition.x);
|
||||
accelerate(&speed.y, speed_addition.y);
|
||||
direction = (Vector2) {
|
||||
.x = signum(direction.x),
|
||||
.y = signum(direction.y),
|
||||
};
|
||||
}
|
||||
|
||||
void decelerate(float * v) {
|
||||
if (*v - 1.1f > 0) {
|
||||
*v -= 1.1f;
|
||||
} else {
|
||||
*v = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void update(void) {
|
||||
double update_time = GetTime();
|
||||
position.x -= speed.x * (update_time - last_update) * direction.x;
|
||||
position.y -= speed.y * (update_time - last_update) * direction.y;
|
||||
|
||||
decelerate(&speed.x);
|
||||
decelerate(&speed.y);
|
||||
|
||||
last_update = update_time;
|
||||
}
|
||||
|
||||
void display(void) {
|
||||
// Block
|
||||
DrawRectangle(position.x, position.y, 30, 30, RED);
|
||||
|
||||
// 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 X: %5.2f", speed.x), 10, 70, 20, DARKGRAY);
|
||||
DrawText(TextFormat("Speed Y: %5.2f", speed.y), 10, 100, 20, DARKGRAY);
|
||||
}
|
||||
|
||||
|
||||
} content;
|
||||
|
||||
#endif
|
46
BlockProjectile.hpp
Normal file
46
BlockProjectile.hpp
Normal file
@ -0,0 +1,46 @@
|
||||
#error "Not implemented."
|
||||
|
||||
#if 0
|
||||
const float G = 9.8f;
|
||||
const float mass = 10.0f;
|
||||
const float x0 = 400.0f;
|
||||
const float y0 = 500.0f;
|
||||
|
||||
float v0 = 50.0f;
|
||||
float angle = 45.0f;
|
||||
float v = v0;
|
||||
float x = x0;
|
||||
float y = y0;
|
||||
float t0 = GetTime();
|
||||
|
||||
vector<Vector2> trajectory;
|
||||
|
||||
float dt = GetTime() - t0;
|
||||
v = (G/mass) * dt;
|
||||
x = x0 + (v0*sin(radians(angle + 90.0f))) * dt;
|
||||
y = y0 + (v0*cos(radians(angle + 90.0f)) + G*dt) * dt * v;
|
||||
|
||||
trajectory.push_back((Vector2) { .x = x, .y = y });
|
||||
|
||||
if (y > screenHeight) {
|
||||
v0 = (rand() % 100) + 20.0f;
|
||||
angle = rand() % 180;
|
||||
v = v0;
|
||||
y = y0;
|
||||
x = x0;
|
||||
t0 = GetTime();
|
||||
trajectory.clear();
|
||||
}
|
||||
|
||||
------
|
||||
|
||||
for (const auto &v : trajectory) {
|
||||
DrawPixel(v.x, v.y, BLUE);
|
||||
}
|
||||
|
||||
DrawCircleV((Vector2){x, y}, 10, RED);
|
||||
|
||||
DrawText("Stone Trajectory Simulation", 10, 10, 20, DARKGRAY);
|
||||
DrawText(TextFormat("Time: %.2f s", dt), 10, 40, 20, DARKGRAY);
|
||||
DrawText(TextFormat("Velocity: %.2f Angle: %.2f", v, angle), 10, 70, 20, DARKGRAY);
|
||||
#endif
|
76
BouncyBlock1D.hpp
Normal file
76
BouncyBlock1D.hpp
Normal file
@ -0,0 +1,76 @@
|
||||
|
||||
#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
|
50
main.cpp
Normal file
50
main.cpp
Normal file
@ -0,0 +1,50 @@
|
||||
// @BAKE g++ -o $*.out $@ -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -ggdb
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <vector>
|
||||
#include "raylib.h"
|
||||
|
||||
#include "util.hpp"
|
||||
|
||||
const int screenWidth = 800;
|
||||
const int screenHeight = 600;
|
||||
|
||||
using namespace std;
|
||||
|
||||
/* All of the following headers define an object:
|
||||
* Interface Content {
|
||||
* void display(void);
|
||||
* void control(Vector2 click);
|
||||
* void update(void);
|
||||
* } content;
|
||||
* Why not polymorhpism?
|
||||
* I'll let you know this is static polymorphysm
|
||||
* with a static template method, also, fuck you.
|
||||
* Please uncomment only one at a time.
|
||||
*/
|
||||
//#include "Block1D.hpp"
|
||||
//#include "BouncyBlock1D.hpp"
|
||||
#include "Block2D.hpp"
|
||||
//#inline "BlockProjectile.hpp"
|
||||
|
||||
int main() {
|
||||
InitWindow(screenWidth, screenHeight, "Physics Simulation");
|
||||
SetTargetFPS(60);
|
||||
|
||||
while (!WindowShouldClose()) {
|
||||
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) {
|
||||
content.control(GetMousePosition());
|
||||
}
|
||||
|
||||
content.update();
|
||||
|
||||
BeginDrawing();
|
||||
ClearBackground(RAYWHITE);
|
||||
content.display();
|
||||
EndDrawing();
|
||||
}
|
||||
|
||||
CloseWindow();
|
||||
|
||||
return 0;
|
||||
}
|
22
util.hpp
Normal file
22
util.hpp
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef UTIL_H
|
||||
#define UTIL_H
|
||||
|
||||
static inline
|
||||
float radians(const float degree) {
|
||||
return degree * (M_PI / 180.0f);
|
||||
}
|
||||
|
||||
static inline
|
||||
Vector2 diff(Vector2 a, Vector2 b) {
|
||||
return (Vector2) {
|
||||
.x = a.x - b.x,
|
||||
.y = a.y - b.y,
|
||||
};
|
||||
}
|
||||
|
||||
static inline
|
||||
float signum(float x) {
|
||||
return (x > 0) - (x < 0);
|
||||
}
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user