开发者

Problems in my AS2 Game

Hey guys, I'm trying to make a 2D Platform style game similar to this game below:

http://www.gameshed.com/Puzzle-Games/Blockdude/play.html

I have finished making most of the graphic, 开发者_JAVA百科and areas, and collision, but our character is still not able to carry things. I'm confused as to what code to use so that my character can carry the blocks. I need help as to how to make our character carry blocks that are in front of him, provided that the blocks that don't have anything on top of it. This has been confusing me for a week now, and any help would be highly appreciated. :D


I fondly remember my first AS2 game. The best approach is probably an object oriented approach, as I will explain.

In AS2, there is a hittest method automatically built into objects. There is a good tutorial on Kirupa here:

http://www.kirupa.com/developer/actionscript/hittest.htm

also

http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00001314.html

First you'll want to generate your boxes using a Box class. Your class would need to look something like the following:

//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

}

See this tutorial on how to attach a class to an object in the library:

http://www.articlesbase.com/videos/5min/86620312

To create a new Box, you'd then use something like box1 = new Box(100,200); // creates a box at position 100x,200y

However, you'll also want to store the blocks you want to pickup into some sort of array so you can loop through them. See http://www.tech-recipes.com/rx/1383/flash-actionscript-create-an-array-of-objects-from-a-unique-class/

Example:

//somewhere near the top of your main method, or whereever your main game loop is running from - note Box.as would need to be in the same folder import Box;

//...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);
    }

Similarly, you would need a class for your player, and to create a new Player object at the start of your game, e.g.

var player = new Player(0,0);

You could then run a hittest method for your player against the blocks in your array for the main game loop (i.e. the loop that updates your player's position and other game properties). There are probably more efficient ways of doing this, e.g. only looping for the blocks that are currently on the screen.

Once your array has been created, use a foreach loop to run a hittest against your player in your game's main loop, e.g.

//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
    if (player.hittest(box)) {
        player.attachObjectMethod(box);
    }
}

This is basically pseudo-code for "for every box that we have entered into the array, check if the player is touching the box. If the box is touching, use the box as the argument for a method in the player class (which I have arbitrarily called attachObjectMethod)".

In attachObjectMethod, you could then define some sort of behavior for attaching the box to the player. For example, you could create a get and set method(s) for the x and y position of your boxes inside the box class, along with a boolean called something useful like attachedToPlayer. When attachObjectMethod was called, it would set the box's boolean, e.g. in the Player class

//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
}

Now the attachedToPlayer boolean of the box the player has collided with would be true. Back in our game loop, we would then modify our loop to update the position of the boxes:

//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);
}

In our Box class, we now need to define '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

}

As you can see we can pass the player's position, and update the box's position if the attachedToPlayer boolean has been set. Finally, we add a move method to the box:

public function move() {
    if (this.attachedToPlayer) {
        this._x = x_pos;
        this._y = y_pos;
    }
}

Examples of updating position: http://www.swinburne.edu.au/design/tutorials/P-flash/T-How-to-smoothly-slide-objects-around-in-Flash/ID-17/

Finally, to make it all work we need to call the move method in the game loop:

//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();
}

You have also specified that the blocks should only move with the player if they have nothing on top of them. When you call your attachedToPlayer method, you would also need to run a foreach loop inside the method between the box and the objects that might sit on top of the box. You should now have a fair idea from the above code how to do this.

I appreciate that this is quite a lengthy answer, and I haven't had an opportunity to test all the code (in fact I'm fairly positive I made a mistake somewhere) - don't hesitate to ask questions. My other advice is to understand the concepts thoroughly, and then write your own code one bit at a time.

Good luck!


The way I would do this is to design an individual hit test for each block he will be picking up, then code for the hit test to play a frame within the sprite's timeline of him carrying a block, and to play a frame within the block to be picked up's timeline of the block no longer at rest (disappeared?).

Good Luck if you're confused about what I've said just ask a little more about it and I'll try to help you if I can.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜