Phaser Draggable分组世界地图

时间:2016-11-28 05:20:49

标签: javascript jquery html5 phaser-framework

我找到了关于使用惯性创建可拖动地图的精彩教程:http://www.emanueleferonato.com/2016/01/18/how-to-create-a-html-draggable-and-scrollable-map-with-inertia-using-phaser-framework/

本教程仅对图像应用了拖动效果。我试图将拖动效果应用于一组精灵,因此它们会同时拖动(地图图像+精灵组)。

我遇到的问题是我对this.scrollingMap表示语法方面的内容有点困惑。所以当谈到用一个小组替换这一行时,我有点迷失。

this.scrollingMap = game.add.image(0, 0, "map");

有人有什么想法吗?

如果有帮助,我也会复制下面的简化代码。

var game = new Phaser.Game(window.innerWidth, window.innerHeight, Phaser.AUTO, '', { preload: preload, create: create, update: update });


function preload() {
    
  game.load.image('map', 'assets/images/baseMap.png');
  game.load.image('star', 'assets/images/star.png');
}


function create() {
  
    // Creating the group
    world = game.add.group();
    world.create(0, 0, 'map');
    // Adding random sprites to it
    for (var i = 0; i < 10; i++)
    { world.create(game.world.randomX, game.world.randomY, 'star');}
  
    //This group works on its own.
    //I would like to link it to the dragging animation below "scrollingMap".


  //The Draggable Map from the tutorial
    // Adding the big map to scroll
    this.scrollingMap = game.add.image(0, 0, "map"); //<-- This is where I am having trouble changing from an image to a group.
    // map will accept inputs
    this.scrollingMap.inputEnabled = true;
    // map can be dragged
    this.scrollingMap.input.enableDrag(false);
    // custom property: we save map position
    this.scrollingMap.savedPosition = new Phaser.Point(this.scrollingMap.x, this.scrollingMap.y);
    // custom property: the map is not being dragged at the moment
    this.scrollingMap.isBeingDragged = false; 
    // custom property: map is not moving (or is moving at no speed)
    this.scrollingMap.movingSpeed = 0; 
    // map can be dragged only if it entirely remains into this rectangle
    this.scrollingMap.input.boundsRect = new Phaser.Rectangle(game.width - this.scrollingMap.width, game.height - this.scrollingMap.height, this.scrollingMap.width * 2 - game.width, this.scrollingMap.height * 2 - game.height);
    // when the player starts dragging...
    this.scrollingMap.events.onDragStart.add(function(){
         this.scrollingMap.isBeingDragged = true;
         // set movingSpeed property to zero. This will stop moving the map
         // if the player wants to drag when it's already moving
         this.scrollingMap.movingSpeed = 0;
    }, this);
    // when the player stops dragging...
    this.scrollingMap.events.onDragStop.add(function(){
         this.scrollingMap.isBeingDragged = false;
    }, this);
    
} //End create function


function update() {
  
  // if the map is being dragged...
    if(this.scrollingMap.isBeingDragged){
         this.scrollingMap.savedPosition = new Phaser.Point(this.scrollingMap.x, this.scrollingMap.y);
    }
    // if the map is NOT being dragged...
    else{
         // if the moving speed is greater than 1...
         if(this.scrollingMap.movingSpeed > 1){
              this.scrollingMap.x += this.scrollingMap.movingSpeed * Math.cos(this.scrollingMap.movingangle);
              this.scrollingMap.y += this.scrollingMap.movingSpeed * Math.sin(this.scrollingMap.movingangle);
              if(this.scrollingMap.x < game.width - this.scrollingMap.width){
                   this.scrollingMap.x = game.width - this.scrollingMap.width;
              }
              if(this.scrollingMap.x > 0){
                   this.scrollingMap.x = 0;
              }
              if(this.scrollingMap.y < game.height - this.scrollingMap.height){
                   this.scrollingMap.y = game.height - this.scrollingMap.height;
              }
              if(this.scrollingMap.y > 0){
                   this.scrollingMap.y = 0;
              }
              this.scrollingMap.movingSpeed *= friction;
              // save current map position
              this.scrollingMap.savedPosition = new Phaser.Point(this.scrollingMap.x, this.scrollingMap.y);
         }
         // if the moving speed is less than 1...
         else{
              var distance = this.scrollingMap.savedPosition.distance(this.scrollingMap.position);
              var angle = this.scrollingMap.savedPosition.angle(this.scrollingMap.position);
              if(distance > 4){
                   this.scrollingMap.movingSpeed = distance * speedMult;
                   this.scrollingMap.movingangle = angle;
              }
         }
    }
}

1 个答案:

答案 0 :(得分:2)

所以,我最终找到了解决方案......

首先,我删除了所有 .scrollingMap 并将其更改为 scrollingMap 以消除任何混淆。结束了stil工作完美。

scrollingMap = game.add.image(0, 0, "map");
scrollingMap.anchor.set(0.05,0.5);
scrollingMap.inputEnabled = true;
[etc...]

接下来,Phaser中的群组似乎无法将元素一起处理,一次只能处理一个元素。所以转变为不会工作的东西:

scrollingMap = game.add.group();
map = game.add.image(0, 0, "map");
scrollingMap.add(map); 
// The following line won't work
scrollingMap.inputEnabled = true;

我尝试使用Phaser提供的 Align 函数......直到我最终意识到你可以在其他精灵中嵌套精灵,直到我这样:

scrollingMap = game.add.image(0, 0, "map");
someSprite = game.add.image(100, 100, "sprite");
scrollingMap.addChild(someSprite);

瞧!有解决方案,就这么简单。

请注意,您还可以将群组添加为子项:

someGroup = game.add.group(); 
scrollingMap.addChild(someGroup);

如果有人好奇的话,在这里找到解决方案: http://www.html5gamedevs.com/topic/7745-move-a-group-of-sprites-together-as-one-body/