过去几天我一直在玩phaser及其等距插件。我陷入了困境,无法找到解决方案。我正在尝试为我的玩家角色创建一个带深度的hitbox(就像它应该在等距游戏中一样):
1有深度而2没有深度。我相信在等距世界中,深度是必不可少的,所以有1是要走的路。那就是问题开始的地方。我能够创建“普通”的2d hitbox,但我无法制作等距命中箱。制作hitbox的策略如下:
我不知道制作hitbox的其他方法(至少在移相器中)。该方法适用于等距和非等距命中箱。
至于我在移相器中的具体情况:
我正在让我的hitboxes跟随播放器,因为我将它们添加为该播放器的孩子。这样他们就能获得一个固定的位置给玩家。适用于2d hitboxes,但是我无法在等距命中框时将我的等距命中框固定在播放器上。我相信这是因为等轴测插件中缺少一些东西,它没有正确地将等距精灵添加到另一个等轴精灵作为子/父关系。我已经在这里讨论了这个问题:http://www.html5gamedevs.com/topic/25092-phaser-create-hitboxes-in-isometric。
在两种情况下都带有命中箱的玩家:
在3中,我有一个固定在播放器上的2d hitbox。在4中,hitbox不会固定到播放器。
情况代码3:
hitboxes = game.add.group();
hitboxes.enableBody = true;
hitbox1 = hitboxes.create(-100,-30,null); // I believe "create" only works with non-iso
hitbox1.body.setSize(65,70,0,-30);
dude.addChild(hitboxes);
至于4情况的代码:
hitboxes = game.add.group();
hitboxes.enableBody = true;
hitboxes.physicsBodyType = Phaser.Plugin.Isometric.ISOARCADE; // need to say that the physics applied is the isometric
hitbox1 = game.add.isoSprite(0,0,0,null,0,hitboxes);
hitbox1.body.allowGravity = false;
hitbox1.body.setSize(100,100,100,0,0,0);
dude.addChild(hitboxes);
一些观察结果:
由于这显然效果不好我还尝试在x,y和z中设置hitbox位置,使用(hitbox.x,hitbox.y,hitbox.z)等于玩家位置(player.x,播放器) .y,player.z)在更新功能中。它应该以某种方式模拟父/子关系的用途。然而它没有用......
正如我之前所说,我不知道在移相器中采用另一种方式。我想以某种方式解决这个问题。如果您需要更多信息,请询问。对不起任何错误,感谢您的关注。
编辑:
我没有找到完美的解决方案,但我能够创建一个检查两个rects之间交集的函数。然而,当我“攻击”并且目标位于玩家之上时,它仍然会检测到碰撞。可能需要关注深度排序或类似的东西...
答案 0 :(得分:0)
我已经创建了一个基于Phaser Js的库,用于处理击中框(创建击中框并管理具有击中框的精灵的动画和动作)。
这可能会对您有所帮助。首先在以下位置获取/ tool文件夹:https://github.com/Shadoworker/LaliaSprite
并按照以下步骤操作:
STEP 1.在/ tool文件夹中本地运行(服务器)项目。 xamp |捣蛋
。生成两个文件:yoursprite.png(在/ sprites文件夹中)和yoursprite.json(在/ json文件夹中)
步骤2。创建您的新PhaserJS游戏项目。把它写在你的index.html
//Load phaser.js (first)
<script src="js/phaser.js"></script>
//Load laliasprite.js*/
<script src="js/laliasprite-2.0.js"></script>
//NB : in laliasprite.js ,comment "box.alpha = 0;" to see hitboxes for debug
b。在预加载功能中,执行以下操作:
//Create new Lalia instance
Lalia = new Lalia();
//Load sprite atlases or spritesheet
//1 . load atlases
Lalia.atlas(game, "yoursprite", 'img/yoursprite_atlas.png', 'json/yoursprite_atlas.json', 'json/yoursprite_atlas_hitboxes.json' );
//2 . load sheet
//Lalia.sheet(game, "yoursprite", 'img/yoursprite_sheet.png', 'json/yoursprite_sheet_hitboxes.json', 180, 240);
c。在您的create函数中,执行此操作
//Add sprite to game scene
yoursprite = game.add.sprite(100, 30, 'yoursprite');
//Add animation to sprite
yoursprite.animations.add("idle", ["1" ,"2", "3"],1, false);
//Setting yoursprite hitboxes for a specific animation (frames);
Lalia.atlasboxes(yoursprite, 'idle');
//Lalia.sheetboxes(yoursprite, 'idle');
...
//Add other characters
enemy = game.add.sprite(130, 40, 'enemy');
...
//Set objects which will collide with our character (yoursprite) hitboxes
yourspriteColliders.push(enemy);
//yourspriteColliders is the array you will declare in your code to store colliders
...
d。创建您的操作回调
//Do this when yoursprite is touched at a certain point during "idle" animation
function die()
{
//Kill yoursprite
}
e。在您的更新功能中,执行以下操作:
//On button taped or keyboard event
yoursprite.animations.playaction('idle','hit', yourspriteColliders, die);
//This means: When yoursprite is playing 'idle' animation, when it's hitboxes that have the type 'hit' are touched by one of the objects in yourspriteColliders array then call the 'die' function to execute a specific action (To die in this example) ...
仅此而已!希望这会有所帮助!