summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRosyid Haryadi <rosyid_haryadi@protonmail.com>2023-12-21 11:41:37 +0700
committerRosyid Haryadi <rosyid_haryadi@protonmail.com>2023-12-21 11:41:37 +0700
commit9d0453d24aefbaef33b448a91dceb34e4587fa67 (patch)
tree13ad84c491ac626686aa25eec921b1293504ea32
parentc1d8c59373812fc7f1a6d7cde0eb2fad429f54ef (diff)
multipla objects
-rw-r--r--src/main.c70
1 files changed, 52 insertions, 18 deletions
diff --git a/src/main.c b/src/main.c
index 13bcfdf..e536730 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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