scatter pieces around board
This commit is contained in:
parent
d8f9f856e6
commit
2b4fe09d90
4 changed files with 81 additions and 27 deletions
|
|
@ -557,16 +557,16 @@ async function main () {
|
||||||
// The actual place for the puzzle. The tiles may
|
// The actual place for the puzzle. The tiles may
|
||||||
// not be moved around infinitely, just on the (invisible)
|
// not be moved around infinitely, just on the (invisible)
|
||||||
// puzzle table. however, the camera may move away from the table
|
// puzzle table. however, the camera may move away from the table
|
||||||
const puzzleTableColor = [200, 0, 0, 255]
|
const puzzleTableColor = [40, 40, 40, 0]
|
||||||
const puzzleTable = new Bitmap(
|
const puzzleTable = new Bitmap(
|
||||||
puzzle.info.width * 2,
|
puzzle.info.table.width,
|
||||||
puzzle.info.height * 2,
|
puzzle.info.table.height,
|
||||||
puzzleTableColor
|
puzzleTableColor
|
||||||
)
|
)
|
||||||
|
|
||||||
// In the middle of the table, there is a board. this is to
|
// In the middle of the table, there is a board. this is to
|
||||||
// tell the player where to place the final puzzle
|
// tell the player where to place the final puzzle
|
||||||
const boardColor = [0, 150, 0, 255]
|
const boardColor = [80, 80, 80, 255]
|
||||||
const board = new Bitmap(
|
const board = new Bitmap(
|
||||||
puzzle.info.width,
|
puzzle.info.width,
|
||||||
puzzle.info.height,
|
puzzle.info.height,
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,4 @@
|
||||||
|
|
||||||
cd "$RUN_DIR/server"
|
cd "$RUN_DIR/server"
|
||||||
|
|
||||||
nodemon index.js
|
nodemon -d 2 index.js
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import { uniqId, choice } from './util.js'
|
||||||
|
|
||||||
// desired number of tiles
|
// desired number of tiles
|
||||||
// actual calculated number can be higher
|
// actual calculated number can be higher
|
||||||
const TARGET_TILES = 1000
|
const TARGET_TILES = 500
|
||||||
|
|
||||||
const IMAGES = [
|
const IMAGES = [
|
||||||
'/example-images/ima_86ec3fa.jpeg',
|
'/example-images/ima_86ec3fa.jpeg',
|
||||||
|
|
@ -55,7 +55,6 @@ app.use('/', (req, res, next) => {
|
||||||
statics(req, res, next)
|
statics(req, res, next)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
app.listen(port, hostname, () => console.log(`server running on http://${hostname}:${port}`))
|
|
||||||
|
|
||||||
const wss = new WebSocketServer(config.ws);
|
const wss = new WebSocketServer(config.ws);
|
||||||
|
|
||||||
|
|
@ -109,4 +108,6 @@ wss.on('message', async ({socket, data}) => {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
app.listen(port, hostname, () => console.log(`server running on http://${hostname}:${port}`))
|
||||||
wss.listen()
|
wss.listen()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import sizeOf from 'image-size'
|
import sizeOf from 'image-size'
|
||||||
import { choice } from './util.js'
|
import { choice, shuffle } from './util.js'
|
||||||
|
|
||||||
// cut size of each puzzle tile in the
|
// cut size of each puzzle tile in the
|
||||||
// final resized version of the puzzle image
|
// final resized version of the puzzle image
|
||||||
|
|
@ -23,28 +23,77 @@ async function createPuzzle(targetTiles, image) {
|
||||||
}
|
}
|
||||||
const shapes = determinePuzzleTileShapes(info)
|
const shapes = determinePuzzleTileShapes(info)
|
||||||
|
|
||||||
// Complete puzzle object
|
let positions = new Array(info.tiles)
|
||||||
const p = {
|
for (let tile of tiles) {
|
||||||
// tiles array
|
positions[tile.idx] ={
|
||||||
tiles: tiles.map(tile => {
|
// instead of info.tileSize, we use info.tileDrawSize
|
||||||
|
// to spread the tiles a bit
|
||||||
|
x: (info.coords[tile.idx].x) * (info.tileSize * 1.5),
|
||||||
|
y: (info.coords[tile.idx].y) * (info.tileSize * 1.5),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let tableWidth = info.width * 3
|
||||||
|
let tableHeight = info.height * 3
|
||||||
|
|
||||||
|
let off = (info.tileSize * 1.5)
|
||||||
|
let last = {x: info.width - (1 * off), y: info.height - (2 * off) }
|
||||||
|
let count_x = Math.ceil(info.width / off) + 2
|
||||||
|
let count_y = Math.ceil(info.height / off) + 2
|
||||||
|
|
||||||
|
let diff_x = off
|
||||||
|
let diff_y = 0
|
||||||
|
let index = 0
|
||||||
|
for (let pos of positions) {
|
||||||
|
pos.x = last.x
|
||||||
|
pos.y = last.y
|
||||||
|
last.x+=diff_x
|
||||||
|
last.y+=diff_y
|
||||||
|
index++
|
||||||
|
// did we move horizontally?
|
||||||
|
if (diff_x !== 0) {
|
||||||
|
if (index === count_x) {
|
||||||
|
diff_y = diff_x
|
||||||
|
count_y ++
|
||||||
|
diff_x = 0
|
||||||
|
index = 0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (index === count_y) {
|
||||||
|
diff_x = -diff_y
|
||||||
|
count_x ++
|
||||||
|
diff_y = 0
|
||||||
|
index = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// then shuffle the positions
|
||||||
|
positions = shuffle(positions)
|
||||||
|
|
||||||
|
tiles = tiles.map(tile => {
|
||||||
return {
|
return {
|
||||||
idx: tile.idx, // index of tile in the array
|
idx: tile.idx, // index of tile in the array
|
||||||
group: 0, // if grouped with other tiles
|
group: 0, // if grouped with other tiles
|
||||||
z: 0, // z index of the tile
|
z: 0, // z index of the tile
|
||||||
owner: 0, // who owns the tile
|
|
||||||
|
// who owns the tile
|
||||||
// 0 = free for taking
|
// 0 = free for taking
|
||||||
// -1 = finished
|
// -1 = finished
|
||||||
// other values: id of player who has the tile
|
// other values: id of player who has the tile
|
||||||
|
owner: 0,
|
||||||
|
|
||||||
// physical current position of the tile (x/y in pixels)
|
// physical current position of the tile (x/y in pixels)
|
||||||
// this position is the initial position only and is the
|
// this position is the initial position only and is the
|
||||||
// value that changes when moving a tile
|
// value that changes when moving a tile
|
||||||
// TODO: scatter the tiles on the table at the beginning
|
pos: positions[tile.idx],
|
||||||
pos: {
|
|
||||||
x: info.coords[tile.idx].x * info.tileSize,
|
|
||||||
y: info.coords[tile.idx].y * info.tileSize,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}),
|
})
|
||||||
|
|
||||||
|
// Complete puzzle object
|
||||||
|
const p = {
|
||||||
|
// tiles array
|
||||||
|
tiles,
|
||||||
// game data for puzzle, data changes during the game
|
// game data for puzzle, data changes during the game
|
||||||
data: {
|
data: {
|
||||||
// TODO: maybe calculate this each time?
|
// TODO: maybe calculate this each time?
|
||||||
|
|
@ -54,6 +103,10 @@ async function createPuzzle(targetTiles, image) {
|
||||||
// static puzzle information. stays same for complete duration of
|
// static puzzle information. stays same for complete duration of
|
||||||
// the game
|
// the game
|
||||||
info: {
|
info: {
|
||||||
|
table: {
|
||||||
|
width: tableWidth,
|
||||||
|
height: tableHeight,
|
||||||
|
},
|
||||||
// information that was used to create the puzzle
|
// information that was used to create the puzzle
|
||||||
targetTiles: targetTiles,
|
targetTiles: targetTiles,
|
||||||
imageUrl: imgUrl,
|
imageUrl: imgUrl,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue