-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathExample_-_MapSmoothplayer.c
147 lines (121 loc) · 5.35 KB
/
Example_-_MapSmoothplayer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "raylib.h"
// This is our tile map.
int map[10][20] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1},
{1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
{1,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
static float tileWidth;
static float tileHeight;
static int mapWidth;
static int mapHeight;
typedef struct player{
Vector2 position;
int width;
int height;
}player;
static player myplayer = {0};
// uses the myplayer.position coordinates.
// If offsetx is 1 then it checks if the player x position PLus 1 is colliding with a tile.
static bool playertilecollide(int offsetx,int offsety);
static bool rectsoverlap(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2);
int main(void)
{
// Initialization
//--------------------------------------------------------------------------------------
const int screenWidth = 800;
const int screenHeight = 450;
mapWidth = 20;
mapHeight = 10;
// Our tile width and height. We use the screen dimension and the map dimension to
// get tile dimensions that fill up the entire screen.
tileWidth = (float)screenWidth/(float)mapWidth;
tileHeight = (float)screenHeight/(float)mapHeight;
InitWindow(screenWidth, screenHeight, "raylib example.");
// Our player setup
myplayer.position = (Vector2){4*tileWidth,6*tileHeight};
myplayer.width = tileWidth/2;
myplayer.height = tileHeight/2;
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
// Below here we read the key. If the l/r/u/d cursor is pressed then we check the new position is inside
// the array bounds and then we check if the collision map on the new position is not set to flag true on that tile.
if(IsKeyDown(KEY_RIGHT)&& myplayer.position.x+1<(mapWidth-1)*tileWidth){
if(playertilecollide(1,0)==false){
myplayer.position.x+=1;
}
}
if(IsKeyDown(KEY_LEFT) && myplayer.position.x-1>-1){
if(playertilecollide(-1,0)==false){
myplayer.position.x-=1;
}
}
if(IsKeyDown(KEY_UP)&& myplayer.position.y-1>-1){
if(playertilecollide(0,-1)==false){
myplayer.position.y-=1;
}
}
if(IsKeyDown(KEY_DOWN) && myplayer.position.y+1<(mapHeight-1)*tileHeight){
if(playertilecollide(0,1)==false){
myplayer.position.y+=1;
}
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
// Draw our tilemap.
for(int y=0;y<10;y++){
for(int x=0;x<20;x++){
if(map[y][x]==1){
DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,BLACK);
}
}
}
// Draw our player
DrawRectangle(myplayer.position.x,myplayer.position.y,myplayer.width,myplayer.height,RED);
DrawText("Use Cursor Keys to move around..",0,0,20,WHITE);
EndDrawing();
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0;
}
//Unit collide with solid blocks true/false
bool playertilecollide(int offsetx,int offsety){
int cx = (myplayer.position.x+offsetx)/tileWidth;
int cy = (myplayer.position.y+offsety)/tileHeight;
for(int y2=cy-1; y2<cy+2;y2++){//Note that the - and + are to be set differently with differently sized players
for(int x2=cx-1; x2<cx+2;x2++){
if(x2>=0 && x2<mapWidth && y2>=0 && y2<mapHeight){
if(map[y2][x2] == 1){
int x3 = (x2)*tileWidth;
int y3 = (y2)*tileHeight;
if(rectsoverlap(myplayer.position.x+offsetx,myplayer.position.y+offsety,myplayer.width,myplayer.height,x3,y3,tileWidth,tileHeight)){
return true;
}
}
}
}}
return false;
}
// Rectangles overlap
bool rectsoverlap(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){
if(x1 >= (x2 + w2) || (x1 + w1) <= x2) return false;
if(y1 >= (y2 + h2) || (y1 + h1) <= y2) return false;
return true;
}