summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmin Mesbah <mesbahamin@gmail.com>2017-12-12 19:13:34 -0800
committerAmin Mesbah <mesbahamin@gmail.com>2017-12-14 21:25:55 -0800
commit211a7738907aff561a01a2a35b262f14f867680f (patch)
treebe077eb5a05b92ff3c24d743b4846a25fa3897ea
parent74281c2d2a86be4aec63e6dd16dd722bcd4ef3dc (diff)
downloadohsp-211a7738907aff561a01a2a35b262f14f867680f.zip
ohsp-211a7738907aff561a01a2a35b262f14f867680f.tar.gz
Change vector representationfeatures/vec-struct
- Use (x,y) rather than (angle, length) - Use a fancy union for convenience - Add some basic vector functions
-rw-r--r--src/entity.c59
-rw-r--r--src/entity.h44
-rw-r--r--src/game.c89
-rw-r--r--src/platform_sdl.c2
4 files changed, 127 insertions, 67 deletions
diff --git a/src/entity.c b/src/entity.c
index 9765f7f..f8b5de5 100644
--- a/src/entity.c
+++ b/src/entity.c
@@ -4,24 +4,63 @@
#include <stdio.h>
-struct Vec2d vec2d_add(float angle1, float length1, float angle2, float length2)
+void entity_accelerate(struct Entity *e, struct Vec2d *v)
{
- float x = sinf(angle1) * length1 + sinf(angle2) * length2;
- float y = cosf(angle1) * length1 + cosf(angle2) * length2;
+ struct Vec2d new_vec = vec2d_add(e->velocity.x, e->velocity.y, v->x, v->y);
+ //printf("(%f, %f)\n", new_vec.x, new_vec.y);
+ e->velocity.x = new_vec.x;
+ e->velocity.y = new_vec.y;
+}
+
+struct Vec2d vec2d_add(float x0, float y0, float x1, float y1)
+{
struct Vec2d new_vec =
{
- .angle = 0.5f * M_PI - atan2f(y, x),
- .length = hypotf(x, y),
+ .x = x0 + x1,
+ .y = y0 + y1
};
return new_vec;
}
-void entity_accelerate(struct Entity *e, float angle, float acceleration)
+bool vec2d_equal(struct Vec2d v0, struct Vec2d v1)
+{
+ return (v0.x == v1.x) && (v0.y == v1.y);
+}
+
+
+float vec2d_get_angle(float x, float y)
{
- struct Vec2d new_vec = vec2d_add(e->angle, e->speed, angle, acceleration);
- //printf("(%f, %f)\n", new_vec.angle, new_vec.length);
- e->angle = new_vec.angle;
- e->speed = new_vec.length;
+ return 0.5f * M_PI - atan2f(y, x);
+}
+
+
+float vec2d_get_length(float x, float y)
+{
+ return hypotf(x, y);
+}
+
+
+struct Vec2d vec2d_negate(struct Vec2d v)
+{
+ return vec2d_scale(v.x, v.y, -1.0f);
+}
+
+
+struct Vec2d vec2d_normalize(float x, float y)
+{
+ float length = vec2d_get_length(x, y);
+ return vec2d_scale(x, y, 1.0f / length);
+}
+
+
+struct Vec2d vec2d_scale(float x, float y, float s)
+{
+ struct Vec2d new_vec =
+ {
+ .x = x * s,
+ .y = y * s
+ };
+ return new_vec;
}
diff --git a/src/entity.h b/src/entity.h
index f9c6a74..479f4e0 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -1,30 +1,50 @@
#ifndef ENTITY_H
#define ENTITY_H
+#include <stdbool.h>
#include <stdint.h>
#ifndef M_PI
#define M_PI 3.141592f
#endif
+struct Vec2d
+{
+ union
+ {
+ struct
+ {
+ float x;
+ float y;
+ };
+ struct
+ {
+ float w;
+ float h;
+ };
+ float xy[2];
+ float d[2];
+ };
+};
+
struct Entity
{
- float angle;
- float speed;
float mass;
float size;
- float x;
- float y;
+ struct Vec2d position;
+ struct Vec2d velocity;
uint32_t color;
};
-struct Vec2d
-{
- float angle;
- float length;
-};
-
-struct Vec2d vec2d_add(float angle1, float length1, float angle2, float length2);
-void entity_accelerate(struct Entity *e, float angle, float acceleration);
+void entity_accelerate(struct Entity *e, struct Vec2d *v);
+struct Vec2d vec2d_add(float x0, float y0, float x1, float y1);
+struct Vec2d vec2d_al_to_xy(struct Vec2d v);
+float vec2d_get_angle(float x, float y);
+bool vec2d_equal(struct Vec2d v0, struct Vec2d v1);
+float vec2d_get_length(float x, float y);
+struct Vec2d vec2d_negate(struct Vec2d v);
+struct Vec2d vec2d_normalize(float x, float y);
+struct Vec2d vec2d_scale(float x, float y, float s);
+struct Vec2d vec2d_xy_to_al(struct Vec2d v);
#endif
diff --git a/src/game.c b/src/game.c
index 820939f..8412d83 100644
--- a/src/game.c
+++ b/src/game.c
@@ -17,19 +17,21 @@ void game_init(struct GameState *game_state, int field_width, int field_height)
return;
}
- game_state->player.angle = 0;
- game_state->player.speed = 0;
game_state->player.mass = 10;
game_state->player.size = 30;
- game_state->player.x = field_width / 2;
- game_state->player.y = field_height / 2;
game_state->player.color = 0x888888;
- game_state->thrust_vector01.angle = 0;
- game_state->thrust_vector01.length = 0;
- game_state->thrust_vector02.angle = 0;
- game_state->thrust_vector02.length = 0;
- game_state->thrust_vector_sum.angle = 0;
- game_state->thrust_vector_sum.length = 0;
+ game_state->player.position.x = field_width / 2;
+ game_state->player.position.y = field_height / 2;
+ game_state->player.velocity.x = 0;
+ game_state->player.velocity.y = 0;
+
+ game_state->thrust_vector01.x = 0;
+ game_state->thrust_vector01.y = 0;
+ game_state->thrust_vector02.x = 0;
+ game_state->thrust_vector02.y = 0;
+ game_state->thrust_vector_sum.x = 0;
+ game_state->thrust_vector_sum.y = 0;
+
game_state->view.dx = 0;
game_state->view.dy = 0;
game_state->view.zoom = 1;
@@ -61,35 +63,33 @@ void game_update(struct GameState *game_state, struct GameControllerInput game_i
return;
}
- game_state->thrust_vector01.angle = atan2f(game_input.left_stick_y, game_input.left_stick_x);
- game_state->thrust_vector01.length = hypotf(game_input.left_stick_x, game_input.left_stick_y);
- //printf("(lx: %f, ly: %f, thrust_a: %f, thrust_l: %f)\n",
- // game_input.left_stick_x,
- // game_input.left_stick_y,
- // game_state->thrust_vector01.angle,
- // game_state->thrust_vector01.length);
-
- game_state->thrust_vector02.angle = atan2f(game_input.right_stick_y, game_input.right_stick_x);
- game_state->thrust_vector02.length = hypotf(game_input.right_stick_x, game_input.right_stick_y);
- //printf("(rx: %f, ry: %f, thrust_a: %f, thrust_l: %f)\n",
- // game_input.right_stick_x,
- // game_input.right_stick_y,
- // game_state->thrust_vector02.angle,
- // game_state->thrust_vector02.length);
+ game_state->thrust_vector01.x = game_input.left_stick_x;
+ game_state->thrust_vector01.y = game_input.left_stick_y;
+ //printf("(lx: %f, ly: %f, thrust_x: %f, thrust_y: %f)\n", game_input.left_stick_x, game_input.left_stick_y, game_state->thrust_vector01.x, game_state->thrust_vector01.y);
+
+ game_state->thrust_vector02.x = game_input.right_stick_x;
+ game_state->thrust_vector02.y = game_input.right_stick_y;
+ //printf("(rx: %f, ry: %f, thrust_x: %f, thrust_y: %f)\n", game_input.right_stick_x, game_input.right_stick_y, game_state->thrust_vector02.x, game_state->thrust_vector02.y);
game_state->thrust_vector_sum = vec2d_add(
- game_state->thrust_vector01.angle,
- game_state->thrust_vector01.length,
- game_state->thrust_vector02.angle,
- game_state->thrust_vector02.length);
+ game_state->thrust_vector01.x,
+ game_state->thrust_vector01.y,
+ game_state->thrust_vector02.x,
+ game_state->thrust_vector02.y);
+
+ game_state->thrust_vector_sum = vec2d_scale(
+ game_state->thrust_vector_sum.x,
+ game_state->thrust_vector_sum.y,
+ 0.01f);
+ //printf("(total_thrust_x: %f, total_thrust_y: %f)\n", game_state->thrust_vector_sum.x, game_state->thrust_vector_sum.y);
struct Entity *player = &game_state->player;
- entity_accelerate(player, game_state->thrust_vector_sum.angle, game_state->thrust_vector_sum.length * 0.01f);
+ entity_accelerate(player, &game_state->thrust_vector_sum);
- player->x += player->speed * cosf(player->angle);
- player->y += player->speed * sinf(player->angle);
- player->x = wrap(player->x, 0, field_width);
- player->y = wrap(player->y, 0, field_height);
+ player->position.x += player->velocity.x;
+ player->position.y += player->velocity.y;
+ player->position.x = wrap(player->position.x, 0, field_width);
+ player->position.y = wrap(player->position.y, 0, field_height);
}
@@ -101,14 +101,15 @@ void game_render(struct OffscreenBuffer *buffer, float dt, struct GameState *gam
return;
}
struct Entity player = game_state->player;
- game_render_circle(buffer, player.x, player.y, player.size, player.color);
- game_render_vector(buffer, &game_state->thrust_vector01, player.x, player.y, 5, 0x0000FF);
- game_render_vector(buffer, &game_state->thrust_vector02, player.x, player.y, 5, 0xFF0000);
- game_render_vector(buffer, &game_state->thrust_vector_sum, player.x, player.y, 5, 0xFF00FF);
+ game_render_circle(buffer, player.position.x, player.position.y, player.size, player.color);
+ game_render_vector(buffer, &game_state->thrust_vector01, player.position.x, player.position.y, 5, 0x0000FF);
+ game_render_vector(buffer, &game_state->thrust_vector02, player.position.x, player.position.y, 5, 0xFF0000);
+ game_render_vector(buffer, &game_state->thrust_vector_sum, player.position.x, player.position.y, 5, 0xFF00FF);
+ struct Vec2d player_vec = vec2d_scale(player.velocity.x, player.velocity.y, 100);
game_render_circle(buffer,
- player.x + 100 * (player.speed * cosf(player.angle)),
- player.y + 100 * (player.speed * sinf(player.angle)),
+ player.position.x + player_vec.x,
+ player.position.y + player_vec.y,
5,
0x00FF00);
}
@@ -319,10 +320,10 @@ void game_render_line(struct OffscreenBuffer *buffer, float x0, float y0, float
void game_render_vector(struct OffscreenBuffer *buffer, struct Vec2d *v, float x0, float y0, float radius, uint32_t color)
{
- float x1 = x0 + 100 * (v->length * cosf(v->angle));
- float y1 = y0 + 100 * (v->length * sinf(v->angle));
- game_render_line(buffer, x0, y0, x1, y1, color);
- game_render_circle(buffer, x1, y1, radius, color);
+ struct Vec2d vec = vec2d_scale(v->x, v->y, 100);
+ vec = vec2d_add(x0, y0, vec.x, vec.y);
+ game_render_line(buffer, x0, y0, vec.x, vec.y, color);
+ game_render_circle(buffer, vec.x, vec.y, radius, color);
}
diff --git a/src/platform_sdl.c b/src/platform_sdl.c
index 22168e6..038e67b 100644
--- a/src/platform_sdl.c
+++ b/src/platform_sdl.c
@@ -77,7 +77,7 @@ void clear_screen(struct SDLOffscreenBuffer *buffer, uint32_t pixel_value)
// TODO: make the deadzone circular
float sdl_process_controller_axis_value(int16_t value, int16_t deadzone_threshold)
{
- float result = 0.0;
+ float result = 0.0f;
if (value < -deadzone_threshold)
{
result = (float)(value + deadzone_threshold) / (32768.0f - deadzone_threshold);