Class: MiniGL::GameObject

Inherits:
Sprite
  • Object
show all
Includes:
Movement
Defined in:
lib/minigl/game_object.rb

Overview

This class represents an object with a set of properties and methods commonly used in games. It defines an object with a rectangular bounding box, and having all the attributes required for using the Movement module.

Instance Attribute Summary

Attributes included from Movement

#bottom, #h, #left, #mass, #max_speed, #passable, #prev_speed, #right, #speed, #stored_forces, #top, #w, #x, #y

Attributes inherited from Sprite

#img_index, #x, #y

Instance Method Summary collapse

Methods included from Movement

#bounds, #cycle, #move, #move_carrying, #move_free

Methods inherited from Sprite

#animate

Constructor Details

#initialize(x, y, w, h, img, img_gap = nil, sprite_cols = nil, sprite_rows = nil, mass = 1.0) ⇒ GameObject

Creates a new game object.

Parameters:

x

The x-coordinate of the object’s bounding box. This can be modified later via the x attribute.

y

The y-coordinate of the object’s bounding box. This can be modified later via the y attribute.

w

The width of the object’s bounding box.

h

The height of the object’s bounding box.

img

The image or spritesheet for the object.

img_gap

A Vector object representing the difference between the top left corner of the bounding box and the coordinates of the image. For example, an object with x = 100, y = 50 and img_gap = Vector.new(-5, -5) will be drawn at position (95, 45) of the screen.

sprite_cols

The number of columns in the spritesheet. Use nil if the image is not a spritesheet.

sprite_rows

The number of rows in the spritesheet. Use nil if the image is not a spritesheet.

mass

The mass of the object. Details on how it is used can be found in the Movement module.



140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/minigl/game_object.rb', line 140

def initialize(x, y, w, h, img, img_gap = nil, sprite_cols = nil, sprite_rows = nil, mass = 1.0)
  super x, y, img, sprite_cols, sprite_rows
  @w = w; @h = h
  @img_gap =
    if img_gap.nil?
      Vector.new 0, 0
    else
      img_gap
    end
  @mass = mass
  @speed = Vector.new 0, 0
  @max_speed = Vector.new 15, 15
  @stored_forces = Vector.new 0, 0
end

Instance Method Details

#draw(map = nil, scale_x = 1, scale_y = 1, alpha = 0xff, color = 0xffffff, angle = nil, z_index = 0) ⇒ Object

Draws the game object in the screen.

Parameters:

map

A Map object, relative to which the object will be drawn (the x and y coordinates of the image will be changed according to the position of the camera).

scale_x

A scale factor to be applied horizontally to the image.

scale_y

A scale factor to be applied vertically to the image.

alpha

The opacity with which the image will be drawn. Valid values vary from 0 (fully transparent) to 255 (fully opaque).

color

A color filter to apply to the image. A white (0xffffff) filter will keep all colors unchanged, while a black (0x000000) filter will turn all colors to black. A red (0xff0000) filter will keep reddish colors with slight or no change, whereas bluish colors will be darkened, for example.

angle

A rotation, in degrees, to be applied to the image, relative to its center.

z_index

The z-order to draw the object. Objects with larger z-orders will be drawn on top of the ones with smaller z-orders.



185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/minigl/game_object.rb', line 185

def draw(map = nil, scale_x = 1, scale_y = 1, alpha = 0xff, color = 0xffffff, angle = nil, z_index = 0)
  color = (alpha << 24) | color
  if map
    if angle
      @img[@img_index].draw_rot @x.round + @img_gap.x - map.cam.x,
                                @y.round + @img_gap.y - map.cam.y,
                                z_index, angle, 0.5, 0.5, scale_x, scale_y, color
    else
      @img[@img_index].draw @x.round + @img_gap.x - map.cam.x, @y.round + @img_gap.y - map.cam.y, z_index, scale_x, scale_y, color
    end
  elsif angle
    @img[@img_index].draw_rot @x.round + @img_gap.x, @y.round + @img_gap.y, z_index, angle, 0.5, 0.5, scale_x, scale_y, color
  else
    @img[@img_index].draw @x.round + @img_gap.x, @y.round + @img_gap.y, z_index, scale_x, scale_y, color
  end
end

#set_animation(index) ⇒ Object

Resets the animation timer and immediately changes the image index to the specified value.

Parameters:

index

The image index to be set.



160
161
162
163
164
# File 'lib/minigl/game_object.rb', line 160

def set_animation(index)
  @anim_counter = 0
  @img_index = index
  @index_index = 0
end

#visible?(map = nil) ⇒ Boolean

Returns whether this object is visible in the given map (i.e., in the viewport determined by the camera of the given map). If no map is given, returns whether the object is visible on the screen.

Returns:

  • (Boolean)


205
206
207
208
209
# File 'lib/minigl/game_object.rb', line 205

def visible?(map = nil)
  r = Rectangle.new @x.round + @img_gap.x, @y.round + @img_gap.y, @img[0].width, @img[0].height
  return Rectangle.new(0, 0, G.window.width, G.window.height).intersect? r if map.nil?
  map.cam.intersect? r
end