BdR Posted November 29, 2014 Share Posted November 29, 2014 I'm trying to create a pause screen where players can tap the top half to continue and the bottom half to quit (for easier input on small mobile screens). For the pause screen I've created a semi-transparant black rectangle which I overlay on my game. Now the pixi graphics doesn't have input handlers and I understand that I need to add a sprite (see this topic) but the sprite size is set default to 32x32. This means the input touch/mousclick only detected in the top hand corner. So my question is, how do I set the size of the dummy sprite manually so it covers the entire rectangle or the entire screen or whatever size is needed? I've tried setting sprite.width manually but that only stretches the box, which makes it impossible to tap on the lower part of it. See my example test code below.var GAME_WIDTH = 800;var GAME_HEIGHT = 600;var boxgreen;var game = new Phaser.Game(GAME_WIDTH, GAME_HEIGHT, Phaser.AUTO, 'phaser-example', { create: create });function create() { // pause screen var grph = this.game.add.graphics(0, 0); grph.beginFill(0x00FF80, 0.75); // alpha=0.75 is semi-transparant grph.drawRect(0, 0, GAME_WIDTH/2, GAME_HEIGHT/2); // graphics do not have input handlers, create a dummy sprite and attach graphics boxgreen = game.add.sprite(GAME_WIDTH/4, GAME_HEIGHT/4); boxgreen.addChild(grph); // next lines don't work, it stretches the green box to outside of game screen //boxgreen.width = GAME_WIDTH/2; //boxgreen.height = GAME_WIDTH/2; // detect touches on sprite boxgreen.inputEnabled = true; boxgreen.events.onInputDown.add(boxgreenTouch, this);}function boxgreenTouch(sprite, pointer) { console.log('boxgreenTouch --> pointer=('+pointer.x+ ','+pointer.y+') sprite.height='+sprite.height); if (pointer.y > sprite.heigh/2) { console.log('boxgreenTouch --> player tapped on BOTTOM part of green box'); } else { console.log('boxgreenTouch --> player tapped on TOP part of green box'); };} Link to comment Share on other sites More sharing options...
gingerbeardman Posted November 29, 2014 Share Posted November 29, 2014 typo:if (pointer.y > sprite.height/2) { Link to comment Share on other sites More sharing options...
BdR Posted December 1, 2014 Author Share Posted December 1, 2014 Oops, I think that typo happened when I pasted my code and edited my post. Btw it should also take the sprite.y offset into account, so it actually should have been something like this:if (pointer.y-sprite.y > sprite.height/2) {But anyway, then it still only detects a click in the top 32x32 area of the green rectangle. So instead I just added an input.onDown to the entire game and then in the listner function I check for certain rectangles, as suggested in this thread. This is my test code which works now.var GAME_WIDTH = 800;var GAME_HEIGHT = 600;var boxgreen;var boxtop;var boxbottom;var game = new Phaser.Game(GAME_WIDTH, GAME_HEIGHT, Phaser.AUTO, 'phaser-example', { create: create });function create() { // transparant pause screen var grph = this.game.add.graphics(); grph.beginFill(0x00FF80, 0.75); // alpha=0.75 is semi-transparant grph.drawRect(GAME_WIDTH/4, GAME_HEIGHT/4, GAME_WIDTH/2, GAME_HEIGHT/2); // define input areas boxtop = new Phaser.Rectangle(GAME_WIDTH/4, GAME_HEIGHT/4, GAME_WIDTH/2, GAME_HEIGHT/4); boxbottom = new Phaser.Rectangle(GAME_WIDTH/4, GAME_HEIGHT/2, GAME_WIDTH/2, GAME_HEIGHT/4); // input handler game.input.onDown.add(boxgreenTouch, this);}function boxgreenTouch(pointer) { //console.log('boxgreenTouch --> pointer=('+pointer.x+ ','+pointer.y+') '); if (boxtop.contains(pointer.x, pointer.y) ) {console.log('boxgreenTouch2--> player tapped on TOP part of green box')}; if (boxbottom.contains(pointer.x, pointer.y) ) {console.log('boxgreenTouch2--> player tapped on BOTTOM part of green box')};} Link to comment Share on other sites More sharing options...
Recommended Posts