SFML/ruby/RubySFML/RubySFML.rb

84 lines
2.0 KiB
Ruby

require "RubySFML.so"
module SFML
# A simple class for dealing with tiled sprites.
class TSprite < Sprite
# Use to set/get the tile column
attr_accessor :tx
# Use to set/get the tile row
attr_accessor :ty
# Pass in the image, the tile width, and the tile height.
def initialize(image, w, h)
super(image)
@tx, @ty, @tw, @th = 0, 0, w, h
setRotationCenter(@tw/2, @th/2)
end
# Overrides Sprite::render to call setSubRect() for you to choose a
# tile based on tx and ty before the sprite is rendered.
def render(win)
l, t = @tw*@tx, @th*@ty
setSubRect(IntRect.new(l, t, l+@tw, t+@th))
super(win)
end
end
# A simple class for dealing with sprites and 2D velocity/acceleration
class VSprite < TSprite
# Use to get/set the x component of the velocity vector
attr_accessor :vx
# Use to get/set the y component of the velocity vector
attr_accessor :vy
# Pass in the image, the tile width, and the tile height.
def initialize(image, w, h)
super(image, w, h)
@vx = @vy = 0.0
end
# Specify a number of degrees to rotate left
def turn_left(degrees) rotate(degrees); end
# Specify a number of degrees to rotate right
def turn_right(degrees) rotate(-degrees); end
# Returns the magnitude of the velocity vector
def speed
return Math.sqrt(@vx**2 + @vy**2)
end
# Returns the direction of the velocity vector
def direction
s = speed
return [@vx/s, @vy/s]
end
# Accelerates the sprite in the direction vector v by the amount "thrust"
def accelerate(v, thrust)
@vx += v[0] * thrust
@vy += v[1] * thrust
end
# Scales the speed component of the velocity
def scale_speed(amount)
@vx *= amount
@vy *= amount
end
# Moves the sprite in the direction vector v by the amound d
def move(v, d)
self.x += v[0] * d
self.y += v[1] * d
end
# Updates the sprite's position based on its velocity and its time slice
def update(time)
self.x += @vx * time
self.y += @vy * time
end
end
end