-
Notifications
You must be signed in to change notification settings - Fork 10
/
Collision_-_RectTileMAPCollide.c
136 lines (110 loc) · 4.42 KB
/
Collision_-_RectTileMAPCollide.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
//
// POINTTILECOLLIDE function
//
// Here is a example of how to check collision with a point and a tile on a tilemap.
//
#include "raylib.h"
#include <math.h>
#define MAX_CARS 100
#define MAX_WHISKERS 8
int myMap[10][11] = { {1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,1},
{1,0,1,1,1,1,1,1,1,0,1},
{1,0,1,1,1,1,1,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1},
{1,0,1,0,1,0,1,0,0,0,1},
{1,0,1,0,1,0,1,1,1,0,1},
{1,0,1,0,1,0,1,1,1,0,1},
{1,0,0,0,1,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1}
};
int mapWidth = 11;
int mapHeight = 10;
float tileWidth;
float tileHeight;
//Unit collide with solid blocks true/false
bool recttilecollide(int x, int y, int w, int h, int offsetx,int offsety);
// Our rectsoverlap function. Returns true/false.
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 = 600;
tileWidth = ceil((float)(float)screenWidth/(float)mapWidth);
tileHeight = ceil((float)screenHeight/(float)mapHeight);
InitWindow(screenWidth, screenHeight, "raylib example.");
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
Vector2 position;
position.x = 100;
position.y = 100;
int time=0;
Color collisionColor = GREEN;
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
time++;
if(time>30){ // every time time is at 300
time=0;//reset time
position.x = GetRandomValue(32,screenWidth-32);
position.y = GetRandomValue(32,screenHeight-32);
}
if(recttilecollide(position.x,position.y,tileWidth/2, tileHeight/2, 0,0)){
collisionColor = RED;
}else{
collisionColor = GREEN;
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
// Draw map
for (int y = 0; y< mapHeight ; y++)
{
for (int x = 0; x< mapWidth ; x++)
{
if (myMap[y][x] == 1)
{
DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,BLUE);
}
}
}
DrawRectangle(position.x,position.y,tileWidth/2,tileHeight/2,collisionColor);
EndDrawing();
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0;
}
//Unit collide with solid blocks true/false
bool recttilecollide(int x, int y,int w, int h, int offsetx,int offsety){
int cx = (x+offsetx)/tileWidth;
int cy = (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(myMap[y2][x2] == 1){
int x3 = (x2)*tileWidth;
int y3 = (y2)*tileHeight;
if(rectsoverlap(x+offsetx,y+offsety,w,h,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;
}