嘿伙计们,我正在尝试制作类似于以下游戏的2D平台风格游戏:
http://www.gameshed.com/Puzzle-Games/Blockdude/play.html
我已经完成了大部分图形,区域和碰撞,但我们的角色仍然无法携带物品。我很困惑使用什么代码,以便我的角色可以携带块。我需要帮助,如何使我们的角色携带在他面前的块,前提是那些没有任何东西的块。这让我困惑了一个星期了,任何帮助都会受到高度赞赏。 :d
答案 0 :(得分:0)
我深情地记得我的第一部AS2游戏。正如我将解释的那样,最好的方法可能是面向对象的方法。
在AS2中,有一种自动构建到对象中的hittest方法。这里有一个关于Kirupa的好教程:
http://www.kirupa.com/developer/actionscript/hittest.htm
也
http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00001314.html
首先,您需要使用Box类生成框。您的课程需要看起来如下:
//Box.as pseudo-code
class Box {
var x_pos:Number;
var y_pos:Number;
var attachedToPlayer:Boolean;
function Box(_x:Number, _y:Number) {
this.x_pos = _x;
this.y_pos = _y;
}
//other code here
}
请参阅本教程,了解如何将类附加到库中的对象:
http://www.articlesbase.com/videos/5min/86620312
要创建一个新Box,您可以使用类似的东西 box1 = new Box(100,200); //在位置100x,200y
处创建一个框但是,您还需要将要拾取的块存储到某种数组中,以便循环遍历它们。见http://www.tech-recipes.com/rx/1383/flash-actionscript-create-an-array-of-objects-from-a-unique-class/
示例:
//靠近主方法顶部的某个地方,或者主游戏循环运行的地方 - 注意Box.as需要在同一个文件夹中 导入框;
//...then, somewhere before your game loop
//create an array to hold the objects
var boxArray:Array = new Array();
//create loop with i as the counter
for (var i=0; i<4; i++)
{
var _x:Number = 100 + i;
var _y:Number = 100 + i;
//create Box object
var box:Box = new Box();
//assign text to the first variable.
//push the object into the array
boxArray.push(box);
}
同样,您需要为您的玩家设置一个班级,并在游戏开始时创建一个新的玩家对象,例如:
var player = new Player(0,0);
然后,您可以针对主游戏循环(即更新玩家位置和其他游戏属性的循环)针对阵列中的块运行针对您的玩家的hittest方法。可能有更有效的方法,例如,仅循环播放当前屏幕上的块。
创建阵列后,使用foreach循环在游戏主循环中针对您的玩家运行hittest,例如
//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
if (player.hittest(box)) {
player.attachObjectMethod(box);
}
}
这基本上是伪代码“对于我们输入数组的每一个框,检查玩家是否正在触摸框。如果框正在触摸,请使用框作为玩家类中方法的参数(我任意称之为attachObjectMethod)“。
在attachObjectMethod中,您可以定义某种将行框附加到播放器的行为。例如,您可以为box类中的box的x和y位置创建get和set方法,以及一个名为attachmentToPlayer的有用的布尔值。当调用attachObjectMethod时,它会设置框的布尔值,例如在Player类中
//include Box.as at the top of the file
import Box;
//other methods, e.g. constructor
//somewhere is the Player.as class/file
public function attachObjectMethod (box:Box) {
box.setattachedToPlayer(true);
//you could also update fields on the player, but for now this is all we need
}
现在玩家与之碰撞的盒子的attachToPlayer布尔值将是真的。回到我们的游戏循环中,然后我们将修改循环以更新框的位置:
//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
if (player.hittest(box)) {
player.attachObjectMethod(box);
}
box.updatePosition(player.get_Xpos, player.get_Ypos);
}
在我们的Box类中,我们现在需要定义'updatePosition':
//Box.as pseudo-code
class Box {
var x_pos:Number;
var y_pos:Number;
var attachedToPlayer:Boolean;
function Box(box_x:Number, box_y:Number) {
this.x_pos = box_x;
this.y_pos = box_y;
}
public function updatePosition(_x:Number, _y:Number) {
if (this.attachedToPlayer) {
this.x_pos = _x;
this.y_pos = _y;
}
}
//other code here
}
如您所见,我们可以传递玩家的位置,如果已经设置了attachmentToPlayer布尔值,则更新框的位置。最后,我们在框中添加一个移动方法:
public function move() {
if (this.attachedToPlayer) {
this._x = x_pos;
this._y = y_pos;
}
}
最后,为了使一切正常,我们需要在游戏循环中调用move方法:
//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
if (player.hittest(box)) {
player.attachObjectMethod(box);
}
box.updatePosition(player.get_Xpos, player.get_Ypos);
box.move();
}
您还指定了块只有在播放器顶部没有任何内容时才能随播放器一起移动。当您调用attachToPlayer方法时,您还需要在方框和可能位于框顶部的对象之间的方法内运行foreach循环。您现在应该从上面的代码中得到一个合理的解决方法。
我很欣赏这是一个非常冗长的答案,我没有机会测试所有代码(实际上我相当积极,我在某处犯了错误) - 不要犹豫提问。我的另一个建议是彻底理解这些概念,然后一次编写一个你自己的代码。
祝你好运!答案 1 :(得分:0)
我这样做的方法是为他将要拾取的每个区块设计一个单独的命中测试,然后编码命中测试以在精灵的时间线内携带一个区块来播放一个框架,并且在块中播放一个帧以便被拾取该块的时间线不再处于静止状态(消失?)。
如果你对我所说的内容感到困惑,请多说一点,如果可以的话,我会尽力帮助你。