Initial commit

master
En Yi 2019-11-23 12:25:57 +08:00
commit a45ef24d5d
7 changed files with 255 additions and 0 deletions

4
.gitignore vendored 100644
View File

@ -0,0 +1,4 @@
Make*
.vscode
main
main.code-workspace

49
include/header.h 100644
View File

@ -0,0 +1,49 @@
#include <raylib.h>
#include <stdio.h>
#define BEZIER_POINTS 25
struct kinematic_obj
{
Rectangle rect;
Vector2 velocity;
Color color;
};
struct squishy_square
{
Vector2 pos;
double width;
double height;
double top_handle;
double bott_handle;
double left_handle;
double right_handle;
};
// Placeholder collision checking structure. Use linked list for now
// Need to implement some sort of tree structure for efficient collision checking
struct obj_node
{
struct kinematic_obj *obj;
struct obj_node *next;
};
extern struct obj_node *HEAD;
// Object functions, kinematics.c
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);
bool place_meeting(struct kinematic_obj *obj, Vector2 dir);
// Math functions, math.c
long mag(Vector2 vec);
int sign(float val);
Vector2 dir(Vector2 vec);
Vector2* three_point_beizer(Vector2 start, Vector2 mid, Vector2 end);
// Linked list, linked_list.c
// Squishy Square functions, squishy.c
void draw_squishy();

101
main.c 100644
View File

@ -0,0 +1,101 @@
/*******************************************************************************************
*
* raylib [core] example - Basic 3d example
*
* Welcome to raylib!
*
* To compile example, just press F5.
* Note that compiled executable is placed in the same folder as .c file
*
* You can find all basic examples on C:\raylib\raylib\examples folder or
* raylib official webpage: www.raylib.com
*
* Enjoy using raylib. :)
*
* This example has been created using raylib 1.0 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
* Copyright (c) 2013-2019 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
#include "header.h"
struct obj_node *HEAD;
int PLAYER_ACCEL = 1500;
int JUMP_ACCEL = 15000;
int GRAV = 750;
int main()
{
// Initialization
//--------------------------------------------------------------------------------------
const int screenWidth = 800;
const int screenHeight = 450;
InitWindow(screenWidth, screenHeight, "raylib");
Camera2D camera = { 0 };
camera.offset = (Vector2){0,0};
camera.rotation = 0.0f;
camera.zoom = 1.0f;
struct kinematic_obj player = init_kinematic_obj(30, 30);
player.color = BLUE;
struct kinematic_obj tile = init_kinematic_obj(900, 100);
set_position(&player, 400, 300);
set_position(&tile, -50, 380);
// TODO: get a linked list implementation
struct obj_node tile_node = {.obj=&tile, .next=NULL};
struct obj_node player_node = {.obj=&player, .next=&tile_node};
HEAD = &player_node;
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
struct obj_node *current;
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
//UpdateCamera(&camera);
Vector2 accel = (Vector2){
.x = PLAYER_ACCEL*(IsKeyDown(KEY_RIGHT)-IsKeyDown(KEY_LEFT)),
.y = 0
};
if (!place_meeting(&player, (Vector2){0,1})){
accel.y = GRAV;
}
accel.x -= player.velocity.x * 6.5;
if (IsKeyDown(KEY_SPACE) && place_meeting(&player, (Vector2){0,1}))
accel.y -= JUMP_ACCEL;
move(&player, accel);
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
BeginMode2D(camera);
current = HEAD;
while(current){
DrawRectangleRec(current->obj->rect, current->obj->color);
current = current->next;
}
DrawFPS(100, 100);
EndMode2D();
EndDrawing();
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0;
}

67
obj/kinematics.c 100644
View File

@ -0,0 +1,67 @@
#include "header.h"
struct kinematic_obj init_kinematic_obj(int width, int height){
struct kinematic_obj obj = {
.velocity = {0.0f,0.0f},
.rect = {0,0,width,height},
.color = BLACK
};
return obj;
};
void set_position(struct kinematic_obj *obj, int x, int y){
obj->rect.x = x;
obj->rect.y = y;
};
void move(struct kinematic_obj *obj, Vector2 acceleration){
// Use Euler method for moving
float delta = 1.0/(float)GetFPS();
obj->velocity.x += acceleration.x * delta;
obj->velocity.y += acceleration.y * delta;
obj->rect.x += obj->velocity.x * delta;
obj->rect.y += obj->velocity.y * delta;
//Simplistic Collision Handling for AABB, Could add coeff of restitution?
struct obj_node *current = HEAD;
Rectangle collide_rect;
while(current != NULL){
if(current->obj != obj){
if (CheckCollisionRecs(obj->rect, current->obj->rect)){
collide_rect = GetCollisionRec(obj->rect, current->obj->rect);
if(collide_rect.width < collide_rect.height){
obj->rect.x -= sign(obj->velocity.x) * collide_rect.width;
obj->velocity.x = 0;
}else{
obj->rect.y -= sign(obj->velocity.y) * collide_rect.height;
obj->velocity.y = 0;
}
}
}
current = current->next;
}
};
bool place_meeting(struct kinematic_obj *obj, Vector2 dir){
struct obj_node *current = HEAD;
Rectangle rect_check = obj->rect;
rect_check.x += dir.x;
rect_check.y += dir.y;
Rectangle collide_rect;
while(current != NULL){
if(current->obj != obj){
collide_rect = GetCollisionRec(rect_check, current->obj->rect);
if (collide_rect.x > 0 || collide_rect.y > 0)
return true;
}
current = current->next;
}
return false;
}
Vector2 center(Rectangle rect){
return (Vector2){
.x = rect.x + rect.width/2,
.y = rect.y + rect.height/2
};
}

6
obj/squishy.c 100644
View File

@ -0,0 +1,6 @@
#include "header.h"
void draw_squishy(struct squishy_square square){
//DrawTriangleFan();
}

View File

28
utilities/math.c 100644
View File

@ -0,0 +1,28 @@
#include "header.h"
#include <math.h>
long mag(Vector2 vec){
return sqrt(vec.x*vec.x + vec.y*vec.y);
}
Vector2 dir(Vector2 vec){
long vec_mag = mag(vec);
return (Vector2){.x = vec.x/vec_mag,.y = vec.y/vec_mag};
}
int sign(float val){
return (val > 0)?1:-1;
}
Vector2* three_point_beizer(Vector2 start, Vector2 mid, Vector2 end){
Vector2 vertices[BEZIER_POINTS];
double t;
double t_prime;
for (int i=0;i<BEZIER_POINTS;++i){
t = i/BEZIER_POINTS;
t_prime = 1-t;
vertices[i].x = t_prime*t_prime*start.x + 2*t_prime*t*mid.x + t*t*end.x;
vertices[i].y = t_prime*t_prime*start.y + 2*t_prime*t*mid.y + t*t*end.y;
}
return vertices;
}