Tile based pathfinding

Allright i am about to start working on something that i have never tried before. I am making a tile based game which is set up with a two-dimensional array.
0 in the array represents wall tiles which aren't walkable.
1 in the array represents path tiles which can be walked on.
I would like to add some enemies to the game which i want to have following the character. The enemies must follow the character by walking on the shortest route possibly. I have tried looking into path-finding but it seems quite complex. If anyone has some advice on how i would go about doing this, i would very much love to hear. Maybe if someone can recommend a good tutorial that would be nice.
Thanks in advance!

Here's your typical A* pathfinding explained:
http://www.raywenderlich.com/4946/introduction-to-a-pathfinding

Similar Messages

  • Tile-based map and A-star help?

    I am working on a tower defense type game. A while ago I posted asking about maze logic and was kindly directed towards A-star pathfinding. It is perfect. I understand the concept and it makes sense. Now the problem I am having is how to do the tile-based map? I'm having a hard time wrapping my head around it. I just want to do a straight square map comprised of squares. I realize a 2D Array would probably be the best way just such as:
    int[][] map = new int[100][100]
    where there would be 100 x 100 tiles. I can then populate the array with numbers ie 0 = walkable, 1 = unwalkable. I can have my A* algorithm return the set of tiles to move to.
    My problem is that I don't want my game to be in pixels and I'm having a hard time understanding how to make the game appear tile based and large enough to be playable? ie. 1 tile = 30x30 pixels. If we are looking at it in terms of model and view, I understand the model part, but I am having a hard time translating to the view? How do I create a tile based view so that the user can only place towers on a tile(the mouse click location could be any point inside the tile)? Also, how would I keep the enemy units moving smoothly between tiles and not just jumping to the center of each tile?
    I got some great advice last time and any more advice or points in a good direction would be greatly appreciated.

    The reason to distribute your maze into nodes (tiles) is that pathfinding is slow, so you want to eliminate any notion of screen dimensions (pixels, inches, etc.) from A*. For all purposes, your maze is 100x100 pixels; any given object can choose between 100 horizontal and 100 vertical values.
    how would I keep the enemy units moving smoothly between tiles and not just jumping to the center of each tile?Although your units may only have 100x100 nodes to consider, you can still animate them walking between each adjacent node on the path. Remember that the pathfinding (per tier) will occur before anything actually moves.
    Still, this could look funny with only 100 nodes per axis. Units should use the shortest path that’s visible to them, and turning several degrees at each node will look choppy. So. I list three potential solutions here:
    • Increase the number of nodes (the “accuracy”). Speed may be an issue.
    • Use path smoothing algorithm. I haven’t seen your circumstance, but I would generally recommend this.
    • Use multi-tiered/hierarchical pathfinding. This is probably more complex to implement.
    Note that although the second and third options are distinct, they may coincide (some smoothing algorithms use multiple tiers). Googling for ‘pathfinding smoothing’ returned many results; this one in particular looked useful: [Toward More Realistic Pathfinding|http://www.gamasutra.com/features/20010314/pinter_01.htm]
    How do I create a tile based view so that the user can only place towers on a tile(the mouse click location could be any point inside the tile)?If objects can be placed at arbitrary points, then A* needs to deem nodes impassable (your array’s 1) based on the objects placed in them. You have to be careful here and decide whether entire nodes should be ignored based on tower’s partial presence; for instance:
    |====|====|====|====|====|
    |====|====|====|===+|+++=|
    |====|====|====|===+|+++=|
    |====|====|====|====|====|
    |0~0=|====|====|====|====|pixels: = ; node dividers: | (and line breaks for vertical) ; tower: +
    The tower only covers ¼ of the node at (3, 3); should you eliminate it? Five solutions are obvious:
    • Ignore any node with any chunk of a tower in it.
    • Ignore any node entirely covered by a tower.
    • Ignore any node whose center is covered by a tower. This won’t work with multi-tiered pathfinding.
    • Ignore any node that has a tower covering any point the units are required to pass through. This will work with multi-tiered pathfinding.
    • Using multi-tiered pathfinding, consider only consider the sub-nodes that aren’t covered by a tower.
    I realize a 2D Array would probably be the best way just such as
    int[][] map = new int[100][100]
    For starters, if only want two values—passable and impassible—then a boolean would be better. But I would recommend against this. I’d bet you could write some OO code specific to your situation. You might want to use terrain costs, where nodes exist that A* would prefer over others.
    I hope I answered some of your questions. Let me know if you have more—or if I didn’t.
    Good luck.
    —Douglas

  • Best way to do a tile-based map

    Hello everybody-
    This should be a simple thing but I just can't get it to work. I'm making a tile-based top-down online rpg (application, not applet), and I pretty much have most of it done except I can't get the map to display and scroll right. i will admit that java graphics isn't really my thing, but i just can't get it. Its been so frustrating that i actually quite develpment on my game and quit for awhile, but i decided to try again. What I have is an array if images that make up the map, and then i manipulate the array depending where the character is so i only draw the tiles necessary. what i want to do is to combine all the tiles i need for the particular position, draw that image to the screen (so i don't have to draw each tile individually to the screen). then i could move that large image depending where the character moved, and add tiles to it depending on which way the character moves. I just can't get it to work however. I've looked at double-bufferning posts and that gave me some ideas, but not enough for my particular situation. if anybody has any experience in this i would be more than greatful. thank you

    I know exactly what you are talking about, I had your problem a while back when I was doing mobile phone games.
    To reduce the number of cell draws needed, cells were only drawn when at the edges of the view area. (all other cells were maintained from the previously drawn frame.)
    It gets pretty complicated, but it will work - stick with it.
    I would post some code - but I don't have it anymore - and it was pretty specific to J2ME MIDP API (java mobile phone).
    p.s. When I did it, I had to include several additional optimisation, these made it incredibly complex :(
    I will try to describe it, but without pictures, It will probably be in vain. (don't worry if you don't understand it :P)
    here is the summary of the logic :-
    the backbuffer had dimensions SCREEN_WIDTH+CELL_WIDTH*2, SCREEN_HEIGHT+CELL_HEIGHT*2 (I effectively had a border that was CELL_WIDTH wide, and CELL_HEIGHT tall.)
    this meant new cells only had to be drawn every time the view area passed over a cell boundary.
    however, doing this, meant it was super smooth until it hit a cell boundary, at which point it had to draw all the cells in the newly exposed column and/or row - which caused a jerk.
    To get around this, I devised a speculative rendering, where by the next column/row was pre-rendered over a series of game frames.
    (each column/row had its own buffer into which the pre-rendering was done)
    On average 2-4 times as many edge cells had to be rendered than needed, but, because the camera moved slowly, this could be distributed over approx. 10 game frames.
    By distributing the rendering of the edge cells over a number of game frames, I hoped to remove the jerk experienced as the camera crossed a cell boundary.
    The system worked... ish... but I never finished it :(
    basically, these were crazy optimisations that were only necessary because I was developing for mobile phones.
    On mobile phones the speed of rendering is relative to the number of draw calls, NOT the actual area of the screen being repainted.
    e.g.
    fillRect(0,0,50,50)
    fillRect(0,50,50,50)
    will take almost twice as long as
    fillRect(0,0,100,100)
    even though you are only painting 1/2 the area.

  • Tile Based Movement in AS3

    Hello i am still trying to create tile based movement. What i mean by that is the character can move smoothly but will always end up in the middle of a tile (just like the pokemon games). I have managed to make it work if the player uses only one key, however in combination with other keys it does not work. I was hoping someone could give me advise how to fix the code or perhaps some better/easier way to do it.
    Here is my code so far (this is only for left and right key) my character movieclip has the instance name char
    import flash.ui.Keyboard;
    import flash.events.KeyboardEvent;
    import flash.events.Event;
    import fl.transitions.easing.*;
    import com.greensock.*;
    var pixelsMoved:Number = 0;
    var pixelsLeft:Number = 0;
    var tweening:Boolean = false;
    var rightKeyDown:Boolean = false;
    var leftKeyDown:Boolean = false;
    addEventListener(Event.ENTER_FRAME,Loop);
    stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyPress);
    stage.addEventListener(KeyboardEvent.KEY_UP,KeyRelease);
    function Loop(event:Event):void
        if (tweening == false)
            if (rightKeyDown == true)
                char.x += 1;
                pixelsMoved += 1;
            else if (leftKeyDown == true)
                char.x -= 1;
                pixelsMoved += 1;
            if (pixelsMoved >= 25)
                pixelsMoved = 0;
                pixelsLeft = 25;
    function KeyPress(event:KeyboardEvent):void
        if (event.keyCode == Keyboard.RIGHT)
            rightKeyDown = true;
        if (event.keyCode == Keyboard.LEFT)
            leftKeyDown = true;
    function KeyRelease(event:KeyboardEvent):void
        pixelsLeft = 25 - pixelsMoved;
        if (event.keyCode == Keyboard.RIGHT)
            if (tweening == false)
                var moveRight:TweenLite = new TweenLite(char,pixelsLeft,{x:char.x + pixelsLeft,ease:None.easeNone,useFrames: true,onComplete: resetVars});
            rightKeyDown = false;
            tweening = true;
        if (event.keyCode == Keyboard.LEFT)
            if (tweening == false)
                var moveLeft:TweenLite = new TweenLite(char,pixelsLeft,{x:char.x - pixelsLeft,ease:None.easeNone,useFrames: true,onComplete: resetVars});
            leftKeyDown = false;
            tweening = true;
    function resetVars():void
        tweening = false;
        pixelsLeft = 0;
        pixelsMoved = 0;
    Any help is much apreciated!

    I am not sure I understand all the requirements. Also I guess you refer to pacman game - not pokemon.
    In any case, here is something that works pretty smooth at 60fps. Note there are no ENTER_FRAME handlers - all animations are handled by TweenLite.
    Just dump the code on a timeline in a new FLA - it is not meant to be injected into your existing code. So, this is just an independent fully functional concept. All objects are created dynamically by the script - you don't have to do anything to view/test this example.
    Read comments.
    import com.greensock.easing.Ease;
    import com.greensock.easing.Linear;
    import com.greensock.easing.Sine;
    import com.greensock.TweenLite;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.KeyboardEvent;
    import flash.geom.Point;
    import flash.ui.Keyboard;
    var board:Sprite;
    var tileSide:Number = 40;
    var numRows:int = 10;
    var numCols:int = 14;
    var char:Shape;
    var _currentKey:uint = 0;
    var tween:TweenLite;
    init();
    function init():void
              drawBoard();
              configStage();
    function configStage():void
              stage.scaleMode = StageScaleMode.NO_SCALE;
              stage.align = StageAlign.TOP_LEFT;
              stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
              stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
    function onKeyRelease(e:KeyboardEvent):void
              // if the latest processed key was not release - we block the latest pressed key
              if (e.keyCode == _currentKey)
                        _currentKey = 0;
    function onKeyPress(e:KeyboardEvent):void
              currentKey = e.keyCode;
    function get tile():Shape
              var shape:Shape = new Shape();
              shape.cacheAsBitmap = true;
              var color:uint = 0x808080;
              var g:Graphics = shape.graphics;
              g.lineStyle(1, color);
              g.beginFill(0xEBEBEB);
              g.drawRect(-tileSide / 2, -tileSide / 2, tileSide, tileSide);
              return shape;
    function moveChar(targetX:int = 0, targetY:int = 0):void
              tween = TweenLite.to(char, 0.45, {x: targetX, y: targetY, ease: Linear.easeNone, onComplete: onTweenComplete});
    function onTweenComplete():void
               * need to do that
               * a. if key is kept pressed
               * c. to override situations when another key is pressed simulataneously
              currentKey = _currentKey;
    function set currentKey(value:uint):void
              var targetPosition:Number = 0;
               * key value is proccessed if
               * a. key is allowed - via switch
               * b. there is no key pressed before or ptreviously pressed key _currentKey is the same as new value
               * c. tween in not active
              if ((!_currentKey || _currentKey == value) && !tween._active)
                        switch (value)
                                  case Keyboard.RIGHT:
                                            targetPosition = char.x + tileSide;
                                            if (targetPosition < tileSide * numCols)
                                                      moveChar(targetPosition, char.y);
                                                      charRotation = 0;
                                            _currentKey = value;
                                            break;
                                  case Keyboard.LEFT:
                                            targetPosition = char.x - tileSide;
                                            if (targetPosition >= 0)
                                                      moveChar(targetPosition, char.y);
                                                      charRotation = 180;
                                            _currentKey = value;
                                            break;
                                  case Keyboard.UP:
                                            targetPosition = char.y - tileSide;
                                            if (targetPosition >= 0)
                                                      moveChar(char.x, targetPosition);
                                                      charRotation = -90;
                                            _currentKey = value;
                                            break;
                                  case Keyboard.DOWN:
                                            targetPosition = char.y + tileSide;
                                            if (targetPosition < tileSide * numRows)
                                                      moveChar(char.x, targetPosition);
                                                      charRotation = 90;
                                            _currentKey = value;
                                            break;
    function set charRotation(value:Number):void
              if (char.rotation == -180)
                        char.rotation = 180;
              if (char.rotation == 180 && value == -90)
                        char.rotation = -180;
              else if (char.rotation == -90 && value == 180)
                        value = -180;
              TweenLite.to(char, 0.2 * (Math.abs((char.rotation - value) / 90) || 1), {rotation: value});
    function drawBoard():void
              board = new Sprite();
              var numTiles:int = numRows * numCols;
              for (var i:int = 0; i < numTiles; i++)
                        var t:Shape = tile;
                        t.x = tileSide * (i % numCols);
                        t.y = tileSide * int(i / numCols);
                        board.addChild(t);
              board.addChild(addChar);
              addChild(board);
              board.x = board.y = 20 + tileSide / 2;
    function get addChar():Shape
              var radius:Number = tileSide / 2 - 4;
              char = new Shape();
              var g:Graphics = char.graphics;
              g.lineStyle(1);
              g.beginFill(0xff0000);
              g.drawCircle(0, 0, radius);
              g.endFill();
              g.lineStyle(2);
              g.moveTo(0, 0);
              g.lineTo(radius, 0);
              g.beginFill(0x000000);
              g.moveTo(radius, 0);
              g.lineTo(radius - 10, 4);
              g.lineTo(radius - 10, -4);
              g.endFill();
              tween = new TweenLite(char, 1, null);
              char.cacheAsBitmap = true;
              return char;

  • How to animate from a png tile based image file

    Hi all,
    I would like to know is there any way to animate from a tile based .png image file? I have multiple images in 1 png file having slight changes in each image, which if cropped and put into layers one over the other, will give the feel of animation or a character moving or walking etc...
    I want to know can we do that kind of animation in flash as we do it in C++ or Java and how can we do it.
    Any help will be highly appreciated.
    Thank you
    Shanz - Iceheros

    I want to use action script to externally call/access  the png file with url request and url loader and animate the images from the tile based png image file.
    Anybody know how to do this in flash with as3.
    Here is the image for example:
    i want to animate this images and call it externally and access each tile 1 after another.
    Any Help???
    Thanks,
    Shanz - Iceheros

  • Effecient tile-based game setup

    Hello i am working on the engine for a tile based game, i have set up a two dimensional array with the number 1 representing a tile, and the number 0 representing an empty space. Currently i am using the following code which does work, but it is no very effecient because there are too many movieclips on the stage, which is causing my game to run at a lower framerate.
    function prepareGame():void
        for (var y:int = 0; y<mazeHeight; y++)
            for (var x:int = 0; x<mazeWidth; x++)
                if (myMaze[y][x] == 1)
                    var cell:MovieClip = new mc_tile();
                    cell.x = ts * x;
                    cell.y = ts * y;
                    addChild(cell);
    So my question is how do i optimize this code? If i could somehow make flash view all the movieclips as one big bitmap i guess that would solve the problem but i need some help.
    Any help is appreciated thank you!

    Here is an example of scrolling tiles (just paste the code on timeline).
    Background takes only stage dimensions but the impression is that it scrolls indefinitely.
    import flash.display.BitmapData;
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    var board:Sprite;
    var bitmapData:BitmapData;
    var appendBitmapData:BitmapData;
    var copyRect:Rectangle;
    var zeroPoint:Point = new Point();
    var targetPoint:Point;
    var speed:Number = -1;
    init();
    function init():void
              drawBoard();
              setGeometry();
              addEventListener(Event.ENTER_FRAME, animate);
    function drawBoard():void
              board = new Sprite();
              var tileInstance:Sprite = tile;
              bitmapData = new BitmapData(tileInstance.width, tileInstance.height);
              bitmapData.draw(tileInstance);
              var g:Graphics = board.graphics;
              g.beginBitmapFill(bitmapData, null, true);
              g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
              addChild(board);
    function setGeometry():void
              appendBitmapData = new BitmapData(Math.abs(speed), bitmapData.height, true, 0x00000000);
              copyRect = new Rectangle(0, 0, Math.abs(speed), bitmapData.height);
              targetPoint = new Point(bitmapData.width - 1, 0);
    function animate(e:Event):void
              bitmapData.lock();
              appendBitmapData.copyPixels(bitmapData, copyRect, zeroPoint);
              bitmapData.scroll(speed, 0);
              bitmapData.copyPixels(appendBitmapData, copyRect, targetPoint);
              bitmapData.unlock();
    function get tile():Sprite
              var s:Sprite = new Sprite();
              var g:Graphics = s.graphics;
              g.lineStyle(2, 0x004000);
              g.beginFill(0x009700);
              g.drawRect(1, 1, 80, 50);
              return s;

  • Tile Based Collision Detection

    I am following Tonypa's Tile Based Tutorials and I have to
    say, they are great. He covers everything needed, except for one
    thing I am troubled on - Refering to Tutorial 9,
    http://www.tonypa.pri.ee/tbw/tut09.html,
    Stupid Enemy, instead of an enemy I want to make this a NPC who
    walks around in a village. So what do I do to make it so that I, or
    the char, doesn't walk right over the enemy/NPC? I am trying to
    develop an RPG, and it would look silly to have the character walk
    on top of the NPC. Can someone provided a snippet on how to make a
    collision detection with the NPC and not walk on top/under the NPC?
    One last favor to ask: What if I want to talk to the NPC if I
    am within a half tile? Would anyone be willing to share info on how
    this as well?
    Thanks a bunch in advance

    Ok, let me see if I get the read correct here: you have your scenery objects as tiles and when moving your players/NPC's through the scenery you are not scrolling the background as you go, but when you get to s certain point you want to scroll the tiles of the background also, so you can have new scenery cycle in as needed an still have the tiled background objects and new tiled background objects work for collision detection.
    If my take on your project is correct, then you have to make your tiles addressed with relative addressing formulas as you'll probably need to do with your sprites also.
    So the way this will go is that you have to make an offset and add them into your formula based on your character position. Then based on your character position you can choose to scroll your tiles left, right, up, down or what ever you choose to support. As a tile falls fully off the screen, you can dispose of it or cycle back through depending on how you implement your background.

  • Smooth walking on tile based map system

    Hello,
    I am developing a small game which requires the use of a map system. I chose to make that map system work upon a tile-based system. At the moment, each tile is 32x32, and I contain 24x20 tiles on my map.
    A walking system is also required for this game I'm developing, so I ran into some issues with making the loaded sprite walk "smoothly". At the moment, it jumps from tile to tile in order to walk. This makes it seem very unrealistic. I have tried many different ways to make the walking "smoother", but it requires me to change my tile's size in order to accommodate the sprite's size. This would not be an issue if I only used the same sprite in the game, but since I load different sprites which contain different measurements, I do not know how to make my walking system accommodate all of the sprites in order to make the walking realistic.
    I am not requesting any code whatsoever, simply ideas.
    Thank you

    If your image is opaque, then it may draw the edges around itself, but wouldn't this be a problem wether it were completely contained within a tile or not? If the image has transparency, then it doesn't matter if it's drawn as a rectangle, it would still appear to be contained only by its outline.
    If you're using a back-buffer (which I highly recommend if there is going to be animation or movement onscreen), then you may need to specify the type for the BufferedImage that you use as a buffer, I always use TYPE_INT_ARGB to make sure I have Alpha values (transparency).

  • Hide/Show a button on a tile, based on the tileset you're in.

    Hey,
    I made a new tileset Z_CustomerPlan, it has an existing tile in it, capshort1.
    I added a button to this existing tile capshort1, named Z_BTNPreviewAll.
    But this button should ONLY be visible when in the new tileset Z_CustomerPlan because capshort1 is used in some other tilesets.
    i tried to do this with the following code in the onload event of capshort1:
    if not mcore.uftileset = "SZ_CustomerPlan" then
         ctrlZ_BTNPreviewAll.visible = false
    end if
    but this isnt working, it makes the button invisible on all tilesets, including Z_CustomerPlan.
    So im trying to show/hide the button based on the tileset... is this the right way?
    Some help would be nice.
    Cheers,
    Maarten

    Hey Vadim,
    After an intensive investigation i came to the following conclusion...
    if not mcore.uftileset = "SZ_CustomerPlan" then
         ctrlZ_BTNPreviewAll.visible = false
    end if
    does not work, BUT..
    if not mcore.uftileset = "sZ_CustomerPlan" then
         ctrlZ_BTNPreviewAll.visible = false
    end if
    ..does work
    can you spot the difference?:)
    apparently it HAS to be a little s
    just glad its working now, i put it in the beforeload like you suggested, thx for the tip
    cheers,
    Maarten

  • Tile based movement in flash as3

    Hello i am currently working on the engine for a tiled based game. I have set up the map using a 2 dimensional array. Movement wise i have just increased/decreased the x/y position of my characer by the same amount of pixels as my tiles. Anyway of course this does not look good as my character is just "teleporting" to the next tile. Perhaps anyone can help me how to make some smooth movement and still ensure that my character will end up in the middle of a tile (Just like in the pokemon games).
    Any help is much appreciated - John

    Use a tween engine:
    http://www.greensock.com/

  • Tile Based Game Questions

    Hi, I know there are tons on posts about this topic, but I can not find the answer to my questions.
    First, how would I go about moving the world around so the char is always in the center or near center of the screen? Do I have to have some sort of offset or something?
    Second, how would I have efficient collision dection? I use the following code for movement...
    public class worldTravelPanel extends JPanel implements MouseListener
         mapGround mapGround = new mapGround();
         mapWall mapWall = new mapWall();
         mapRoof mapRoof = new mapRoof();
         mapDoor mapDoor = new mapDoor();
         mapNPC mapNPC = new mapNPC();
         Point2D start, end;
         double x, y, animationSet;
         Timer timer = new Timer();
         public worldTravelPanel()
              mapGround.loadImages("town");
              mapGround.loadTiles("olatheMap");
              mapWall.loadImages("town");
              mapWall.loadTiles("olatheMap");
              mapDoor.loadImages("town");
              mapDoor.loadTiles("olatheMap");
              mapNPC.loadImages("generic");
              mapNPC.loadTiles("olatheMap");
              mapRoof.loadImages("town");
              mapRoof.loadTiles("olatheMap");
              x = programWidth / 2;
              y = programHeight / 2;
              animationSet = 7.0;
         class moveTask extends TimerTask
              Point2D start = new Point2D.Double(hero.location[0][0], hero.location[0][1]);;
              Point2D end = new Point2D.Double(hero.location[1][0], hero.location[1][1]);
              double distance = start.distance(end);
              public void run()
                   if(((Math.abs(start.getX() - end.getX()) < 0.5) && (Math.abs(start.getY() - end.getY()) < 0.5)) && start != end)
                        start = end;
                   else if (start != end)
                        double distance = start.distance(end);
                        x = (end.getX() - start.getX()) / distance;
                        y = (end.getY() - start.getY()) / distance;
                        hero.location[1][0] = (int)(start.getX() + x);
                        hero.location[1][1] = (int)(start.getY() + y);
                        checkForCollision();
                        repaint();
                   else
                        hero.location[0][0] = (int)start.getX();
                        hero.location[0][1] = (int)start.getY();
                        timer.cancel();
              public void checkForCollision()
                   int tempX = (int)(hero.location[1][0] / 32);
                   int tempY = (int)(hero.location[1][1] / 32);
                   boolean wallCollision = false;
                        if(end.getX() > start.getX())
                        if(mapWall.currentWallMap[tempY][tempX + 1] != 00)
                             wallCollision = true;
                   else if(end.getX() < start.getX())
                        if(tempX <= 1)
                             tempX = 1;
                        if(mapWall.currentWallMap[tempY][tempX - 1] != 00)
                        wallCollision = true;
                   if(end.getY() < start.getY())
                        if(mapWall.currentWallMap[tempY + 1][tempX] != 00)
                        wallCollision = true;
                   else if(end.getY() > start.getY())
                        if(tempY <= 1)
                             tempY = 1;
                        if(mapWall.currentWallMap[tempY - 1][tempX] != 00)
                        wallCollision = true;
                   if(wallCollision == true)
                        System.out.println("Wall Collision: " + tempY + ", " + tempX);
                        //end.setLocation(hero.location[1][0], hero.location[1][1]);
                        //start.setLocation(hero.location[1][0], hero.location[1][1]);
                        start.setLocation(start.getX() + x, start.getY() + y);
                        x = start.getX();
                        y = start.getY();
                   else if(mapDoor.currentDoorMap[tempY][tempX] != 00)
                        System.out.println("Enter Door: " + mapDoor.currentDoorMap[tempY][tempX]);
                        hero.map = "olatheMap";
                        changeMap();
                   else if(mapNPC.currentNPCMap[tempY][tempX] != 00)
                        System.out.println("NPC Collision");
                        start.setLocation(start.getX() + x, start.getY() + y);
                        x = start.getX();
                        y = start.getY();
                   else
                        start.setLocation(start.getX() + x, start.getY() + y);
                        x = start.getX();
                        y = start.getY();
                   public void changeMap()
                   mapGround.loadTiles(hero.map);
                   mapWall.loadTiles(hero.map);
                   mapDoor.loadTiles(hero.map);
                   mapNPC.loadTiles(hero.map);
                   mapRoof.loadTiles(hero.map);
                   x = programWidth / 2;
                   y = programHeight / 2;
                   start.setLocation(x, y);
                   end.setLocation(x, y);
         protected void paintComponent(Graphics g)
              g.clipRect(0, 0, programWidth, programHeight);
              g.setColor(Color.white);
              g.fillRect(0, 0, programWidth, programHeight);
              mapGround.drawGround(g);//Floor Layer
              mapWall.drawWall(g);//Wall Layer
              mapDoor.drawDoor(g);//Interaction Layer 1
              mapNPC.drawNPC(g);//Interaction Layer 2
              charHero[(int)animationSet].paintIcon(this, g, (int)x, (int)y);
              mapRoof.drawRoof(g);//Roof Layer
         //Begin Mouse Listener Block
         public void mouseClicked(MouseEvent e){}
         public void mousePressed(MouseEvent e){processMouseMotion(e);}
         public void mouseReleased(MouseEvent e){}
         public void mouseEntered(MouseEvent e){}
         public void mouseExited(MouseEvent e){}
         private void processMouseMotion(MouseEvent e)
              if(e.getModifiers() == MouseEvent.BUTTON1_MASK)
                   hero.location[0][0] = (int)x;
                   hero.location[0][1] = (int)y;
                   hero.location[1][0] = (int)(e.getX() / 32) * 32 + 3;//Centers hero is tile
                   hero.location[1][1] = (int)(e.getY() / 32) * 32;//Centers hero is tile
                   timer.cancel();
                   timer = new Timer();
                   timer.schedule(new moveTask(), 0, 10);
         //End Mouse Listener Block
    }Thanks for any and all help!
    Ryltar

    I answered this here:
    http://forum.java.sun.com/thread.jsp?forum=406&thread=535480&tstart=60&trange=15
    If that doesn't work for you, ask some more specific questions and I'll try to give more help.

  • Tile Based RPG layering problems

    Hello,
    I'm having trouble making certain parts of an image go behind other images. There is an overlay image that is positioned on a tile and it covers about half of the tile above it. When i move my character to the tile above the overlay, the character is above the overlay image and not behind it. How do i make the pixels of the character image not show if the character moves behind the overlay.
    Thanks,
    Bluelikeu

    Also, characters closer to the front of the world (from the player's perspective), need to be drawn after characters farther back. Same principle.
    (Actually, there is a way you can avoid drawing overlapping pixels, but I'd recommend implementing this method before you try out something more complex.)

  • Tile based help

    Hi. I'm pretty new to actionscript and especially object
    oriented programming. I'm trying to create simple puzzle game in
    which three sets of colored pieces move on a board like knights in
    chess; except when the pieces are on black sqares, in which case
    they can move one sqare in any direction.
    Once one color piece is moved, then the next color piece has
    to be moved and a turn is given to each color. The pieces can't be
    allowed to move onto an occupied squre. The puzzle is solved when
    each piece is in its home tile specific to that piece.
    I thought it would be best to use tiles so I'm asking if
    anyone can show me some code or point me in the right direction for
    some good tutorials or fla's on the subject (I've read the Tony-pa
    ones). Thanks all!

    Hi. I'm pretty new to actionscript and especially object
    oriented programming. I'm trying to create simple puzzle game in
    which three sets of colored pieces move on a board like knights in
    chess; except when the pieces are on black sqares, in which case
    they can move one sqare in any direction.
    Once one color piece is moved, then the next color piece has
    to be moved and a turn is given to each color. The pieces can't be
    allowed to move onto an occupied squre. The puzzle is solved when
    each piece is in its home tile specific to that piece.
    I thought it would be best to use tiles so I'm asking if
    anyone can show me some code or point me in the right direction for
    some good tutorials or fla's on the subject (I've read the Tony-pa
    ones). Thanks all!

  • RPG Tile Based Map Programming

    Does anybody have any experience in this area? I have an online rpg type game that I'm working on and its going fine, the only problem is that the map scrolls too slow so your character moves too slowly. For my map I simply extended a JPanel. For every tile the character moves(one tile = 32 pixels) the screen is redrawn 8 times (each redraw basically moves the whole screen 4 pixels in the desired direction) in this way the screen moves very smoothly and character animation is smooth, but it is also pretty slow. Can anybody offer any suggestions? I would love to talk with people who have done this type of thing before becuase it is my first stab at it. thanks.

    the reason your drawing is slow, is because you are redrawing every cell, every frame. This is unnecessary, as you can reuse the cells you drew in the previous frame, by simply shifting them by the appropriate amount.
    let me clarify:
    I will use some real numbers to demonstrate the optimisation.
    screenWidth=800, screenHeight=640, cellWidth=32, cellHeight=32;
    scrollSpeed=8; // << the number of frames it takes to move by 1 complete cell
    just to render the background, your current approach calls drawImage this many times every frame
    (screenWidth/cellWidth+1)*(screenHeight/cellHeight+1)
    e.g. (800/32 +1)*(640/32+1) = 546 cell redraws/frame
    There are several approaches you can use to fix this, all require the use of a cellBuffer to cache the previously drawn cells.
    1) draw the cellBuffer onto itself, and redraw all the cells that have become corrupt.
    Approach will require (screenWidth/cellWidth+1)+(screenHeight/cellHeight+1) cell redraws
    e.g. 800/32+1 +640/32+1 = 47 cell redraws/frame
    2) have an oversized cellBuffer (with dimensions of screenWidth+cellWidth*2 by screenHeight+cellHeight*2).
    With this method, redraw of exposed cells is only necessary every time you cross a cell boundary, not every frame rendered.
    Assuming you are moving at a constant 4 pixels/frame as you describe in your question, that will mean
    e.g. 800/32+1 +640/32+1 = 47 cell redraws every 8th frame (an average of 5.9 celldraws/frame)
    This method has the lowest number of celldraws per frame. However, because you draw all newly exposed cells, in 1 go, you end up with choppy scrolling.
    3) This method attempts to solve the problem of choppy scrolling, by using predictive edge cell drawing, and distributing the cell rendering over multiple frames. (giving a more consistant frame rate)
    using this method, requires you to have 4 additional buffers (1 for each edge of the screen)
    into these buffers, the predicted cells will be cached.
    This algorithm has 2 important factors deciding its efficiency, if the viewport scrolls quickly, its efficiency will drop massively.
    The accuracy to which you can predict which edge buffer to fill up first also greatly influences the algorithms efficiency - therefor it is better suited to use in an environment where the direction of scrolling doesn't change rapidly.
    Best case performance is ((screenWidth/cellWidth+1)+(screenHeight/cellHeight+1))/scrollSpeed (assumes you are moving in both axis, if only moving in 1 axis, the performance would be even better)
    e.g. ((800/32+1)+ (640/32+1))/8= 5.9 cells/frame
    Worst case performance is ((screenWidth/cellWidth+1)*2 + (screenHeight/cellHeight+1)*2) /scrollSpeed
    e.g. ((800/32+1)*2 + (640/32+1)*2)/8 = 52+42/8 = 11.8 cells/frame.
    So, as long as you scroll at a constant 1 cell every 8 frames, this algorithm will give you a performance per frame of between
    5.9 and 11.8 cells/frame.
    As you can see, even the simple method highlighted in method 1) is approx. 9 times faster than your current method.
    and, if the choppy scrolling of method 2), or the limitations imposed by method 3) are acceptable for your implementation, you can get an algorithm that will run approx. 50-100 times faster than your current method.

  • Simple Grid/Tile based layout

    I am trying to create a simple game, where there is the human controlled character and some enemy placed in a maze. When you take one move, the enemy takes one move, until he reaches you or you reach the exit.
    What I'm having trouble figuring out is how I can lay all this out.
    What I'm envisioning is a 2 dimensional array, with each position either a 0 or 1 depending on if the user can move there or not.
    Is there a way in java to implement a grid style playing field, such that the player moves from tile to tile, and incoporate collision detection with the use of the array values?
    I could realy use some help here, I was thinking of using a layout manager, but I don't think the two ideas are compatible. Please help!

    Assuming your not going to use a special-purpose gaming library, you'll probably have to build most from scratch.
    A simple way of doing it would probably be to to create a 2-dimensional Tile array, in which Tile is a class you'll write yourself to hold all relevant information (painting info, wether it can be moved to, etc).
    If you're going for a 'square' looking game (as opposed to isometric) you might be able to use GridLayout to some extent. But in that case (or when using any other layout manager) your Tiles will have to subclass Component. My guess is that it will quickly become more work to cram everything into Component-shape than it's worth...
    Short skeleton-example of what I might do:
    public class Game extends JFrame {
        private Tile[][] tiles;
        private Monster[] monster;
        private Player player;
        private GameCanvas canvas;
        public Game() {
            canvas = new GameCanvas();
            add(canvas);
            //other initialization, listeners, etc.
        //you could call something like this when you detect user input that implies a move
        private void move(int x, int y) {
            if (tiles[x][y].isPassable()) {
                player.moveTo(x, y);
                for (int i = 0; i < monsters.length; i++) {
                    monsters.makeMove();
    canvas.repaint();
    } else {
    //inform user that he can't move to (x, y)
    private static class GameCanvas extends JPanel {
    public void paintComponent(Graphics g) {
    for (int i = 0; i < tiles.length; i ++) {
    for (int j = 0; j < tiles[i].length; j++) {
    //OtherPaintingInfo is stuff like coordinates, width, height, etc.
    //All of that more or less depends on how you want tiles to look
    tiles[i][j].paint(Graphics g, OtherPaintingInfo I);
    //do something similar for monsters and player
    private static class Tile {
    boolean isPassable() { ... }
    //Again, OtherPaintingInfo is just a placeholder for anything your impl. needs
    void paint(Graphics g, OtherPaintingInfo I() { ... }

Maybe you are looking for