Compare commits

...

5 Commits

Author SHA1 Message Date
En Yi 56678b74b4 Fix compilation mistake
- Tweak makefiles to recurse source directories
- Add missing include in main
2022-07-09 16:53:08 +08:00
BeardedBread 8023b65dc1 Add Timer to levels 2022-07-09 16:45:28 +08:00
BeardedBread aa13a95664 Add level reset 2022-07-09 16:45:28 +08:00
BeardedBread f993c6b7ba Make menus and level load work 2022-07-09 16:45:28 +08:00
En Yi 5b2027c57b Add simple menu 2022-07-09 16:45:28 +08:00
7 changed files with 143 additions and 18 deletions

View File

@ -1,4 +1,5 @@
SRC_FILES = $(wildcard *.c) $(wildcard obj/*.c) $(wildcard utilities/*.c)
SRC_DIRECTORY= ./ ./obj ./screens ./utilities
SRC_FILES = $(foreach dir, $(SRC_DIRECTORY), $(wildcard $(dir)/*.c))
EXE = main
BUILD_DIR = build/
OBJ = $(patsubst %.c,$(BUILD_DIR)%.o,$(SRC_FILES))
@ -22,9 +23,7 @@ $(EXE): $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
$(BUILD_DIR)%.o: %.c
@ mkdir -p $(BUILD_DIR)
@ mkdir -p $(BUILD_DIR)/obj
@ mkdir -p $(BUILD_DIR)/utilities
@ $(foreach dir, $(SRC_DIRECTORY), mkdir -p $(BUILD_DIR)/$(dir))
@ $(CC) $(CFLAGS) -o $@ -c $<
-include $(DEP)

7
TODO 100644
View File

@ -0,0 +1,7 @@
Add Level Complete:
- When all targets on the level is destroyed
- Print a complete text
- R to reset, continue to return to menu
Add Level start:
- countdown before allow player movement
- Print Go on screen

View File

@ -106,6 +106,7 @@ struct target_obj_node
struct kinematic_obj init_kinematic_obj(int width, int height);
void move(struct kinematic_obj *obj, Vector2 acceleration);
void set_position(struct kinematic_obj *obj, int x, int y);
void set_velocity(struct kinematic_obj *obj, int velx, int vely);
bool place_meeting(struct kinematic_obj *obj, Vector2 dir);
void scale_rect(struct kinematic_obj *obj);
void adjust_hitbox(struct kinematic_obj *obj);
@ -143,6 +144,11 @@ void free_target_list(struct target_obj_node **HEAD);
void add_target_node(struct target_obj *obj, struct target_obj_node **HEAD);
bool collide_target(struct kinematic_obj *obj, struct target_obj *target);
//Menu
void draw_menu();
void main_menu_check();
int get_selected_options();
//Debug stuff, debug.c
void state_string(char *str, enum PLAYER_STATE state);
void display_input(char *dir);

88
main.c
View File

@ -23,29 +23,71 @@
*/
#include "header.h"
#include <sys/time.h>
#include <string.h>
#include <stdio.h>
struct kinematic_obj_node *kinematic_HEAD = NULL;
struct target_obj_node *target_HEAD = NULL;
int PLAYER_ACCEL = 1500;
int JUMP_ACCEL = 15000;
int JUMP_SPD = 350;
int GRAV = 1000;
const int screenWidth = 800;
const int screenHeight = 450;
int main_menu(Camera2D camera);
void play_test_level(Camera2D camera);
int main()
{
// Initialization
//--------------------------------------------------------------------------------------
const int screenWidth = 800;
const int screenHeight = 450;
char current_state[20];
char current_spd[50];
//char dir[7];
InitWindow(screenWidth, screenHeight, "raylib");
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
Camera2D camera = { 0 };
camera.offset = (Vector2){0,0};
camera.rotation = 0.0f;
camera.zoom = 1.0f;
while (!WindowShouldClose()){
int selected = main_menu(camera);
switch(selected){
case 0:
play_test_level(camera);
break;
case 1:
goto quit;
default:
puts("Unknown Command");
goto quit;
}
}
quit: CloseWindow();
}
int main_menu(Camera2D camera){
camera.target = (Vector2){0,0};
while (!WindowShouldClose()) // Detect window close button or ESC key
{
main_menu_check();
if (IsKeyPressed(KEY_SPACE)){
return get_selected_options();
}
BeginDrawing();
ClearBackground(RAYWHITE);
draw_menu();
EndDrawing();
}
}
void play_test_level(Camera2D camera){
struct player_obj player = {
.kinematic = init_kinematic_obj(PLAYER_SIZE, PLAYER_SIZE),
@ -87,14 +129,32 @@ int main()
struct target_obj target = init_target(50, 300);
set_position(&target.kinematic, 300, 100);
add_target_node(&target, &target_HEAD);
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
unsigned int elapsed_time[3] = {0};
char current_state[20];
char current_spd[50];
char current_time[15];
//--------------------------------------------------------------------------------------
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
if (IsKeyPressed(KEY_Q)){
break;
}
if (IsKeyPressed(KEY_R)){
struct target_obj_node *target_current = target_HEAD;
while(target_current){
target_current->obj->destroyed = false;
target_current = target_current->next;
}
set_position(&player.kinematic, 400, 100);
set_velocity(&player.kinematic, 0, 0);
memset(elapsed_time, 0, sizeof(elapsed_time));
//continue;
}
player_input_check(&player);
@ -133,11 +193,20 @@ int main()
//DrawText(dir, 0, 50, 12, BLACK);
sprintf(current_spd, "Velocity: {%.2f,%.2f}", player.kinematic.velocity.x,player.kinematic.velocity.y);
DrawText(current_spd, 350, 0, 12, BLACK);
sprintf(current_time, "%u:%u.%03u", elapsed_time[2], elapsed_time[1], elapsed_time[0]);
DrawText(current_time, 350, 150, 12, BLACK);
EndMode2D();
EndDrawing();
remove_last_afterimage(&player);
//----------------------------------------------------------------------------------
float elapsed = GetFrameTime();
elapsed_time[0] += GetFrameTime() * 1000;
elapsed_time[1] += elapsed_time[0] / 1000;
elapsed_time[0] %= 1000;
elapsed_time[2] += elapsed_time[1] / 60;
elapsed_time[1] %= 60;
}
// De-Initialization
@ -145,8 +214,7 @@ int main()
free_kinematic_list(&kinematic_HEAD);
free_target_list(&target_HEAD);
free_afterimages(&player);
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0;
}
return;
}

View File

@ -23,6 +23,11 @@ void set_position(struct kinematic_obj *obj, int x, int y){
obj->rect.y = y;
};
void set_velocity(struct kinematic_obj *obj, int velx, int vely){
obj->velocity.x = velx;
obj->velocity.y = vely;
};
void move(struct kinematic_obj *obj, Vector2 acceleration){
// Use Euler method for moving
double delta = 1.0/60.0;

View File

@ -1,12 +1,12 @@
#include "header.h"
#include <raymath.h>
#define PLAYER_ACCEL 1600
#define AIR_ACCEL 800
#define RUN_INIT_SPD 230
#define PLAYER_ACCEL 2750
#define AIR_ACCEL 900
#define RUN_INIT_SPD 250
#define JUMP_SPD 350
#define GRAV 1200
#define DASH_SPD 550
#define DASH_SPD 600
#define DEFAULT_JUMP_COUNT 1
static bool allow_move = true;

40
screens/menu.c 100644
View File

@ -0,0 +1,40 @@
#include "header.h"
#include <raymath.h>
static unsigned int option = 0;
const unsigned int max_options = 2;
const char menu_options[2][10] = {"Play", "Exit"};
Vector2 menu_list_pos = (Vector2){200,100};
Vector2 t1 = (Vector2){180, 100};
Vector2 t2 = (Vector2){190, 105};
Vector2 t3 = (Vector2){180, 110};
Vector2 offset = (Vector2){0, 50};
void main_menu_check(){
if (IsKeyPressed(UP))
--option;
if (IsKeyPressed(DOWN))
++option;
}
int get_selected_options(){
return option;
}
void draw_menu(){
DrawFPS(0,0);
for(unsigned int i=0;i<2;++i){
DrawText(menu_options[i], menu_list_pos.x,
menu_list_pos.y + 50 * i, 12, BLACK);
}
//display_input(dir);
//DrawText(dir, 0, 50, 12, BLACK);
// Triangles has to be anticlockwse, because z axis
Vector2 off = Vector2Scale(offset, option);
DrawTriangle(Vector2Add(t1, off), Vector2Add(t3, off), Vector2Add(t2, off), BLACK);
}