battleship/参考项目/battleship-ui/battleship.js

102 lines
3.8 KiB
JavaScript
Raw Normal View History

2022-08-12 14:08:31 +00:00
let 游戏已开始 = false
const 我方舰队 = document.querySelectorAll('.战舰')
我方舰队.forEach((ship) => {
// 拖拽开始记录拖拽位置
ship.addEventListener('dragstart', (event) => {
ship.classList.add('拖拽中')
const rect = ship.getBoundingClientRect()
ship.dataset.drag_left = event.clientX - rect.left
ship.dataset.drag_top = event.clientY - rect.top
event.dataTransfer.setData('mouse_x', event.layerX)
event.dataTransfer.setData('mouse_y', event.layerY)
// DEBUG
console.log(`拖动了${ship.id},拖动点位于船上(${ship.dataset.drag_left},${ship.dataset.drag_top})`)
})
// 拖拽结束更新战舰位置
ship.addEventListener('dragend', (event) => {
// const 其它战舰 = [...我方海域.querySelectorAll('.战舰:not(.拖拽中)')]
// event.dataTransfer.setData('a', event.clientX)
// event.dataTransfer.setData('b', event.clientY)
let mouse_x = event.dataTransfer.getData('mouse_x')
let mouse_y = event.dataTransfer.getData('mouse_y')
let x = event.layerX
let y = event.layerY
console.log(parseInt(Math.ceil((x - mouse_x) / 60)), parseInt(Math.ceil((y - mouse_y) / 60)))
// 判断移动是否合法
// 更新战舰显示位置
ship.style.left = `${ship.dataset.drop_left}px`
ship.style.top = `${ship.dataset.drop_top}px`
ship.classList.remove('拖拽中')
delete ship.dataset.drag_left
delete ship.dataset.drag_top
delete ship.dataset.drop_left
delete ship.dataset.drop_top
// DEBUG
// console.log(我方海域状态)
})
// 左键点击旋转战舰
ship.addEventListener('click', (event) => {
// TODO: 检查旋转是否合法1游戏未开始2没有碰撞其它战舰3没有出边界
if (游戏已开始) return
ship.classList.toggle('水平放置')
// DEGUB
console.log(`点击了[ ${ship.id} ]的[ ${event.target.id} ]甲板`)
})
})
我方海域.addEventListener('dragover', (event) => {
event.preventDefault()
const dragging_ship = document.querySelector('.拖拽中')
if (event.target === 我方海域) {
const 拖拽中的战舰 = document.querySelector('.拖拽中')
拖拽中的战舰.dataset.drop_left = parseInt(Math.ceil(event.layerX - 拖拽中的战舰.dataset.drag_left + 30) / 60) * 60
拖拽中的战舰.dataset.drop_top = parseInt(Math.ceil(event.layerY - 拖拽中的战舰.dataset.drag_top + 30) / 60) * 60
// DEBUG
console.log(`拖拽到了(${拖拽中的战舰.dataset.drop_left}, ${拖拽中的战舰.dataset.drop_top})`)
}
// const 拖拽中的战舰 = document.querySelector('.拖拽中')
// const other_ships = [...我方海域.querySelectorAll('.ship:not(.拖拽中)')]
// let leading_ship = null
// for (let ship of other_ships) {
// const ship_rect = ship.getBoundingClientRect()
// const mouse_offset = mouse_x - ship_rect.left - ship_rect.width / 2
// if (mouse_offset > 0) leading_ship = ship
// }
// if (leading_ship) leading_ship.after(拖拽中的战舰)
// else 我方海域.prepend(拖拽中的战舰)
})
我方海域.addEventListener('dragend', (event) => {
// console.log(event)
})
敌方海域.addEventListener('click', (event) => {
if (event.target !== 敌方海域) return
// 展开迷雾
const area = document.createElement('div')
if (Math.random() > 0.5) area.classList.add('平静海面')
else area.classList.add('爆炸海面')
const col = parseInt(event.layerX / 60)
const row = parseInt(event.layerY / 60)
area.style.left = `${col * 60}px`
area.style.top = `${row * 60}px`
敌方海域.append(area)
// DEBUG
console.log(`炮击地方海域(${col}, ${row})`)
})