battleship/参考项目/battleship-ui/battleship.js
2022-08-12 22:08:31 +08:00

102 lines
3.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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})`)
})