drewbacca Posted March 8, 2016 Share Posted March 8, 2016 Hi there. I am expanding on a tutorial to learn more about Phaser. Basically, player moves around to collect objects for points. When the player bumps an asteroid, they explode and the game starts over. While flying around, the player sometimes, randomly explodes on empty space. Not even close to an asteroid. The images being used are trimmed so that very narrow passes can be achieved - I promise it's not the images' fault. I have no idea how to debug this issue. Here is my code: var SpaceHipster = SpaceHipster || {}; //title screen SpaceHipster.Game = function(){}; SpaceHipster.Game.prototype = { create: function() { music = this.add.audio('bg') //set world dimensions this.game.world.setBounds(0, 0, 1920, 1920); music.play(); //background this.background = this.game.add.tileSprite(0, 0, this.game.world.width, this.game.world.height, 'space'); //create player this.player = this.game.add.sprite(this.game.world.centerX, this.game.world.centerY, 'playership'); // this.player.scale.setTo(2); // this.player.animations.add('fly', [0, 1, 2, 3], 5, true); // this.player.animations.play('fly'); //player initial score of zero this.playerScore = 0; //enable player physics this.game.physics.arcade.enable(this.player); this.playerSpeed = 120; this.player.body.collideWorldBounds = true; //the camera will follow the player in the world this.game.camera.follow(this.player); //generate game elements this.generateCollectables(); this.generateAsteriods(); //show score this.showLabels(); //sounds this.explosionSound = this.game.add.audio('explosion'); console.log(this.explosionSound); this.collectSound = this.game.add.audio('collect'); }, update: function() { if(this.game.input.activePointer.justPressed()) { //move on the direction of the input this.game.physics.arcade.moveToPointer(this.player, this.playerSpeed); } //collision between player and asteroids this.game.physics.arcade.collide(this.player, this.asteroids, this.hitAsteroid, null, this); //overlapping between player and collectables this.game.physics.arcade.overlap(this.player, this.collectables, this.collect, null, this); }, generateCollectables: function() { this.collectables = this.game.add.group(); //enable physics in them this.collectables.enableBody = true; this.collectables.physicsBodyType = Phaser.Physics.ARCADE; //phaser's random number generator var numCollectables = this.game.rnd.integerInRange(50, 100) var collectable; for (var i = 0; i < numCollectables; i++) { //add sprite collectable = this.collectables.create(this.game.world.randomX, this.game.world.randomY, 'power'); collectable.animations.add('fly', [0, 1, 2, 3], 5, true); collectable.animations.play('fly'); } }, generateAsteriods: function() { this.asteroids = this.game.add.group(); //enable physics in them this.asteroids.enableBody = true; //phaser's random number generator var numAsteroids = this.game.rnd.integerInRange(100, 150) var asteriod; for (var i = 0; i < numAsteroids; i++) { //add sprite asteriod = this.asteroids.create(this.game.world.randomX, this.game.world.randomY, 'rock'); asteriod.scale.setTo(this.game.rnd.integerInRange(.5, 2)/2); //physics properties asteriod.body.velocity.x = this.game.rnd.integerInRange(-20, 20); asteriod.body.velocity.y = this.game.rnd.integerInRange(-20, 20); asteriod.body.immovable = false; asteriod.body.collideWorldBounds = true; } }, hitAsteroid: function(player, asteroid) { //play explosion sound this.explosionSound.play(); //make the player explode var emitter = this.game.add.emitter(this.player.x, this.player.y, 100); emitter.makeParticles('playerParticle'); emitter.minParticleSpeed.setTo(-200, -200); emitter.maxParticleSpeed.setTo(200, 200); emitter.gravity = 0; emitter.start(true, 1000, null, 100); this.player.kill(); this.game.time.events.add(800, this.gameOver, this); music.stop() }, gameOver: function() { //pass it the score as a parameter this.game.state.start('MainMenu', true, false, this.playerScore); }, collect: function(player, collectable) { //play collect sound this.collectSound.play(); //update score this.playerScore++; this.scoreLabel.text = this.playerScore; //remove sprite collectable.destroy(); }, showLabels: function() { //score text var text = "0"; var style = { font: "20px Arial", fill: "#fff", align: "center" }; this.scoreLabel = this.game.add.text(this.game.width-50, this.game.height - 50, text, style); this.scoreLabel.fixedToCamera = true; } }; Link to comment Share on other sites More sharing options...
drhayes Posted March 9, 2016 Share Posted March 9, 2016 Try creating a "render" method and putting "this.game.debug.body(mySprite);" in there for whatever sprite you want to track. That'll draw a rectangle around the sprite body so you can verify it's what you expect. Link to comment Share on other sites More sharing options...
drewbacca Posted March 9, 2016 Author Share Posted March 9, 2016 Hey, thanks for the tip. I also tracked down that the 'invisible' chimneys came from the randomized scale equation. When the phaser method gets the random integer, it rounds off the result. So, .25 was rounding down to zero. Ergo, invisible asteroids! Link to comment Share on other sites More sharing options...
Recommended Posts