Jump to content

Some outOfBoundKill problem, group element access and FPS drop


xkorikx
 Share

Recommended Posts

Hi,

I'm some newbie programmer that need a little help in his starts.

Now i have three questions to ask you.

 

First. I've find an examples of sprite garbageCollector, but its work only in older versions (i test it on 1.1.5). How can i fix it?

Here is code:

var game = new Phaser.Game(800, 480, Phaser.AUTO, '', { preload: preload, create: create, update: update });var clouds;var cloud_dummy;function preload() {	game.load.image('mario_cloud', 'mario_cloud.png');}function create() {	clouds = game.add.group();	clouds.enableBody = true;	clouds.createMultiple( 10, 'mario_cloud');		timer_shit = game.time.events.loop(1500, add_cloud, this);}function update() {}function add_cloud() {	cloud_dummy = clouds.getFirstDead();	cloud_dummy.reset(800, 100);	cloud_dummy.body.velocity.x -= 150;	cloud_dummy.body.immovable = true;	cloud_dummy.outOfBoundsKill = true;}

Error message:

Phaser v2.0.3 - WebGL - WebAudio http://phaser.io ♥♥♥ phaser.min.js:8 Uncaught TypeError: Cannot read property 'reset' of null (index):34 add_cloud (index):34 b.Timer.update phaser.min.js:12 b.Time.update phaser.min.js:12 b.Game.update phaser.min.js:8 b.RequestAnimationFrame.updateRAF phaser.min.js:11 window.requestAnimationFrame.forceSetTimeOut._onLoop phaser.min.js:11

 

 

Second question:

I've some trouble with accessing elements of group. In example that u can see above, we have group named clouds and a cycle that add cloud_dummy elements to it.

For example i have 10 elements on the screen, and i wanna access 3rd element of group to run other animation.run(). How can i do this trick?

 

Third question:

I've 2 browsers on my net-book, Chrome and Firefox. In Firefox my games(like example above) lag so hard, but Chrome give me around 60fps and have a little lagspikes that drop fps to 50. Phaser.CANVAS works better in Firefox and Phaser.WEBGL works better in chrome. How can i optimize my games to work better in both browsers?

 

EDIT 03.05.2014:
I've find a reason why my garbageCollector won't work. I forgot to check world bound for every sprite...

Code shoul look like that:

function add_cloud() {	cloud_dummy = clouds.getFirstDead();	cloud_dummy.reset(800, 100);	cloud_dummy.body.velocity.x -= 150;	cloud_dummy.body.immovable = true;	cloud_dummy.checkWorldBounds = true;	cloud_dummy.outOfBoundsKill = true;}
Edited by xkorikx
Link to comment
Share on other sites

The proper way to do recycling is as follows:

function addCloud() {  var cloud = clouds.getFirstExists(false);  if(!cloud) {    cloud = game.add.sprite(0,0, 'mario_cloud');    game.physics.arcade.enableBody(cloud);    cloud.body.velocity.x = -150;    cloud.body.immovable = true;    cloud.checkWorldBounds = true;    cloud.outOfBoundsKill = true;  }  cloud.reset(800,100);  cloud.revive();}

group.getFirstExists(false) will get the first element of the group that no longer exists. This usually indicates that "kill()" has been called on this element. It's a much safer way to cycle through "dead" objects.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...