True Isometric Projection with HTML5 Canvas

前端 未结 2 537
旧巷少年郎
旧巷少年郎 2020-12-03 00:27

I am a newbie with HTML5 Canvas and JavaScript, but is there a simple way to have Isometric projection in HTML5 Canvas element?

I am mean the true isometric projecti

2条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-03 00:48

    First, I would recommend thinking of the game world as a regular X by Y grid of square tiles. This makes everything from collision detection, pathfinding, and even rendering much easier.

    To render the map in an isometric projection simply modify the projection matrix:

    var ctx = canvas.getContext('2d');
    
    function render(ctx) {
        var dx = 0, dy = 0;
        ctx.save();
    
        // change projection to isometric view
        ctx.translate(view.x, view.y);
        ctx.scale(1, 0.5);
        ctx.rotate(45 * Math.PI /180);
    
        for (var y = 0; i < 10; y++) {
            for (var x = 0; x < 10; x++) {
                ctx.strokeRect(dx, dy, 40, 40);
                dx += 40;
            }
            dx = 0;
            dy += 40;
        }
    
        ctx.restore(); // back to orthogonal projection
    
        // Now, figure out which tile is under the mouse cursor... :)
    }
    

    This is exciting the first time you get it work, but you'll quickly realize that it's not that useful for drawing actual isometric maps... you can't just rotate your tile images and see what's around the corner. The transformations are not so much for drawing, as they are for converting between screen space and world space.

    Bonus: figuring out which tile the mouse is over

    What you want to do is convert from "view coordinates" (pixel offsets from the canvas origin) to "world coordinates" (pixel offsets from tile 0,0 along the diagonal axes). Then simply divide the world coordinates by the tile width and height to get the "map coordinates".

    In theory, all you need to do is project the "view position" vector by the inverse of the projection matrix above to get the "world position". I say in theory, because for some reason the canvas doesn't provide a way of returning the current projection matrix. There is a setTransform() method, but no getTransform(), so this is where you'd have to roll your own 3x3 transformation matrix.

    It's not actually that hard, and you will need this for converting between world and view coordinates when drawing objects.

    Hope this helps.

提交回复
热议问题