Difference between revisions of "Mobile Controls"
From GiderosMobile
m (Text replacement - "<source" to "<syntaxhighlight") |
|||
(One intermediate revision by one other user not shown) | |||
Line 136: | Line 136: | ||
end) | end) | ||
end | end | ||
− | </ | + | </syntaxhighlight> |
=== Mobile Controls Class (second option) === | === Mobile Controls Class (second option) === | ||
Line 336: | Line 336: | ||
end) | end) | ||
end | end | ||
− | </ | + | </syntaxhighlight> |
=== Usage === | === Usage === | ||
Line 344: | Line 344: | ||
local mymobile = Mobile.new(self.player1) | local mymobile = Mobile.new(self.player1) | ||
self:addChild(mymobile) | self:addChild(mymobile) | ||
− | </ | + | </syntaxhighlight> |
+ | |||
{{GIDEROS IMPORTANT LINKS}} | {{GIDEROS IMPORTANT LINKS}} |
Latest revision as of 22:51, 18 November 2023
Here you will find various resources to help you create games and apps in Gideros Studio.
note: you may have to provide your own assets (fonts, gfx, …)
Description
Here are two classes which allow you to control your player, on your mobile device, using touch buttons.
It has 4 buttons: right, left, A, B but you can add more.
note: the first class uses the UI_Buttons#Button_with_Text class, but you are free to use any other kind of buttons
Sample image:
Mobile Controls Class (first option)
This is the first option to add mobile controls to your game.
Mobile = Core.class(Sprite)
function Mobile:init(xplayer1)
self:myButtons(xplayer1)
end
-- BUTTONS/TOUCH HANDLER
function Mobile:myButtons(xplayer1)
--function ButtonText:init(text, tfont, tcolor, tscalex, tscaley, upState, downState)
local mybtnright = ButtonText.new(">", nil, 0xffffff, 12, 8)
mybtnright:setPosition(myappwidth - mybtnright:getWidth() / 2, myappheight)
self:addChild(mybtnright)
local mybtnleft = ButtonText.new("<", nil, 0xffffff, 12, 8)
mybtnleft:setPosition(myappwidth - mybtnleft:getWidth() / 2 - mybtnright:getWidth() - 32, myappheight)
self:addChild(mybtnleft)
local mybtnA = ButtonText.new("A", nil, 0xffffff, 8, 8)
mybtnA:setPosition(mybtnA:getWidth() / 2, myappheight)
self:addChild(mybtnA)
local mybtnB = ButtonText.new("B", nil, 0xffffff, 8, 8)
mybtnB:setPosition(mybtnB:getWidth() / 2 + mybtnA:getWidth() + 8, myappheight - 24)
self:addChild(mybtnB)
-- buttons listenners
-- right
mybtnright:addEventListener(Event.TOUCHES_BEGIN, function(e)
if mybtnright:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyright = true
xplayer1.iskeyleft = false
end
end)
mybtnright:addEventListener(Event.TOUCHES_END, function(e)
if mybtnright:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyright = false
end
end)
mybtnright:addEventListener(Event.TOUCHES_CANCEL, function(e)
if mybtnright:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyright = false
end
end)
mybtnright:addEventListener(Event.TOUCHES_MOVE, function(e)
if mybtnleft:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyright = false
xplayer1.iskeyleft = true
end
end)
-- left
mybtnleft:addEventListener(Event.TOUCHES_BEGIN, function(e)
if mybtnleft:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyleft = true
xplayer1.iskeyright = false
end
end)
mybtnleft:addEventListener(Event.TOUCHES_END, function(e)
if mybtnleft:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyleft = false
end
end)
mybtnleft:addEventListener(Event.TOUCHES_CANCEL, function(e)
if mybtnleft:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyleft = false
end
end)
mybtnleft:addEventListener(Event.TOUCHES_MOVE, function(e)
if mybtnright:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyleft = false
xplayer1.iskeyright = true
end
end)
-- A (down)
mybtnA:addEventListener(Event.TOUCHES_BEGIN, function(e)
if mybtnA:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeydown = true
end
end)
mybtnA:addEventListener(Event.TOUCHES_END, function(e)
if mybtnA:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeydown = false
end
end)
mybtnA:addEventListener(Event.TOUCHES_CANCEL, function(e)
if mybtnA:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeydown = false
end
end)
mybtnA:addEventListener(Event.TOUCHES_MOVE, function(e)
if mybtnB:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeydown = false
xplayer1.iskeyup = true
end
end)
-- B (jump)
mybtnB:addEventListener(Event.TOUCHES_BEGIN, function(e)
if mybtnB:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyup = true
end
end)
mybtnB:addEventListener(Event.TOUCHES_END, function(e)
if mybtnB:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyup = false
end
end)
mybtnB:addEventListener(Event.TOUCHES_CANCEL, function(e)
if mybtnB:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyup = false
end
end)
mybtnB:addEventListener(Event.TOUCHES_MOVE, function(e)
if mybtnA:hitTestPoint(e.touch.x, e.touch.y) then
xplayer1.iskeyup = false
xplayer1.iskeydown = true
end
end)
end
Mobile Controls Class (second option)
This is the second option to add mobile controls to your game.
-- ***************************************
--[[
v.3.1
(c)Oleg Simonenko
simartinfo.blogspot.com
github.com/razorback456/gideros_tools
]]
-- ***************************************
ButtonOleg = gideros.class(Sprite)
function ButtonOleg:init(xtext, xcolor, xscalex, xscaley, xalpha)
self.textalpha = xalpha or nil
self.text = TextField.new(nil, xtext)
self.text:setTextColor(xcolor or 0x0)
self.text:setScale(xscalex, xscaley)
self.text:setAlpha(self.textalpha or 0)
self:addChild(self.text)
-- listeners
self:addEventListener(Event.TOUCHES_BEGIN, self.onTouchesBegin, self)
self:addEventListener(Event.TOUCHES_MOVE, self.onTouchesMove, self)
self:addEventListener(Event.TOUCHES_END, self.onTouchesEnd, self)
end
function ButtonOleg:onTouchesBegin(e)
if self:hitTestPoint(e.touch.x, e.touch.y) then
self:dispatchEvent(Event.new("clickDown"))
if self.textalpha then
local tempalpha = self.textalpha + 0.2
self.text:setAlpha(tempalpha)
end
end
end
function ButtonOleg:onTouchesMove(e)
if self:hitTestPoint(e.touch.x, e.touch.y) then
local clickMove = Event.new("clickMove")
self:dispatchEvent(clickMove)
if self.textalpha then
local tempalpha = self.textalpha + 0.2
self.text:setAlpha(tempalpha)
end
end
end
function ButtonOleg:onTouchesEnd(e)
if self:hitTestPoint(e.touch.x, e.touch.y) then
self:dispatchEvent(Event.new("clickUp"))
if self.textalpha then
local tempalpha = self.textalpha
self.text:setAlpha(tempalpha)
end
end
end
-- ************************
-- *** 2 PADS DIRECTION ***
-- ************************
MobileXv1 = Core.class(Sprite)
function MobileXv1:init(xhero)
-- local variables
local scalex, scaley = 26, 22 -- 18, 14
local alpha = 0.25 -- 0.15
-- left pad buttons
local btnup = ButtonOleg.new("O", 0xffffff, scalex - 2, scaley, alpha) -- UP (B)
btnup:setPosition(myappleft, myappbot - btnup:getHeight())
self:addChild(btnup)
local btndown = ButtonOleg.new("O", 0xffffff, scalex - 2, scaley, alpha) -- DOWN (A)
btndown:setPosition(myappleft, myappbot)
self:addChild(btndown)
local btnX = ButtonOleg.new("X", 0xff0000, scalex - 0, scaley, alpha) -- SPACE (X)
btnX:setPosition(myappleft + btnX:getWidth(), myappbot - btnX:getHeight() / 2)
self:addChild(btnX)
-- buttons CANCELLER -- LEFT PAD
local btnscanceller1 = ButtonOleg.new("O", 0xffffff, scalex * 4, scaley * 3, nil) -- nil, 1
btnscanceller1:setPosition(myappleft, myappbot)
self:addChild(btnscanceller1)
-- right pad buttons
local btnleft = ButtonOleg.new("O", 0xffffff, scalex + 5, scaley + 3, alpha) -- LEFT
btnleft:setPosition(myappright - 2 * btnleft:getWidth() - 8, myappbot)
self:addChild(btnleft)
local btnright = ButtonOleg.new("O", 0xffffff, scalex + 5, scaley + 3, alpha) -- RIGHT
btnright:setPosition(myappright - btnright:getWidth() - 8, myappbot)
self:addChild(btnright)
-- buttons CANCELLER -- RIGHT PAD
local btnscanceller2 = ButtonOleg.new("O", 0xffffff, scalex * 4, scaley * 3, nil) -- nil, 1
btnscanceller2:setPosition(myappright + myappleft - btnscanceller2:getWidth(), myappbot)
self:addChild(btnscanceller2)
-- listeners
-- CANCELLERS
btnscanceller1:addEventListener("clickMove", function(e) -- BUTTON CANCELLER 1
-- e:stopPropagation()
xhero.isup = false
xhero.isdown = false
xhero.isaction1 = false
end)
btnscanceller2:addEventListener("clickMove", function(e) -- BUTTON CANCELLER 2
-- e:stopPropagation()
xhero.isright = false
xhero.isleft = false
end)
-- BUTTONS
btnup:addEventListener("clickDown", function(e) -- UP O
e:stopPropagation()
xhero.isup = true
end)
btnup:addEventListener("clickMove", function(e)
xhero.isup = true
btnup.text:setAlpha(alpha)
btndown.text:setAlpha(alpha)
btnX.text:setAlpha(alpha)
end)
btnup:addEventListener("clickUp", function(e)
e:stopPropagation()
xhero.isup = false
xhero.wasup = false -- prevent constant jumps
btnup.text:setAlpha(alpha)
btndown.text:setAlpha(alpha)
btnX.text:setAlpha(alpha)
end)
btndown:addEventListener("clickDown", function(e) -- DOWN O
e:stopPropagation()
xhero.isdown = true
end)
btndown:addEventListener("clickMove", function(e)
xhero.isdown = true
btnup.text:setAlpha(alpha)
btndown.text:setAlpha(alpha)
btnX.text:setAlpha(alpha)
end)
btndown:addEventListener("clickUp", function(e)
e:stopPropagation()
xhero.isdown = false
xhero.wasdown = false -- prevent constant going down ptpf
btnup.text:setAlpha(alpha)
btndown.text:setAlpha(alpha)
btnX.text:setAlpha(alpha)
end)
btnX:addEventListener("clickDown", function(e) -- SPACE X
e:stopPropagation()
xhero.isaction1 = true
end)
btnX:addEventListener("clickMove", function(e)
-- xhero.isaction1 = true
xhero.isaction1 = false
btnup.text:setAlpha(alpha)
btndown.text:setAlpha(alpha)
btnX.text:setAlpha(alpha)
end)
btnX:addEventListener("clickUp", function(e)
e:stopPropagation()
xhero.isaction1 = false
btnup.text:setAlpha(alpha)
btndown.text:setAlpha(alpha)
btnX.text:setAlpha(alpha)
end)
btnleft:addEventListener("clickDown", function(e) -- LEFT O
e:stopPropagation()
xhero.isleft = true
end)
btnleft:addEventListener("clickMove", function(e)
xhero.isleft = true
btnleft.text:setAlpha(alpha)
btnright.text:setAlpha(alpha)
end)
btnleft:addEventListener("clickUp", function(e)
e:stopPropagation()
xhero.isleft = false
btnleft.text:setAlpha(alpha)
btnright.text:setAlpha(alpha)
end)
btnright:addEventListener("clickDown", function(e) -- RIGHT O
e:stopPropagation()
xhero.isright = true
end)
btnright:addEventListener("clickMove", function(e)
xhero.isright = true
btnleft.text:setAlpha(alpha)
btnright.text:setAlpha(alpha)
end)
btnright:addEventListener("clickUp", function(e)
e:stopPropagation()
xhero.isright = false
btnleft.text:setAlpha(alpha)
btnright.text:setAlpha(alpha)
end)
end
Usage
Whichever above options (class) you choose they work the same, you pass your Player class as an argument to the Mobile class.
-- mobile controls
local mymobile = Mobile.new(self.player1)
self:addChild(mymobile)