summaryrefslogtreecommitdiff
path: root/include/playerObject.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/playerObject.h')
-rw-r--r--include/playerObject.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/include/playerObject.h b/include/playerObject.h
new file mode 100644
index 0000000..9394c4f
--- /dev/null
+++ b/include/playerObject.h
@@ -0,0 +1,73 @@
+#include "types.h"
+#include "point.h"
+#include "velocity.h"
+#include "toolbox.h"
+#include "fixed.h"
+
+#ifndef PLAYEROBJECT_H
+#define PLAYEROBJECT_H
+
+#define GRAVITY 0.75
+
+typedef struct playerObject {
+ VELOCITY vel;
+ POINT pt;
+ u32 rotation; // Rotation amount
+ OBJ_ATTR *obj; // Attributes of the object for GBA
+ int pallete_bank; // Index of pallete
+ int tile_id; // Index of player tile
+ int isJumping;
+} ALIGN(4) playerObject; // Word-align to ensure corruption doesn't occur
+
+static inline void initializePlayerObject (playerObject *object) {
+ // Initialize the point and velocity of an object
+ object->vel = createVelocity(0, 0);
+ object->pt = createPoint(20 << FIX_SHIFT, 100 << FIX_SHIFT);
+}
+
+static inline playerObject createPlayerObject (OBJ_ATTR *obj_buffer, int pallete_bank, int tile_id) {
+ // Create a player object from data
+ playerObject temp;
+ initializePlayerObject(&temp);
+ temp.rotation = 0;
+ temp.obj = obj_buffer;
+ temp.pallete_bank = pallete_bank;
+ temp.tile_id = tile_id;
+ temp.isJumping = 0;
+ obj_set_attr(temp.obj,
+ ATTR0_SQUARE, // Set attribute 1 to be a square
+ ATTR1_SIZE_16, // Set size to 16 x 16
+ ATTR2_PALBANK(pallete_bank) | tile_id // Which pallete to use, as we are in
+ // 16-color mode
+ );
+ obj_set_pos(temp.obj, temp.pt.x >> FIX_SHIFT, temp.pt.y >> FIX_SHIFT);
+ return temp;
+}
+
+static inline void applyGravity (playerObject *object) {
+ // Apply a gravity constant to a player
+ object->vel.dy += float_to_fixed(GRAVITY);
+ // This is a weird convention to have gravity in the positive direction,
+ // but I don't want to deal with coordinate changing. Too lazy
+}
+
+static inline void updatePlayer (playerObject *object, u32 GROUND_LEVEL) {
+ // Update the position of a player object
+ updatePoint(&object->pt, &object->vel);
+ if (object->pt.y >> FIX_SHIFT >= GROUND_LEVEL) {
+ // Only apply gravity if player is not touching the ground
+ object->isJumping = 0;
+ object->pt.y = GROUND_LEVEL << FIX_SHIFT; // Don't go through ground
+ object->vel.dy = 0;
+ }
+ else {
+ object->isJumping = 1;
+ applyGravity(object);
+ }
+ // Update the player object's attributes' position
+ obj_set_pos(object->obj, object->pt.x >> FIX_SHIFT, object->pt.y >> FIX_SHIFT);
+ // Update the player's second attribute (tile and pallete bank)
+ object->obj->attr2 = ATTR2_BUILD(object->tile_id, object->pallete_bank, 0);
+}
+
+#endif // PLAYEROBJECT_H