fix: rewite some for loop in RMG and fix some bugs
This commit is contained in:
parent
d9b81428f4
commit
966be01643
|
@ -52,9 +52,9 @@ export default class RandomMapGenerator {
|
||||||
this.exitFacing = this.getEntranceFacing(this.template.exit.entrances[0], this.template.exit.width);
|
this.exitFacing = this.getEntranceFacing(this.template.exit.entrances[0], this.template.exit.width);
|
||||||
|
|
||||||
|
|
||||||
this.template.rooms.forEach((room) => {
|
for (let room of this.template.rooms) {
|
||||||
let left = false, right = false, up = false, down = false;
|
let left = false, right = false, up = false, down = false;
|
||||||
room.entrances.forEach((entrance) => {
|
for (let entrance of room.entrances) {
|
||||||
let facing = this.getEntranceFacing(entrance, room.width);
|
let facing = this.getEntranceFacing(entrance, room.width);
|
||||||
switch (facing) {
|
switch (facing) {
|
||||||
case Facing.LEFT:
|
case Facing.LEFT:
|
||||||
|
@ -72,7 +72,7 @@ export default class RandomMapGenerator {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
if (left) {
|
if (left) {
|
||||||
this.roomWithLeftEntrance.push(room);
|
this.roomWithLeftEntrance.push(room);
|
||||||
this.roomWithLeftEntranceWeight += room.weight;
|
this.roomWithLeftEntranceWeight += room.weight;
|
||||||
|
@ -89,7 +89,7 @@ export default class RandomMapGenerator {
|
||||||
this.roomWithDownEntrance.push(room);
|
this.roomWithDownEntrance.push(room);
|
||||||
this.roomWithDownEntranceWeight += room.weight;
|
this.roomWithDownEntranceWeight += room.weight;
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getMap(): TiledTilemapData {
|
getMap(): TiledTilemapData {
|
||||||
|
@ -105,6 +105,7 @@ export default class RandomMapGenerator {
|
||||||
throw new Error("Fail to generate a map with exit!");
|
throw new Error("Fail to generate a map with exit!");
|
||||||
|
|
||||||
this.fillData();
|
this.fillData();
|
||||||
|
console.log("Generated map:", this.map);
|
||||||
return this.map;
|
return this.map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,8 +142,7 @@ export default class RandomMapGenerator {
|
||||||
let nextRoom = this.getRandomRoom(facing);
|
let nextRoom = this.getRandomRoom(facing);
|
||||||
let nextPosition: Vec2 = undefined;
|
let nextPosition: Vec2 = undefined;
|
||||||
let thisEntrance: Entrance = undefined;
|
let thisEntrance: Entrance = undefined;
|
||||||
for (let index = 0; index < nextRoom.entrances.length; index++) {
|
for (let entrance of nextRoom.entrances) {
|
||||||
const entrance = nextRoom.entrances[index];
|
|
||||||
if (this.getEntranceFacing(entrance, nextRoom.weight) == facing) {
|
if (this.getEntranceFacing(entrance, nextRoom.weight) == facing) {
|
||||||
let tmpPosition = new Vec2(position.x - entrance.x, position.y - entrance.y);
|
let tmpPosition = new Vec2(position.x - entrance.x, position.y - entrance.y);
|
||||||
if (this.isValidRoom(tmpPosition, new Vec2(tmpPosition.x + nextRoom.width - 1, tmpPosition.y + nextRoom.height - 1))) {
|
if (this.isValidRoom(tmpPosition, new Vec2(tmpPosition.x + nextRoom.width - 1, tmpPosition.y + nextRoom.height - 1))) {
|
||||||
|
@ -160,8 +160,7 @@ export default class RandomMapGenerator {
|
||||||
if (this.hasExit && this.gen.range() <= 0.1) {
|
if (this.hasExit && this.gen.range() <= 0.1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (let index = 0; index < nextRoom.entrances.length; index++) {
|
for (let entrance of nextRoom.entrances) {
|
||||||
const entrance = nextRoom.entrances[index];
|
|
||||||
if (entrance != thisEntrance) {
|
if (entrance != thisEntrance) {
|
||||||
let facing = this.getEntranceFacing(entrance, nextRoom.width);
|
let facing = this.getEntranceFacing(entrance, nextRoom.width);
|
||||||
let position = new Vec2(nextPosition.x + entrance.x, nextPosition.y + entrance.y);
|
let position = new Vec2(nextPosition.x + entrance.x, nextPosition.y + entrance.y);
|
||||||
|
@ -248,8 +247,7 @@ export default class RandomMapGenerator {
|
||||||
this.map.layers[0].data = new Array(width * height).fill(this.template.background);
|
this.map.layers[0].data = new Array(width * height).fill(this.template.background);
|
||||||
this.map.layers[1].data = new Array(width * height);
|
this.map.layers[1].data = new Array(width * height);
|
||||||
|
|
||||||
for (let index = 0; index < this.rooms.length; index++) {
|
for (let room of this.rooms) {
|
||||||
const room = this.rooms[index];
|
|
||||||
let roomWidth = room.bottomRight.x - room.topLeft.x + 1;
|
let roomWidth = room.bottomRight.x - room.topLeft.x + 1;
|
||||||
let roomHeight = room.bottomRight.y - room.topLeft.y + 1;
|
let roomHeight = room.bottomRight.y - room.topLeft.y + 1;
|
||||||
for (let i = 0; i < roomHeight; i++)
|
for (let i = 0; i < roomHeight; i++)
|
||||||
|
@ -258,8 +256,7 @@ export default class RandomMapGenerator {
|
||||||
this.map.layers[1].data[(room.topLeft.y + i) * width + room.topLeft.x + j] = room.topLayer[i * roomWidth + j];
|
this.map.layers[1].data[(room.topLeft.y + i) * width + room.topLeft.x + j] = room.topLayer[i * roomWidth + j];
|
||||||
}
|
}
|
||||||
if (room.enemies)
|
if (room.enemies)
|
||||||
for (let index = 0; index < room.enemies.length; index++) {
|
for (let enemy of this.enemies) {
|
||||||
const enemy = room.enemies[index];
|
|
||||||
enemy.position.x -= this.minX;
|
enemy.position.x -= this.minX;
|
||||||
enemy.position.y -= this.minY;
|
enemy.position.y -= this.minY;
|
||||||
this.enemies.push(enemy);
|
this.enemies.push(enemy);
|
||||||
|
@ -270,15 +267,15 @@ export default class RandomMapGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private isValidRoom(topLeft: Vec2, bottomRight: Vec2): boolean {
|
private isValidRoom(topLeft: Vec2, bottomRight: Vec2): boolean {
|
||||||
for (let index = 0; index < this.rooms.length; index++) {
|
for (let room of this.rooms) {
|
||||||
const room = this.rooms[index];
|
|
||||||
if (room.topLeft.x <= bottomRight.x &&
|
if (room.topLeft.x <= bottomRight.x &&
|
||||||
room.bottomRight.x >= topLeft.x &&
|
room.bottomRight.x >= topLeft.x &&
|
||||||
room.topLeft.y <= bottomRight.y &&
|
room.topLeft.y <= bottomRight.y &&
|
||||||
room.bottomRight.y >= topLeft.y)
|
room.bottomRight.y >= topLeft.y) {
|
||||||
|
console.warn("Found an invalid room! TopLeft:", topLeft.toString(), "BottomRight:", bottomRight.toString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
console.warn("Found an invalid room! TopLeft:", topLeft.toString, "BottomRight:", bottomRight.toString);
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,8 +309,7 @@ export default class RandomMapGenerator {
|
||||||
if (value >= weight)
|
if (value >= weight)
|
||||||
throw new Error("Random number " + value + " is larger than total weight " + weight);
|
throw new Error("Random number " + value + " is larger than total weight " + weight);
|
||||||
|
|
||||||
for (let index = 0; index < array.length; index++) {
|
for (let room of array) {
|
||||||
let room = array[index];
|
|
||||||
if (value < room.weight)
|
if (value < room.weight)
|
||||||
return room;
|
return room;
|
||||||
value -= room.weight;
|
value -= room.weight;
|
||||||
|
@ -355,8 +351,7 @@ export default class RandomMapGenerator {
|
||||||
room.bottomLayer = [...old.bottomLayer];
|
room.bottomLayer = [...old.bottomLayer];
|
||||||
room.enemies = new Array();
|
room.enemies = new Array();
|
||||||
if (old.sprites) {
|
if (old.sprites) {
|
||||||
for (let index = 0; index < old.sprites.length; index++) {
|
for (let sprite of old.sprites) {
|
||||||
const sprite = old.sprites[index];
|
|
||||||
if (sprite.type === 'player') {
|
if (sprite.type === 'player') {
|
||||||
this.player.x = sprite.x;
|
this.player.x = sprite.x;
|
||||||
this.player.y = sprite.y;
|
this.player.y = sprite.y;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user