GMR::Collision

January 9, 2026 ยท View on GitHub

GMR Docs > Engine > Utilities > Collision

GMR::Collision

Collision detection between shapes.

Table of Contents

Functions

point_in_rect?

Check if a point is inside a rectangle.

Parameters:

NameTypeDescription
pxFloatPoint X coordinate
pyFloatPoint Y coordinate
rxFloatRectangle X position (top-left)
ryFloatRectangle Y position (top-left)
rwFloatRectangle width
rhFloatRectangle height

Returns: Boolean - true if the point is inside the rectangle

Example:

if GMR::Collision.point_in_rect?(mouse_x, mouse_y, btn.x, btn.y, btn.w, btn.h)
  button_hovered = true
end

point_in_circle?

Check if a point is inside a circle.

Parameters:

NameTypeDescription
pxFloatPoint X coordinate
pyFloatPoint Y coordinate
cxFloatCircle center X coordinate
cyFloatCircle center Y coordinate
radiusFloatCircle radius

Returns: Boolean - true if the point is inside the circle

Example:

if GMR::Collision.point_in_circle?(x, y, orb.x, orb.y, orb.radius)
  orb.collect
end

rect_overlap?

Check if two rectangles overlap (AABB collision).

Parameters:

NameTypeDescription
x1FloatFirst rectangle X position
y1FloatFirst rectangle Y position
w1FloatFirst rectangle width
h1FloatFirst rectangle height
x2FloatSecond rectangle X position
y2FloatSecond rectangle Y position
w2FloatSecond rectangle width
h2FloatSecond rectangle height

Returns: Boolean - true if the rectangles overlap

Example:

if GMR::Collision.rect_overlap?(player.x, player.y, 32, 48,
                                         platform.x, platform.y, 64, 16)
  player.on_ground = true
end

rect_contains?

Check if the outer rectangle fully contains the inner rectangle.

Parameters:

NameTypeDescription
outer_xFloatOuter rectangle X position
outer_yFloatOuter rectangle Y position
outer_wFloatOuter rectangle width
outer_hFloatOuter rectangle height
inner_xFloatInner rectangle X position
inner_yFloatInner rectangle Y position
inner_wFloatInner rectangle width
inner_hFloatInner rectangle height

Returns: Boolean - true if the inner rectangle is fully inside the outer rectangle

Example:

if GMR::Collision.rect_contains?(screen_x, screen_y, screen_w, screen_h,
                                          entity.x, entity.y, entity.w, entity.h)
  entity.draw  # Only draw if fully on screen
end

circle_overlap?

Check if two circles overlap.

Parameters:

NameTypeDescription
x1FloatFirst circle center X
y1FloatFirst circle center Y
r1FloatFirst circle radius
x2FloatSecond circle center X
y2FloatSecond circle center Y
r2FloatSecond circle radius

Returns: Boolean - true if the circles overlap

Example:

if GMR::Collision.circle_overlap?(ball1.x, ball1.y, ball1.r,
                                           ball2.x, ball2.y, ball2.r)
  bounce_balls(ball1, ball2)
end

circle_rect_overlap?

Check if a circle overlaps with a rectangle.

Parameters:

NameTypeDescription
cxFloatCircle center X
cyFloatCircle center Y
crFloatCircle radius
rxFloatRectangle X position
ryFloatRectangle Y position
rwFloatRectangle width
rhFloatRectangle height

Returns: Boolean - true if the circle and rectangle overlap

Example:

if GMR::Collision.circle_rect_overlap?(ball.x, ball.y, ball.r,
                                                 wall.x, wall.y, wall.w, wall.h)
  ball.bounce
end

rect_tiles

Get all tile coordinates that a rectangle overlaps. Useful for tile-based collision detection.

Parameters:

NameTypeDescription
xFloatRectangle X position
yFloatRectangle Y position
wFloatRectangle width
hFloatRectangle height
tile_sizeIntegerSize of each tile in pixels

Returns: Array<Array<Integer>> - Array of [tx, ty] tile coordinate pairs

Example:

tiles = GMR::Collision.rect_tiles(player.x, player.y, 32, 48, 16)
  tiles.each do |tx, ty|
    if tilemap.solid?(tx, ty)
      # Handle collision with this tile
    end
  end

tile_rect

Convert tile coordinates to a world-space rectangle.

Parameters:

NameTypeDescription
txIntegerTile X coordinate
tyIntegerTile Y coordinate
tile_sizeIntegerSize of each tile in pixels

Returns: Array<Integer> - Rectangle as [x, y, width, height]

Example:

x, y, w, h = GMR::Collision.tile_rect(5, 3, 16)
  # Returns [80, 48, 16, 16]

tilemap_resolve

Resolve collision between a hitbox rectangle and a tilemap's solid tiles. Returns a CollisionResult object with resolved position and collision flags. This is the recommended way to handle character-tilemap collisions in platformers.

Parameters:

NameTypeDescription
tilemapTilemapThe tilemap to check collision against
xFloatHitbox X position in tilemap local coordinates
yFloatHitbox Y position in tilemap local coordinates
wFloatHitbox width
hFloatHitbox height
vxFloatCurrent X velocity (for directional checks)
vyFloatCurrent Y velocity (for directional checks)

Returns: CollisionResult - Collision result with position, velocity, and collision flags

Example:

# In update loop:
  local_x = @sprite.x + HITBOX_OFFSET_X - MAP_OFFSET_X
  local_y = @sprite.y + HITBOX_OFFSET_Y - MAP_OFFSET_Y
  result = Collision.tilemap_resolve(@tilemap, local_x, local_y, HITBOX_W, HITBOX_H, @vx, @vy)

distance

Calculate the Euclidean distance between two points.

Parameters:

NameTypeDescription
x1FloatFirst point X
y1FloatFirst point Y
x2FloatSecond point X
y2FloatSecond point Y

Returns: Float - Distance between the points

Example:

dist = GMR::Collision.distance(player.x, player.y, enemy.x, enemy.y)
  if dist < attack_range
    attack_enemy(enemy)
  end

distance_squared

Calculate the squared distance between two points. Faster than distance() since it avoids the square root. Use for comparisons.

Parameters:

NameTypeDescription
x1FloatFirst point X
y1FloatFirst point Y
x2FloatSecond point X
y2FloatSecond point Y

Returns: Float - Squared distance between the points

Example:

# More efficient for distance comparisons
  dist_sq = GMR::Collision.distance_squared(a.x, a.y, b.x, b.y)
  if dist_sq < range * range
    in_range = true
  end


Back to Utilities | Documentation Home