View difference between Paste ID: JDTx8WCZ and 52zTNYMJ
SHOW: | | - or go back to the newest paste.
1
///***** Cloned from badwrong: https://pastebin.com/52zTNYMJ ******
2
3
#macro TILE_SIZE 16
4
#macro TILE_SIZE_M1 15
5
#macro TILE_RANGE 50
6
#macro NO_COLLISION -4
7
8
// _map is the tilemap id 
9
10
function tile_raycast(_x, _y, _rx, _ry, _map)
11
{	
12
	// Casts a ray to test for tile collision and returns true or false if found
13
	
14
	_rx -= _x;
15
	_ry -= _y;
16
	
17
	var _dot0 = _rx * _rx + _ry * _ry,
18
		_dist = sqrt(_dot0) + 0.00001; // safe normalize
19
20
	_rx /= _dist;
21
	_ry /= _dist;
22
	
23
	var _x_length = _ry/_rx,
24
		_y_length = _rx/_ry,
25
		_x_dist = sqrt(1 + _x_length * _x_length), 
26
		_y_dist = sqrt(1 + _y_length * _y_length),
27
		_x_map  = _x div TILE_SIZE,	
28
		_y_map  = _y div TILE_SIZE,
29
		_x_step = sign(_rx), 
30
		_y_step = sign(_ry);
31
	
32
	if (_rx < 0) _x_length = (_x - (_x &~ TILE_SIZE_M1)) / TILE_SIZE * _x_dist;
33
	else  _x_length = ((_x &~ TILE_SIZE_M1) + TILE_SIZE - _x) / TILE_SIZE *_x_dist;
34
	
35
	if (_ry < 0) _y_length = (_y - (_y &~ TILE_SIZE_M1)) / TILE_SIZE * _y_dist;
36
	else _y_length = ((_y &~ TILE_SIZE_M1) + TILE_SIZE - _y) / TILE_SIZE *_y_dist;
37
		
38
	for (var _d = 0; _d < TILE_RANGE; _d++)
39
	{
40
		if (_x_length < _y_length)
41
		{
42
			_x_map += _x_step;
43
			if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID) 
44
			{
45
				_dist = _x_length * TILE_SIZE;
46
				_rx *= _dist;
47
				_ry *= _dist;
48
				if ((_rx * _rx + _ry * _ry) > _dot0) return false;
49
				else return true;
50
			}
51
			_x_length += _x_dist;	
52
		}
53
		else 
54
		{
55
			_y_map += _y_step;
56
			if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID) 
57
			{
58
				_dist = _y_length * TILE_SIZE;
59
				_rx *= _dist;
60
				_ry *= _dist;
61
				if ((_rx * _rx + _ry * _ry) > _dot0) return false;
62
				else return true;
63
			}
64
			_y_length += _y_dist;
65
		}	
66
	}
67
	return false;
68
}
69
70
function tile_raycast_point(_x, _y, _rx, _ry, _map)
71
{	
72
	// Casts a ray to (_rx, _ry) and tests for tile collision 
73
	// Returns a point (x, y) if found or NO_COLLISION
74
	
75
	_rx -= _x;
76
	_ry -= _y;
77
	
78
	var _dot0 = _rx * _rx + _ry * _ry,
79
		_dist = sqrt(_dot0) + 0.00001; // safe normalize
80
81
	_rx /= _dist;
82
	_ry /= _dist;
83
	
84
	var _x_length = _ry/_rx,
85
		_y_length = _rx/_ry,
86
		_x_dist = sqrt(1 + _x_length * _x_length), 
87
		_y_dist = sqrt(1 + _y_length * _y_length),
88
		_x_map  = _x div TILE_SIZE,	
89
		_y_map  = _y div TILE_SIZE,
90
		_x_step = sign(_rx), 
91
		_y_step = sign(_ry);
92
	
93
	if (_rx < 0) _x_length = (_x - (_x &~ TILE_SIZE_M1)) / TILE_SIZE * _x_dist;
94
	else  _x_length = ((_x &~ TILE_SIZE_M1) + TILE_SIZE - _x) / TILE_SIZE *_x_dist;
95
	
96
	if (_ry < 0) _y_length = (_y - (_y &~ TILE_SIZE_M1)) / TILE_SIZE * _y_dist;
97
	else _y_length = ((_y &~ TILE_SIZE_M1) + TILE_SIZE - _y) / TILE_SIZE *_y_dist;
98
		
99
	for (var _d = 0; _d < TILE_RANGE; _d++)
100
	{
101
		if (_x_length < _y_length)
102
		{
103
			_x_map += _x_step;
104
			if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID) 
105
			{
106
				_dist = _x_length * TILE_SIZE;
107
				_rx *= _dist;
108
				_ry *= _dist;
109
				if ((_rx * _rx + _ry * _ry) > _dot0) return NO_COLLISION;
110
				else return { x : _x + _rx, y : _y + _ry }
111
			}
112
			_x_length += _x_dist;	
113
		}
114
		else 
115
		{
116
			_y_map += _y_step;
117
			if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID) 
118
			{
119
				_dist = _y_length * TILE_SIZE;
120
				_rx *= _dist;
121
				_ry *= _dist;
122
				if ((_rx * _rx + _ry * _ry) > _dot0) return NO_COLLISION;
123
				else return { x : _x + _rx, y : _y + _ry }
124
			}
125
			_y_length += _y_dist;
126
		}	
127
	}
128
	return NO_COLLISION;
129
}
130