prajwal.be.21 May 22nd, 2017 Hi, I'm creating this simple game, where on clicking a button, bunch of nuts start moving up and down.
To achieve this, in the wade editor, on clicking the button I'm calling a function startGame() which I have written in the App function as this.startGame().... and on click I'm calling it with wade.app.startGame();
Now here in this function, to achieve the timer effect I'm using wade.setInterval and assigning it's return id to a variable called myGame. So the movement starts as expected but on clicking stop, the wade.clearInterval(myGame) does not seem to work. When I check the return value of clearInterval() it always shows false... But the interval id values match when I console.log it...
To get a better understanding of what I'm talking about, please look at my code snippet for the startGame() function
var gameFlag = false;
var direction = +10;
var myGame;
this.startGame = function() {
if(gameFlag === false) {
gameFlag = true;
wade.getSceneObject('button').getSpriteByName('start').setVisible(false);
wade.getSceneObject('button').getSpriteByName('stop').setVisible(true);
myGame = wade.setInterval(function(){
wade.getSceneObject('nut').setPosition(wade.getSceneObject('nut').getPosition().x,
wade.getSceneObject('nut').getPosition().y+(1*direction));
if(wade.getSceneObject('nut').getPosition().y > 150){
direction = -10;
}
if(wade.getSceneObject('nut').getPosition().y < 40){
direction = +10;
}
}, 50);
console.log(myGame);
}
else if(gameFlag === true) {
gameFlag = false;
console.log(myGame);
wade.clearInterval(myGame); //This is not working and returns false, does not stop animation
wade.getSceneObject('button').getSpriteByName('start').setVisible(true);
wade.getSceneObject('button').getSpriteByName('stop').setVisible(false);
}
};
As you can see I'm decalring myGame, direction and GameFlag outside the scope of startGame()
I also would like to know if there is a better way to run this gameLoop... maybe something in the update method?
I would like to clear the interval on clicking stop...The other code in the if runs though... my sceneobject's sprite is changed...
Please help...
krumza May 22nd, 2017 hi, yea there is some bug i think
try:
1 variant:
use pure setInterval
App = function()
{
this.init = function()
{
wade.loadScene('scene1.wsc', true, function()
{
//somewhere here button with onClick wade.app.startGame();
wade.app.gameFlag = false;
wade.app.direction = +10;
wade.app.myGame;
wade.app.startGame = function() {
if(wade.app.gameFlag === false) {
wade.app.gameFlag = true;
wade.getSceneObject('button').getSpriteByName('start').setVisible(false);
wade.getSceneObject('button').getSpriteByName('stop').setVisible(true);
wade.app.myGame = setInterval(function(){
wade.getSceneObject('nut').setPosition(wade.getSceneObject('nut').getPosition().x,
wade.getSceneObject('nut').getPosition().y+(1*wade.app.direction));
if(wade.getSceneObject('nut').getPosition().y > 150){
wade.app.direction = -10;
}
if(wade.getSceneObject('nut').getPosition().y < 40){
wade.app.direction = +10;
}
}, 50);
}
else if(wade.app.gameFlag === true) {
wade.app.gameFlag = false;
clearInterval(wade.app.myGame);
wade.getSceneObject('button').getSpriteByName('start').setVisible(true);
wade.getSceneObject('button').getSpriteByName('stop').setVisible(false);
}
};
});
};
};
2 variant:
use
wade.clearAllTimeoutsAndIntervals()
instead
wade.clearInterval(myGame);
3 variant
in button onClick use
//button onClick
if(wade.app.gameFlag === false) {
wade.app.gameFlag = true;
wade.resumeSimulation();
wade.getSceneObject('button').getSpriteByName('start').setVisible(false);
wade.getSceneObject('button').getSpriteByName('stop').setVisible(true);
}
else if(wade.app.gameFlag === true) {
wade.app.gameFlag = false;
wade.pauseSimulation();
wade.getSceneObject('button').getSpriteByName('start').setVisible(true);
wade.getSceneObject('button').getSpriteByName('stop').setVisible(false);
}
all the options work
Gio May 22nd, 2017 You are right, there is a bug there. I'm fixing it for version 3.7 of WADE (to be released a few weeks from now).
In the meantime, you can include this code in one of your scripts, to override the current definition of wade.clearInterval with something that works:
wade.clearInterval = function(intervalUid)
{
for (var i=0; i<timeouts[i]; i++)
{
if (timeouts[i].uid == intervalUid && timeouts[i].repeat)
{
wade.removeObjectFromArrayByIndex(i, timeouts);
return true;
}
}
return false;
};
Sorry for the inconvenience
prajwal.be.21 May 23rd, 2017 Hey krumza and Gio... Thanks for the help... I used krumza's first solution and it's working a-ok...Really appreciate the help guys :)