Todi

Bug in cyclic movement

Recommended Posts

Hi guys!

I'm really pissed about my code. I reviewed so many times and I can't find the problem that is causing this bug. So, as you can see in these screenshots below, after a while running the game, the platforms starts acting strange. In the interval of platform 2 and 3, when the movement is from left to right, these platforms overlaps and when the movement is from right to left, the distance between then increase.

Screenshot_20160616-185316.png Screenshot_20160616-185223.png

The first screenshot is about the game start, so the problem didn't occured, yet. In the second screenshot, shows the bug in action and it get worse after a while running the game. :( well... the objective of these platforms is to do a cyclic movement from left to right and vice-versa, in an infinite loop, where the player will jumps on it catching items and killing enemies. So, I start my code creating the platforms in the Trail class, that holds 4 platforms per row.

// trail group of platforms
this._trail = this.game.add.group();

// fill the group with platforms
for (var i = 0; i < total; i++) {
	var platform = new MovablePlatform(this.game, sprite, direction, speed);
	var initX;
	var finalX;

	switch (direction) {
		// move to left
		case 0:
			if (i === 0) {
				initX = this.game.width + platform.width;
				finalX = - platform.width * total - PLATFORM_GAP;
			} else {
				var lastPlatform = this._trail.getAt(i - 1);
				initX = lastPlatform.initPos.x + lastPlatform.width + PLATFORM_GAP;
				finalX = lastPlatform.finalPos.x + lastPlatform.width + PLATFORM_GAP;
			}
			break;

		// move to right
		case 1:
			if (i === 0) {
				initX = - platform.width;
				finalX = this.game.width + platform.width * total + PLATFORM_GAP;
			} else {
				var lastPlatform = this._trail.getAt(i - 1);
				initX = lastPlatform.initPos.x - lastPlatform.width - PLATFORM_GAP;
				finalX = lastPlatform.finalPos.x - lastPlatform.width - PLATFORM_GAP;
			}
			break;
	}

	platform.createPath(initX, posY, finalX, posY);
	this._trail.add(platform);
}

And in the class MovablePlatform I created the method "move", that starts the platform movement, applying the velocity in x-axis. The update method verify if the x position is equal or grater/lesser than the final position and reset the position, to start the movement again.

MovablePlatform.prototype.update = function () {
	switch (this._direction) {
		// check negative bounds outside the screen
		case 0:
			if (this.x <= this.finalPos.x) {
				this.reset();
			}
			break;

		// check positive bounds outside the screen
		case 1:
			if (this.x >= this.finalPos.x) {
				this.reset();
			}
			break;
	}
};

MovablePlatform.prototype.move = function () {
	switch (this._direction) {
		// move to left
		case 0:
			this.body.velocity.x = -this._speed;
			break;

		// move to right
		case 1:
			this.body.velocity.x = this._speed;
			break;
	}
};

That is it! Does anybody know why it happen? And if anyone knows a better method to do cyclic movement, I would like to know and appreciate the sharing!

Thanks!

Share this post


Link to post
Share on other sites

I don't know if it is a bug, but I fixed it using Signals. When the last platform reaches the final coordination, a signal is dispatched and my Trail object, that holds that platform, listen it and act restarting the all cycle again. Now, it works fine! :)

Just for information! :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.