2015-01-09 25 views
1

在我的update()函數中,我使用pointerOver()來檢測指針何時位於sprite上。這通常工作正常。但是,如果我碰巧在拖動另一個精靈時,pointerOver()函數總是返回false。當我拖動另一個精靈時,如何檢測指針何時位於精靈之上?

我想我會通過獲取指針的位置並將其與我的精靈的位置和邊界進行比較來解決它,但指針位置始終爲(-1,-1)。

下面是一些示例代碼來演示該問題:

var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update, render: render }); 
    var triangle; 
    var square; 
    var isOver; 
    var pointerX; 
    var pointerY; 

    function preload() 
    { 
     game.load.image('triangle', 'assets/triangle.png'); 
     game.load.image('square', 'assets/square.png'); 
    } 

    function create() 
    { 
     triangle = game.add.sprite(100, 100, "triangle"); 
     triangle.inputEnabled = true; 
     triangle.input.enableDrag(false, true); 

     square = game.add.sprite(100, 200, "square"); 
     square.inputEnabled = true; 
    } 

    function update() 
    { 
     isOver = square.input.pointerOver() ? "Yes" : "No"; 
    } 

    function render() 
    { 
     game.debug.text("Mouse over square: " + isOver, 200, 100); 
     game.debug.text("Pointer: (" + game.input.pointer1.x + ", " + game.input.pointer1.y + ")", 200, 116); 
    } 

我發現這個職位有關使用精靈的input.priorityID:Phaser JS how to stop event Propagation(firing) from textButton.events.onInputDown event to game.input.onDown event?

使用priorityID固定它當三角在頂部正方形和三角形沒有被拖動,但問題仍然存在時,它被拖動。

即使當我拖動另一個精靈時,如何檢測指針是否位於精靈之上?

謝謝。

回答

2

我最近有類似的問題,我希望這對您仍然有幫助。

我發現,在啓動拖動時,除了拖動的那個之外,所有精靈的輸入都被禁用。這可能發生在內部,我無法找到重寫它的方法。

我做的是以下內容:我想要可拖動的所有對象(在我的例子中爲Tile)都被保存在一個Board對象中,該對象繼而保存對我的遊戲狀態的引用。在遊戲狀態下,我有一個標誌dragIsActive。在對象類本身我有(打字稿)

this.tileSprite.events.onDragStart.add(() => { 
     this.parentBoard.gameState.dragIsActive = true; 
    }); 

    this.tileSprite.events.onDragStop.add(() => { 
     this.parentBoard.gameState.dragIsActive = false; 
    }); 

等效的JavaScript將

this.tileSprite.events.onDragStart.add(function() { 
     this.parentBoard.gameState.dragIsActive = true; 
    }); 

    this.tileSprite.events.onDragStop.add(function() { 
     this.parentBoard.gameState.dragIsActive = false; 
    }); 

從對象的構造函數調用。

在遊戲我有以下幾點:

update() { 
    if (this.dragIsActive) {   
     var firstTile : Tile = this.game.input.activePointer.targetObject.sprite.parent; 

     this.board.tiles.forEach((t : Tile) => { 
      if (firstTile.tileSprite.overlap(t.tileSprite)) { 
       this.board.tilesToSlide.push(t); 
      } 
     }); 

     this.board.tilesToSlide.forEach((tileToSlide) => { 
      // Do the processing on that array here. 
     }); 
    } 
} 

的JavaScript(只是foreach循環):

this.board.tiles.forEach(fucntion(t) { 
    if (firstTile.tileSprite.overlap(t.tileSprite)) { 
     this.board.tilesToSlide.push(t); 
    } 
}); 

在我的情況下,檢查了兩個精靈重疊,但在你的情況,你可以檢查一個剛剛興趣點(例如,您拖動的精靈的位置)是否在另一個精靈的範圍內:

if (secondSprite.getBounds().containsPoint(firstSprite.position)) { 
    // This should be equivalent to pointerOver() while dragging something. 
} 

P.S.我希望你知道精靈的位置是在它的邊界框的左上角,除非明確地設置爲別的東西。通過sprite.anchor.set(x, y) - (0,0)設置爲左上(默認)和(1,1) - 右下。

1

您也可以使用此方法來查看點是否包含在精靈界限內。

if(Phaser.Rectangle.contains(sprite.body, this.game.input.x, this.game.input.y)){ 
    console.log('collide') 
} 
相關問題