<template>
<div class="zombie">
<!-- 僵尸 -->
<h1>Zombie</h1>
<canvas class="canvas" width="400" height="800"></canvas>
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, reactive } from ‘vue‘
import { log } from ‘../../weapons/index‘
interface Role {
name: string;
x: number;
y: number;
step: number;
blood: number;
diretion: string;
}
export default defineComponent({
name: ‘Zombie‘,
setup () {
const ammuniRes = [] as any
let c: CanvasRenderingContext2D
class Ammunition {
x: number;
y: number;
step: number;
radius: number;
index: number;
constructor (x: number, y: number, step: number, radius: number, index: number) {
this.x = x
this.y = y
this.step = step
this.radius = radius
this.index = index
}
draw () {
c.strokeStyle = ‘white‘
c.fillStyle = ‘red‘
c.beginPath()
c.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false)
c.stroke()
c.fill()
}
update () {
this.y -= this.step
// 如果越界,消除
if (this.y <= 0) {
log(‘1‘)
ammuniRes.splice(this.index, 1)
} else {
log(‘2‘)
this.draw()
}
}
}
const role: Role = {
name: ‘hhvcg‘,
x: 200,
y: 400,
step: 10,
blood: 100,
diretion: ‘‘
}
// let test = new Ammunition(role.x + 10, role.y - 10, 3, 10)
const drawRole = (x: number, y: number) => {
// if (x === 0 || x === 400 || y === 0 || y === 800) return
c.clearRect(0, 0, 400, 800)
c.fillStyle = ‘black‘
c.fillRect(x, y, 20, 20)
}
const drawShot = () => {
// 射击动作
requestAnimationFrame(drawShot)
c.clearRect(0, 0, 400, role.y)
for (let i = 0; i < ammuniRes.length; i++) {
ammuniRes[i].update()
}
log(‘ammuniRes‘, ammuniRes.length)
log(‘=====================‘)
}
const movePerson = (action: string) => {
// 获取任务坐标,执行对应行为
// const people: any = document.getElementById(‘role‘)
switch (action) {
case ‘up‘:
role.diretion = ‘up‘
drawRole(role.x, role.y -= role.step)
// people.style.top = Number(people.style.top.slice(0, -2)) - 10 + ‘px‘
break
case ‘right‘:
role.diretion = ‘right‘
drawRole(role.x += role.step, role.y)
// people.style.left = Number(people.style.left.slice(0, -2)) + 10 + ‘px‘
break
case ‘bottom‘:
role.diretion = ‘bottom‘
drawRole(role.x, role.y += role.step)
// people.style.top = Number(people.style.top.slice(0, -2)) + 10 + ‘px‘
break
case ‘left‘:
role.diretion = ‘left‘
drawRole(role.x -= role.step, role.y)
break
case ‘shot‘:
// eslint-disable-next-line no-case-declarations
const am = new Ammunition(role.x + 10, role.y - 10, 3, 10, ammuniRes.length)
ammuniRes.push(am)
drawShot()
}
}
document.onkeydown = (e) => {
const target = Number(e.which)
switch (target) {
case 37:
movePerson(‘left‘)
break
case 38:
movePerson(‘up‘)
break
case 39:
movePerson(‘right‘)
break
case 40:
movePerson(‘bottom‘)
break
case 32:
movePerson(‘shot‘)
break
}
}
const initCanvas = () => {
const canvas: any = document.getElementsByClassName(‘canvas‘)[0]
c = canvas.getContext(‘2d‘)
drawRole(role.x, role.y)
}
log(‘zombie‘)
onMounted(() => {
initCanvas()
})
return {
initCanvas,
drawRole,
movePerson,
drawShot
}
}
})
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less">
@import ‘../../css/Zombie.less‘;
</style>
原文:https://www.cnblogs.com/hhvcg/p/15236607.html