Move forward


Setup

Scripts

move_forward.script

go.property("acceleration", 100)
go.property("deceleration", 200)
go.property("max_speed", 400)
go.property("rotation_speed", 180)

-- unit vector pointing up
local UP = vmath.vector3(0, 1, 0)

function init(self)
	-- make sure the script will receive user input
	msg.post(".", "acquire_input_focus")

	-- movement input
	self.input = vmath.vector3()

	-- the current speed (pixels/second)
	self.speed = 0
end

function update(self, dt)
	-- accelerating?
	if self.input.y > 0 then
		-- increase speed
		self.speed = self.speed + self.acceleration * dt
		-- cap speed
		self.speed = math.min(self.speed, self.max_speed)
	else
		-- decrease speed when not accelerating
		self.speed = self.speed - self.deceleration * dt
		self.speed = math.max(self.speed, 0)
	end

	-- apply rotation based on self.input.x (left/right)
	local rot = go.get_rotation()
	-- amount to rotate (in radians)
	local rot_amount = math.rad(self.rotation_speed * self.input.x * dt)
	-- apply rotation as a quaternion created from a rotation of 'rot_amount' degrees around the z-axis
	rot = rot * vmath.quat_rotation_z(rot_amount)
	go.set_rotation(rot)

	-- move the game object
	local p = go.get_position()
	-- amount to move (pixels)
	local move_amount = UP * self.speed * dt
	-- apply rotation to movement vector to move game object in the direction of rotation
	p = p + vmath.rotate(rot, move_amount)
	go.set_position(p)

	-- reset input
	self.input = vmath.vector3()
end

function on_input(self, action_id, action)
	-- update direction of movement based on currently pressed keys
	if action_id == hash("up") then
		self.input.y = 1
	elseif action_id == hash("down") then
		self.input.y = -1
	elseif action_id == hash("left") then
		self.input.x = 1
	elseif action_id == hash("right") then
		self.input.x = -1
	end
end

If you want to play with these examples, you can get the project on Github.

Do you want to see more examples? Why not write a few yourself and submit a pull request? We love contributions.

GITHUB