c moving ball
This commit is contained in:
commit
da381fa32c
4 changed files with 162 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
c-moving-ball/raylib.h
|
||||||
|
c-moving-ball/wasm.sh
|
||||||
|
c-moving-ball/wasm
|
||||||
|
c-moving-ball/game
|
137
c-moving-ball/main.c
Normal file
137
c-moving-ball/main.c
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Gist accompanying https://alloca.space/blog/c-lang.html
|
||||||
|
|
||||||
|
Build and Run
|
||||||
|
-------------
|
||||||
|
|
||||||
|
1. Install a C compiler and https://raylib.com on your system
|
||||||
|
|
||||||
|
2. Build and run with:
|
||||||
|
|
||||||
|
cc main.c -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o game && ./game
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
/* Constants */
|
||||||
|
|
||||||
|
#define FPS 60
|
||||||
|
#define SCREEN_WIDTH 640
|
||||||
|
#define SCREEN_HEIGHT 480
|
||||||
|
#define BALL_SPEED 200
|
||||||
|
#define BALL_RADIUS 50
|
||||||
|
|
||||||
|
/* Data types */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
} V2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
V2 position;
|
||||||
|
float radius;
|
||||||
|
V2 direction;
|
||||||
|
Color color;
|
||||||
|
} Ball;
|
||||||
|
|
||||||
|
/* Functions */
|
||||||
|
|
||||||
|
Ball* createBall();
|
||||||
|
void swing(int *position, int *direction, int min, int max);
|
||||||
|
void swingBall(Ball* ball);
|
||||||
|
void applyKeys(Ball* ball);
|
||||||
|
void updateBall(Ball* ball);
|
||||||
|
void initialize();
|
||||||
|
|
||||||
|
/* Main */
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
initialize();
|
||||||
|
|
||||||
|
Ball* ball = createBall();
|
||||||
|
Color background_color = { 0x08, 0x18, 0x29, 0xff };
|
||||||
|
|
||||||
|
// Game loop
|
||||||
|
while (!WindowShouldClose()) {
|
||||||
|
// Update
|
||||||
|
updateBall(ball);
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(background_color);
|
||||||
|
DrawCircle((*ball).position.x, (*ball).position.y, (*ball).radius, (*ball).color);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
free(ball);
|
||||||
|
CloseWindow();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize window */
|
||||||
|
|
||||||
|
void initialize() {
|
||||||
|
SetConfigFlags(FLAG_MSAA_4X_HINT);
|
||||||
|
InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "alloca.space - The C Programming Language");
|
||||||
|
SetTargetFPS(FPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ball */
|
||||||
|
|
||||||
|
Ball* createBall() {
|
||||||
|
Ball ball_value = {
|
||||||
|
.position = {
|
||||||
|
.x = SCREEN_WIDTH/3,
|
||||||
|
.y = SCREEN_HEIGHT/3,
|
||||||
|
},
|
||||||
|
.radius = BALL_RADIUS,
|
||||||
|
.direction = {
|
||||||
|
.x = 1,
|
||||||
|
.y = 1,
|
||||||
|
},
|
||||||
|
.color = { 0xf9, 0x92, 0x26, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
Ball* ball = (Ball*)malloc(sizeof(Ball));
|
||||||
|
*ball = ball_value;
|
||||||
|
|
||||||
|
return ball;
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateBall(Ball* ball) {
|
||||||
|
applyKeys(ball);
|
||||||
|
swingBall(ball);
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyKeys(Ball* ball) {
|
||||||
|
if (IsKeyDown(KEY_D)) { (*ball).direction.x = 1; }
|
||||||
|
if (IsKeyDown(KEY_A)) { (*ball).direction.x = -1; }
|
||||||
|
if (IsKeyDown(KEY_S)) { (*ball).direction.y = 1; }
|
||||||
|
if (IsKeyDown(KEY_W)) { (*ball).direction.y = -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void swingBall(Ball* ball) {
|
||||||
|
swing(&(*ball).position.x, &(*ball).direction.x, 0 + (*ball).radius, SCREEN_WIDTH - (*ball).radius);
|
||||||
|
swing(&(*ball).position.y, &(*ball).direction.y, 0 + (*ball).radius, SCREEN_HEIGHT - (*ball).radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
void swing(int *position, int *direction, int min, int max) {
|
||||||
|
if (*position <= min) {
|
||||||
|
*position = min;
|
||||||
|
*direction = 1;
|
||||||
|
}
|
||||||
|
else if (*position >= max) {
|
||||||
|
*position = max;
|
||||||
|
*direction = -1;
|
||||||
|
}
|
||||||
|
float dt = GetFrameTime();
|
||||||
|
*position += *direction * (BALL_SPEED * dt);
|
||||||
|
}
|
2
c-moving-ball/run.sh
Executable file
2
c-moving-ball/run.sh
Executable file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
cc main.c -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o game && ./game
|
19
license.txt
Normal file
19
license.txt
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
zlib License
|
||||||
|
|
||||||
|
(C) 2025 alloca.space
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
Loading…
Add table
Reference in a new issue