2D Space Shooter Part 4: Player
It is time to make our ship controllable. Since only the player's ship will be controllable, let's make a subclass of our generic Ship to handle that. We will call it 'PlayerShip'.
Go ahead and create a new file named player.lua, this new file will depend on the Ship class. There are two methods to implement code dependency in Gideros Studio:
- right click on the file name and access 'Code dependencies'. From there tell Gideros that player.lua will depend on ships.lua
- by code by adding --!NEEDS:your_file.lua at the top of a file
Player control
The code of this file is rather simple: we register mouse events and react upon them:
--!NEEDS:ships.lua
PlayerShip = Core.class(Ship)
function PlayerShip:init()
self:addEventListener(Event.MOUSE_DOWN, self.onMouseDown, self)
self:addEventListener(Event.MOUSE_UP, self.onMouseUp, self)
self:addEventListener(Event.MOUSE_MOVE, self.onMouseMove, self)
self:addEventListener(Event.MOUSE_HOVER, self.onMouseMove, self)
end
function PlayerShip:destroy()
self:removeEventListener(Event.MOUSE_DOWN, self.onMouseDown, self)
self:removeEventListener(Event.MOUSE_UP, self.onMouseUp, self)
self:removeEventListener(Event.MOUSE_MOVE, self.onMouseMove, self)
self:removeEventListener(Event.MOUSE_HOVER, self.onMouseMove, self)
-- call the inherited destructor
Ship.destroy(self)
end
function PlayerShip:onMouseDown(event)
self.fire=true -- start firing
end
function PlayerShip:onMouseUp(event)
self.fire=false -- stop firing
end
function PlayerShip:onMouseMove(event)
-- clamp the player ship position to something in the screen
local x = (event.x<>(SCR_LEFT+64))><(SCR_RIGHT-64)
local y = (event.y<>(SCR_TOP+64))><(SCR_BOTTOM-64)
self:setPosition(x, y)
end
Notice how we explicitly call the Ship.destroy() function from our subclass. Also note another use of the <> et >< Gideros operators when clamping the player ship position on screen.
Using our controllable ship
This is were OOP really shines. The only thing you need to do to make the ship you added to main.lua controllable is just to instanciate a PlayerShip instead of a generic Ship. In main.lua, change:
local player = Ship.new()
into:
local player = PlayerShip.new()
Prev.: 2D_Space_Shooter_Part_3:_Ships
Next: 2D Space Shooter Part 5: Firing
Tutorial - Making a 2D space shooter game