Skip to content

Commit 347d1d7

Browse files
Added covering line logic to tileExt
1 parent 2c0e522 commit 347d1d7

5 files changed

Lines changed: 71 additions & 9 deletions

File tree

main.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
tiles.setCurrentTilemap(maze.generateTilemap(MazeAlgorithm.Ellers, 8, 8, sprites.dungeon.floorDark0, sprites.castle.tileGrass2, 2))
1+
tiles.setCurrentTilemap(maze.generateTilemap(MazeAlgorithm.Ellers, 8, 8, sprites.dungeon.floorDark0, sprites.castle.tileGrass2, 2, 0))
22
let mySprite = sprites.create(img`
33
........................
44
.....ffff...............
@@ -25,9 +25,10 @@ let mySprite = sprites.create(img`
2525
........................
2626
........................
2727
`, SpriteKind.Player)
28-
tiles.placeOnTile(mySprite, tiles.getTileLocation(2, 2))
29-
controller.moveSprite(mySprite)
28+
tiles.placeOnTile(mySprite, tiles.getTileLocation(2, 2))controller.moveSprite(mySprite)
3029
scene.cameraFollowSprite(mySprite)
3130
for (let value of tilesExt.getRandomTilesByType(sprites.castle.tileGrass2, 10)) {
3231
tiles.setTileAt(value, sprites.dungeon.chestClosed)
3332
}
33+
//tilesExt.setTileBetweenLocations(new tiles.Location(0,0,undefined), new tiles.Location(5,6,undefined), sprites.builtin.brick);
34+
game.debug = true;

pxt.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
"device": "*"
77
},
88
"files": [
9+
"tilemap.g.jres",
10+
"tilemap.g.ts",
911
"README.md",
1012
"maze.ts",
1113
"tilemapExt.ts"
@@ -27,4 +29,4 @@
2729
"arcade"
2830
],
2931
"preferredEditor": "blocksprj"
30-
}
32+
}

tilemap.g.jres

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"level5": {
1111
"id": "level5",
12-
"data": "MTAxMDAwMTAwMDAxMDMwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDIyMjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA==",
12+
"data": "MTAxMDAwMTAwMDAxMDMwMjA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIyMjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA==",
1313
"dataEncoding": "base64",
1414
"namespace": "myTiles.",
1515
"mimeType": "application/mkcd-tilemap",
@@ -18,7 +18,8 @@
1818
"myTiles.transparency16",
1919
"sprites.castle.tileGrass2",
2020
"sprites.dungeon.chestClosed",
21-
"sprites.dungeon.floorDark0"
21+
"sprites.dungeon.floorDark0",
22+
"sprites.builtin.brick"
2223
]
2324
}
2425
}

tilemap.g.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ namespace myTiles {
5050
helpers._registerFactory("tilemap", function(name: string) {
5151
switch(helpers.stringTrim(name)) {
5252
case "testTileset":
53-
case "level5":return tiles.createTilemap(hex`1000100001030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`, img`
54-
. . . 2 . . . . . . . . . . . .
53+
case "level5":return tiles.createTilemap(hex`1000100001030204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`, img`
54+
. . . . . . . . . . . . . . . .
5555
2 2 2 2 . . . . . . . . . . . .
5656
. . . . . . . . . . . . . . . .
5757
. . . . . . . . . . . . . . . .
@@ -67,7 +67,7 @@ namespace myTiles {
6767
. . . . . . . . . . . . . . . .
6868
. . . . . . . . . . . . . . . .
6969
. . . . . . . . . . . . . . . .
70-
`, [myTiles.transparency16,sprites.castle.tileGrass2,sprites.dungeon.chestClosed,sprites.dungeon.floorDark0], TileScale.Sixteen);
70+
`, [myTiles.transparency16,sprites.castle.tileGrass2,sprites.dungeon.chestClosed,sprites.dungeon.floorDark0,sprites.builtin.brick], TileScale.Sixteen);
7171
}
7272
return null;
7373
})

tilemapExt.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,63 @@
1+
enum LineType {
2+
Diagonal = 0,
3+
Covering = 1
4+
}
5+
16
//% blockNamespace=scene
27
namespace tilesExt {
8+
9+
//% l1.shadow=mapgettile
10+
//% l2.shadow=mapgettile
11+
export function coveringLineBetweenTiles<T>(l1: tiles.Location, l2: tiles.Location, exclusive: boolean, handler: (col: number, row: number) => T): T {
12+
// https://www.redblobgames.com/grids/line-drawing/#stepping
13+
const dx = l2.col-l1.col, dy = l2.row-l1.row;
14+
const absx = Math.abs(dx), absy = Math.abs(dy);
15+
const stepx = Math.sign(dx), stepy = Math.sign(dy);
16+
17+
let x = l1.col, y = l1.row;
18+
let ix = 0, iy = 0;
19+
if (exclusive) {
20+
if ((1+ix<<1)*absy < (1+iy<<1)*absx) {
21+
x += stepx;
22+
ix++;
23+
} else {
24+
y += stepy;
25+
iy++;
26+
}
27+
}
28+
29+
for (; ix < absx || iy < absy;) {
30+
const res = handler(x,y);
31+
if (res) return res;
32+
if ((1+ix<<1)*absy < (1+iy<<1)*absx) {
33+
x += stepx;
34+
ix++;
35+
} else {
36+
y += stepy;
37+
iy++;
38+
}
39+
}
40+
if (!exclusive) {
41+
const res = handler(x,y);
42+
if (res) return res;
43+
}
44+
45+
return undefined;
46+
}
47+
48+
export function isWallBetweenLocations(l1: tiles.Location, l2: tiles.Location, tileMap?: tiles.TileMap): tiles.Location | undefined {
49+
tileMap = tileMap || game.currentScene().tileMap;
50+
return coveringLineBetweenTiles(l1, l2, true, (x,y) => tileMap.isObstacle(x,y) ? new tiles.Location(x,y,l1.tileMap) : undefined);
51+
}
52+
53+
54+
export function setTileBetweenLocations(l1: tiles.Location, l2: tiles.Location, im: Image, tileMap?: tiles.TileMap): void {
55+
tileMap = tileMap || game.currentScene().tileMap;
56+
const index = tileMap.getImageType(im);
57+
coveringLineBetweenTiles(l1, l2, false, (x,y) => tileMap.setTileAt(x,y,index));
58+
}
59+
60+
361
/**
462
* Get a random tile of the given type
563
* @param tile the type of tile to get a random selection of

0 commit comments

Comments
 (0)