I am currently working on creating my own buttons.
Originally, my idea was to add 1 to some variable, each time my button is pressed. However, I have a problem. Every time I press the button it increases the variable a number of times as my “single” click is to considered by the iPad to be somewhat lengthy.
I tried to find the millis function to monitor the time between two consequent touches, but I couldn’t.
CurrentTouch’s state will stay “BEGAN” until it is moved or ended. So basically, if you touch and leave your finger there without moving, it will be counted as began for as many frames as your finger stays there. Instead, use the touched function, which is only called when there is a touch EVENT, instead of remaining constant.
function touched(t)
if t.state == BEGAN and onCircle(100,100,t.x,t.y,50) then
print("yes")
i = i+1
else
print("not touched")
end
end
Apparently, I still fail to understand how the function works"
This is my “main” tab
function setup()
buttons = {}
table.insert (buttons, OvalButton())
end
function draw()
background(40, 40, 50)
buttons[1]:draw()
buttons[1]:touched(CurrentTouch)
end
This is my class
function OvalButton:init()
self.i = 0
end
function OvalButton:draw()
ellipse (WIDTH/2, HEIGHT/2, 100,100)
end
function OvalButton:touched(touched)
if touch.state == BEGAN then
print (self.i)
self.i = self.i + 1
end
end
The problem is your still passing CurrentTouch to your oval button class, what you should be doing is adding the touched function to you main tab like this…
function setup()
buttons = {}
table.insert (buttons, OvalButton())
end
function draw()
background(40, 40, 50)
buttons[1]:draw()
end
function touched(t)
buttons[1]:touched(t)
end
Now I’ve run into a different kind of problem. How does Codea handle multitouch? I mean my program is run step by step, there are no parallel processes, how can Codea, then, deal with a number of touches simultaneously?
My problem is this:
I have a space ship
When the left button is pressed - activate the left engine
When the right one is pressed - activate the right one
I can handle this problem with a single touch, but I fail to understand how to deal with it if I want to implement multitouch? Say, when I press both buttons, I want both engines to run.
@alexNaumov That’s where the touch ID is used. Run this code and touch the left or right side of the screen.
displayMode(FULLSCREEN)
function setup()
end
function draw()
background(40, 40, 50)
if leftFlame then
sprite("Tyrian Remastered:Flame 2",200,HEIGHT/2,50,-300)
end
if rightFlame then
sprite("Tyrian Remastered:Flame 2",WIDTH-200,HEIGHT/2,50,-300)
end
end
function touched(t)
if t.state==BEGAN then
if t.x<WIDTH/2 then
leftId=t.id
leftFlame=true
else
rightId=t.id
rightFlame=true
end
end
if t.state==ENDED then
if t.id==leftId then
leftFlame=false
end
if t.id==rightId then
rightFlame=false
end
end
end
@alexNaumov You should use the touched function thats automaticlly called whenever the screen is touched instead of using CurrentTouch in your draw loop. Since CurrentTouch always is the last touch even if the screen isnt being touched that can cause big problems.
Putt the function in your main tab and then pass the touch to your buttons. It only runs when the screen is touched so it saves some power.