Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #macro TILE_SIZE 16
- #macro TILE_SIZE_M1 15
- #macro TILE_RANGE 50
- #macro NO_COLLISION -4
- // _map is the tilemap id
- function tile_raycast(_x, _y, _rx, _ry, _map)
- {
- // Casts a ray to test for tile collision and returns true or false if found
- _rx -= _x;
- _ry -= _y;
- var _dot0 = _rx * _rx + _ry * _ry,
- _dist = sqrt(_dot0) + 0.00001; // safe normalize
- _rx /= _dist;
- _ry /= _dist;
- var _x_length = _ry/_rx,
- _y_length = _rx/_ry,
- _x_dist = sqrt(1 + _x_length * _x_length),
- _y_dist = sqrt(1 + _y_length * _y_length),
- _x_map = _x div TILE_SIZE,
- _y_map = _y div TILE_SIZE,
- _x_step = sign(_rx),
- _y_step = sign(_ry);
- if (_rx < 0) _x_length = (_x - (_x &~ TILE_SIZE_M1)) / TILE_SIZE * _x_dist;
- else _x_length = ((_x &~ TILE_SIZE_M1) + TILE_SIZE - _x) / TILE_SIZE *_x_dist;
- if (_ry < 0) _y_length = (_y - (_y &~ TILE_SIZE_M1)) / TILE_SIZE * _y_dist;
- else _y_length = ((_y &~ TILE_SIZE_M1) + TILE_SIZE - _y) / TILE_SIZE *_y_dist;
- for (var _d = 0; _d < TILE_RANGE; _d++)
- {
- if (_x_length < _y_length)
- {
- _x_map += _x_step;
- if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID)
- {
- _dist = _x_length * TILE_SIZE;
- _rx *= _dist;
- _ry *= _dist;
- if ((_rx * _rx + _ry * _ry) > _dot0) return false;
- else return true;
- }
- _x_length += _x_dist;
- }
- else
- {
- _y_map += _y_step;
- if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID)
- {
- _dist = _y_length * TILE_SIZE;
- _rx *= _dist;
- _ry *= _dist;
- if ((_rx * _rx + _ry * _ry) > _dot0) return false;
- else return true;
- }
- _y_length += _y_dist;
- }
- }
- return false;
- }
- function tile_raycast_point(_x, _y, _rx, _ry, _map)
- {
- // Casts a ray to (_rx, _ry) and tests for tile collision
- // Returns a point (x, y) if found or NO_COLLISION
- _rx -= _x;
- _ry -= _y;
- var _dot0 = _rx * _rx + _ry * _ry,
- _dist = sqrt(_dot0) + 0.00001; // safe normalize
- _rx /= _dist;
- _ry /= _dist;
- var _x_length = _ry/_rx,
- _y_length = _rx/_ry,
- _x_dist = sqrt(1 + _x_length * _x_length),
- _y_dist = sqrt(1 + _y_length * _y_length),
- _x_map = _x div TILE_SIZE,
- _y_map = _y div TILE_SIZE,
- _x_step = sign(_rx),
- _y_step = sign(_ry);
- if (_rx < 0) _x_length = (_x - (_x &~ TILE_SIZE_M1)) / TILE_SIZE * _x_dist;
- else _x_length = ((_x &~ TILE_SIZE_M1) + TILE_SIZE - _x) / TILE_SIZE *_x_dist;
- if (_ry < 0) _y_length = (_y - (_y &~ TILE_SIZE_M1)) / TILE_SIZE * _y_dist;
- else _y_length = ((_y &~ TILE_SIZE_M1) + TILE_SIZE - _y) / TILE_SIZE *_y_dist;
- for (var _d = 0; _d < TILE_RANGE; _d++)
- {
- if (_x_length < _y_length)
- {
- _x_map += _x_step;
- if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID)
- {
- _dist = _x_length * TILE_SIZE;
- _rx *= _dist;
- _ry *= _dist;
- if ((_rx * _rx + _ry * _ry) > _dot0) return NO_COLLISION;
- else return { x : _x + _rx, y : _y + _ry }
- }
- _x_length += _x_dist;
- }
- else
- {
- _y_map += _y_step;
- if (tilemap_get(_map, _x_map, _y_map) & tile_index_mask == TILE_SOLID)
- {
- _dist = _y_length * TILE_SIZE;
- _rx *= _dist;
- _ry *= _dist;
- if ((_rx * _rx + _ry * _ry) > _dot0) return NO_COLLISION;
- else return { x : _x + _rx, y : _y + _ry }
- }
- _y_length += _y_dist;
- }
- }
- return NO_COLLISION;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement