englercj / phaser-tiled

A tilemap implementation for phaser focusing on large complex maps built with the Tiled Editor.
MIT License
290 stars 31 forks source link

Sync instances of the same Tile #77

Open oyed opened 7 years ago

oyed commented 7 years ago

Currently there is no option to sync all tiles of the same type meaning, for example, water tiles will be out-of-sync when half of them have gone off-screen and are then brought back on-screen.

oyed commented 7 years ago

Possibly allow the option of enabling updateIfVisible?

englercj commented 7 years ago

Ah, good call. I think this is something I will probably fix in the next major version.

But I'm up for a PR if you have a good idea to fix it here!

oyed commented 7 years ago

Any idea as to when the next major release will be? I could whip up a temporary solution if needed

englercj commented 7 years ago

No idea, right now I'm focused on getting pixi v5 designed and written so not working on this lib at all really.

oyed commented 7 years ago

@englercj I understand. I was wondering if you could point me in the right direction here.

I'm setting updateIfVisible to false on all Phaser.AnimationManager instances, yet it has no effect. Is there anything I'm doing wrong from the top of your head? Thanks.

https://github.com/imperiumforge/phaser-tiled/commit/9b74d9832e879540bcfb78ba0c5ef7048a283fbe

englercj commented 7 years ago

So updateIfVisible is set to true by default, and the docs say:

Should the animation data continue to update even if the Sprite.visible is set to false.

So true is what you would want. However, the reason you are getting the issue you are having is not because tiles being hidden aren't updating but because this plugin re-uses sprite objects as you pan. For example, as you pan to the right sprite objects are stripped off the left side of the map and moved to the right side. That way we only ever create the number of sprites you can see, and not have a bunch of hidden sprites that aren't visible. This is because I wrote this lib for big maps (really, really big).

So the problem is that when you pan around and it moves a sprite for re-use, the animation restarts. This happens at different times for different sprites, and so the animations are off. What you would want to do instead of keep a global timer going and when we start an animation jump to the offset the global timer is at, so that no matter when we start the animation they are in sync with the global timer.

I'd also put this behind an option because it isn't necessarily desired by everyone.

Hope this helps!

oyed commented 7 years ago

So true is what you would want

Actually it's the opposite; the documentation for updateIfVisible has always been confusing and silly. It was recently changed on the CE edition to make it easier to understand

And I see now, thank you for the explanation - I'll definitely get going on that implementation.

englercj commented 7 years ago

Actually it's the opposite; the documentation for updateIfVisible has always been confusing and silly. It was recently changed on the CE edition to make it easier to understand

Pfft, thanks for that link. I was clearly wrong, sorry about that! I think think the issue is the recycling though.