diff options
author | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2023-12-21 11:41:37 +0700 |
---|---|---|
committer | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2023-12-21 11:41:37 +0700 |
commit | 9d0453d24aefbaef33b448a91dceb34e4587fa67 (patch) | |
tree | 13ad84c491ac626686aa25eec921b1293504ea32 | |
parent | c1d8c59373812fc7f1a6d7cde0eb2fad429f54ef (diff) |
multipla objects
-rw-r--r-- | src/main.c | 70 |
1 files changed, 52 insertions, 18 deletions
@@ -10,7 +10,7 @@ typedef struct Config { int SCREEN_HEIGHT; int ORIGIN_X; int ORIGIN_Y; - char TITLE[20]; + char TITLE[50]; int TARGET_FPS; } Config; @@ -37,8 +37,8 @@ typedef struct VectorField { void Initialize(Config config); void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize); -void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object); -void doUpdate(VectorField *vectorField, Object *object); +void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *objects, int objectNum); +void doUpdate(VectorField *vectorField, Object *objects, int objectNum); int main(void) { @@ -47,7 +47,7 @@ int main(void) 900, 1500 / 2, 900 / 2, - "Cool Thing", + "Force Field Simulator", 60 }; Initialize(config); @@ -64,18 +64,37 @@ int main(void) }; InitializeVectorField(&vectorField, colSize, rowSize); - Object positiveCharge = { - .posX = 50, + Object object0 = { + .posX = (float)config.ORIGIN_X - 200, .posY = (float)config.ORIGIN_Y, .radius = 20, .color = RED, .charge = 100 }; + Object object1 = { + .posX = (float)config.ORIGIN_X + 200, + .posY = (float)config.ORIGIN_Y, + .radius = 20, + .color = BLUE, + .charge = -100 + }; + +// Object object2 = { +// .posX = (float)config.ORIGIN_X + 200, +// .posY = (float)config.ORIGIN_Y - 100, +// .radius = 20, +// .color = BLUE, +// .charge = -100 +// }; + + Object objects[] = {object0, object1}; + int objectNum = sizeof(objects) / sizeof(Object); + while (!WindowShouldClose()) { - doUpdate(&vectorField, &positiveCharge); - doDrawing(&vectorField, colSize, rowSize, &positiveCharge); + doUpdate(&vectorField, objects, objectNum); + doDrawing(&vectorField, colSize, rowSize, objects, objectNum); } CloseWindow(); @@ -118,22 +137,34 @@ void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { } } -void doUpdate(VectorField *vectorField, Object *object) { - float k = 5000.0f; +void doUpdate(VectorField *vectorField, Object *objects, int objectNum) { + float forceConstant = 5000.0f; float dt = GetFrameTime(); for (int i = 0; i < vectorField->rowSize; i++) { for (int j = 0; j < vectorField->colSize; j++) { - Vector2 distanceVector = Vector2Subtract(vectorField->lines[i][j].start, (Vector2){object->posX, object->posY}); - float fieldStrength = k * object->charge / Vector2LengthSqr(distanceVector); - float vectorLineMag = Clamp(fieldStrength, 2.0f, 20.0f); - Vector2 directionVector = Vector2Scale(distanceVector, vectorLineMag / Vector2Length(distanceVector)); - vectorField->lines[i][j].end = Vector2Add(vectorField->lines[i][j].start, directionVector); + Vector2 resultant = Vector2Zero(); + for (int k = 0; k < objectNum; k++) { + Object object = objects[k]; + Vector2 distanceVector = Vector2Subtract(vectorField->lines[i][j].start, (Vector2){object.posX, object.posY}); + float fieldStrength = forceConstant * object.charge / Vector2LengthSqr(distanceVector); + Vector2 force = Vector2Normalize(distanceVector); + force = Vector2Scale(force, fieldStrength); + resultant = Vector2Add(force, resultant); + } + float resultantMag = Clamp(Vector2Length(resultant), -20.0f, 20.0f); + if (fabsf(resultantMag) < 2.0f) { + resultantMag = resultantMag >= 0 ? 2.0f : -2.0f; + } + resultant = Vector2Normalize(resultant); + resultant = Vector2Scale(resultant, resultantMag); + vectorField->lines[i][j].end = Vector2Add(vectorField->lines[i][j].start, resultant); } } - object->posX += dt * 20; +// objects[0].posX += 10 * dt; +// objects[1].posX -= 10 * dt; } -void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object) { +void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *objects, int objectNum) { BeginDrawing(); ClearBackground(BLACK); @@ -143,7 +174,10 @@ void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *objec DrawLineV(vectorField->lines[i][j].start, vectorField->lines[i][j].end, vectorField->lines[i][j].color); } } - DrawCircle(object->posX, object->posY, object->radius, object->color); + for (int i = 0; i < objectNum; i++) { + Object object = objects[i]; + DrawCircle((int)object.posX, (int)object.posY, object.radius, object.color); + } EndDrawing(); }
\ No newline at end of file |