都给老婆和孩子写了 合十 钓鱼了,给自己写个打飞机吧。没找飞机怪兽的图片。就用馒头和肉肉代替了。有问题不要私信我。自己改哈
- <template>
- <view class="page_main">
-
-
- <view class="contentone">
- <canvas class="canvas_cla" style="z-index: 1;" canvas-id="myCanvas" id="myCanvas"></canvas>
-
- </view>
- <view class="contentone">
- <canvas class="canvas_cla" style="z-index: 2;" canvas-id="myCanvasb" id="myCanvasb"></canvas>
-
- </view>
-
- <view class="contenttwo">
- <canvas class="canvas_cla" style="z-index: 9;" canvas-id="myCanvasa" id="myCanvasa" @touchstart="touchstart"
- @touchend="touchend" @touchmove="touchmove"></canvas>
-
- </view>
-
-
- <view class="zhezhao" v-if="isshowstart">
- <view class="dialog_back">
- <cover-view class="add_button_ef" style=" color: #07a5a6;" @tap.stop.prevent="start_zhezhao">
- 开始
- </cover-view>
- <cover-view class="add_button_ef" style="color: #07a5a6;" @tap.stop.prevent="back_zhezhao">
- 返回
- </cover-view>
- </view>
- </view>
-
-
-
-
-
-
-
- </view>
- </template>
-
- <script>
- export default {
- data() {
- return {
- isshowstart: true,
- canvaswidth: 0,
- canvasheight: 0,
-
- ctx: null, // canvas 上下文
- ctxtwo: null, // canvas 上下文
- ctxthree: null, // canvas 上下文
-
- background: {
- images: ['../static/fangzi1.png', '../static/fangzi1.png'], // 图片资源数组
-
- speed: 2, // 滚动速度
- position: 0, // 图片当前位置
- },
-
- zhujue: {
- x: 0,
- y: 0,
- image: '../static/addpeople.png',
- size: 50,
- speed: 2,
- ismoveing: false,
- value: 200,
- zdvalue: 20,
- fstime: 120,
- zdsize: 10,
- lives: 5,
- wdtime: 0,
- isdie: false,
-
-
-
- },
- zhujpz: false,
- zjzdlist: [],
- gslist: [],
- bosslist: [],
-
- guankadefen: 0,
- defen: 0,
- guanka: 1,
- isboos: false,
-
-
-
- ytimerX: null, // requestAnimationFrame 的 ID
- zjfszdtimer: '',
-
- jspztimer: '',
-
-
- };
- },
- onLoad() {
-
-
- },
-
- onReady() {
-
-
- this.init()
- },
-
- /**
- * 生命周期函数--监听页面卸载
- */
- onUnload: function() {
- this.game_stop()
- },
- methods: {
- start_zhezhao: function() {
- this.isshowstart = false
-
- this.game_start(); // 开始滚动
-
- },
- back_zhezhao: function() {
- uni.navigateBack({
- delta: 1
- })
- },
- init: function() {
-
- this.ctx = uni.createCanvasContext('myCanvas');
- this.ctxtwo = uni.createCanvasContext('myCanvasa');
- this.ctxthree = uni.createCanvasContext('myCanvasb');
- let canvas = uni.createSelectorQuery().select('#myCanvas');
- canvas.boundingClientRect(rect => {
- this.canvaswidth = rect.width
- this.canvasheight = rect.height
- this.zhujue.x = (rect.width - this.zhujue.size) / 2
- this.zhujue.y = rect.height - this.zhujue.size - 50
- this.drawzj()
- }).exec();
- this.drawbackg();
-
-
- },
-
- drawzj: function() {
-
- if (this.zhujue.x < 0) {
- this.zhujue.x = 0
- }
- if (this.zhujue.x > this.canvaswidth - this.zhujue.size) {
- this.zhujue.x = this.canvaswidth - this.zhujue.size
- }
-
- if (this.zhujue.y < 0) {
- this.zhujue.y = 0
- }
- if (this.zhujue.y > this.canvasheight - this.zhujue.size) {
- this.zhujue.y = this.canvasheight - this.zhujue.size
- }
- if (this.zhujpz) {
- this.ctxtwo.drawImage('../static/mantou.png', this.zhujue.x, this.zhujue.y - 30, this.zhujue.size -
- 20, this.zhujue.size - 20); // 绘制图片
- this.zjdrawbaopo()
- }
- this.ctxtwo.drawImage(this.zhujue.image, this.zhujue.x, this.zhujue.y, this.zhujue.size, this.zhujue
- .size); // 绘制图片
-
- this.ctxtwo.draw();
-
- },
- drawzjzd: function() {
-
-
-
- for (var i = 0; i < this.zjzdlist.length; i++) {
-
- if (this.zjzdlist[i].isuse) {
- this.zjzdlist.splice(i, 1)
- i--
- } else {
- this.ctxthree.drawImage(this.zjzdlist[i].image, this.zjzdlist[i].x, this.zjzdlist[i].y,
- this.zhujue.zdsize, this.zhujue.zdsize); // 绘制图片
- }
-
-
- }
- if (this.isboos) {
- this.drawboos()
- } else {
- this.drawgs()
- }
-
- this.ctxthree.draw();
- },
-
- zjfszd: function() {
- this.zjfszdtimer = setInterval(() => {
- var zd = {
- x: this.zhujue.x + this.zhujue.size / 2 - this.zhujue.zdsize / 2,
- y: this.zhujue.y,
- image: '../static/mantou.png',
- speed: 3,
- isuse: false
- }
- this.zjzdlist.push(zd)
- }, this.zhujue.fstime);
- },
-
- scgs: function() {
-
-
- let gs = {
- x: this.getRandomInt(50, this.canvaswidth - 50),
- y: -45,
- size: 20 + this.guanka * 3,
- image: "../static/rou.png",
- value: 100 * this.guanka * 0.8,
- speed: 0.5 * this.guanka * 0.8,
- isfszd: this.getRandomInt(0, 1),
- isdj: this.getRandomInt(0, 2), // 怪兽携带道具 0 不带 1 子弹威力+0.1 2 发射速度-0.5
- zdspeed: 5 * this.guanka * 0.5,
- isover: false
- }
- this.gslist.push(gs)
-
- },
- drawgs: function() {
- for (var i = 0; i < this.gslist.length; i++) {
- if (this.gslist[i].isover) {
- this.drawbaopo(this.gslist[i])
- this.gslist.splice(i, 1)
- i--
- } else {
- this.gslist[i].y += this.gslist[i].speed
- this.ctxthree.drawImage(this.gslist[i].image, this.gslist[i].x, this.gslist[i].y, this
- .gslist[i].size, this.gslist[i].size); // 绘制图片
- }
-
- }
-
- },
- drawboos: function() {
- var that = this
- // 计算物体A需要移动的距离和方向
- const dx = that.bosslist[0].x + that.bosslist[0].size / 2 - that.bosslist[0].mbx; // 水平移动距离
- const dy = that.bosslist[0].y + that.bosslist[0].size / 2 - that.bosslist[0]
- .mby // 垂直移动距离为0,因为我们只想在水平方向上移动
-
-
- if (dx > 10) {
- that.bosslist[0].x = that.bosslist[0].x - that.bosslist[0].speed
- } else if (dx < -10) {
- that.bosslist[0].x = that.bosslist[0].x + that.bosslist[0].speed
- }
- if (dy > 10) {
- that.bosslist[0].y = that.bosslist[0].y - that.bosslist[0].speed
- } else if (dy < -10) {
- that.bosslist[0].y = that.bosslist[0].y + that.bosslist[0].speed
- }
-
-
- that.ctxthree.drawImage(that.bosslist[0].image, that.bosslist[0].x, that.bosslist[0].y,
- that.bosslist[0].size, that.bosslist[0].size); // 绘制图片
-
- if (dy <= 10 && dy >= -10 && dx <= 10 && dx >= -10) {
-
- if (!that.bosslist[0].isover) {
- that.bosslist[0].mbx = that.getRandomInt(50, that.canvaswidth - 50)
- that.bosslist[0].mby = that.getRandomInt(50, that.canvasheight - 50)
- that.bosslist[0].speed = that.getRandomInt(1, 5)
-
- }
-
- }
-
-
-
- },
- drawbaopo: function(bean) {
- var that = this
- let counter = 0; // 计数器,记录执行次数
- const intervalId = setInterval(function() {
- // 这里是你的操作代码
- that.ctxthree.drawImage("../static/mantou.png", bean.x, bean.y, bean.size, bean
- .size); // 绘制图片
-
- counter++; // 每次执行,计数器加1
-
- // 检查是否达到了执行三次的条件
- if (counter >= 10) {
- clearInterval(intervalId); // 清除定时器
-
- }
- }, 100); // 每秒执行一次(1000毫秒)
-
-
- },
- zjdrawbaopo: function() {
- var that = this
- let counter = 0; // 计数器,记录执行次数
- const intervalId = setInterval(function() {
- // 这里是你的操作代码
-
- counter++; // 每次执行,计数器加1
-
- // 检查是否达到了执行三次的条件
- if (counter >= 10) {
- that.zhujpz = false
- clearInterval(intervalId); // 清除定时器
-
- }
- }, 100); // 每秒执行一次(1000毫秒)
-
-
- },
-
-
- /**
- * 触摸屏幕开始 记录开始坐标
- */
- touchstart: function(e) {
-
- let startx = e.touches[0].x
- let starty = e.touches[0].y
-
- if (startx > this.zhujue.x && startx < this.zhujue.x + this.zhujue.size && starty > this.zhujue.y &&
- starty < this.zhujue.y + this.zhujue.size) {
-
- this.zhujue.x = startx - this.zhujue.size / 2
- this.zhujue.y = starty - this.zhujue.size / 2
- this.zhujue.ismoveing = true
-
- this.drawzj()
- }
-
-
-
- },
- /**
- * 触摸屏幕结束 计算
- */
- touchend: function(e) {
- let x = e.changedTouches[0].x
- let y = e.changedTouches[0].y
- this.zhujue.ismoveing = false
- },
- /**
- * 触摸屏幕移动 画框
- */
- touchmove: function(e) {
- let x = e.touches[0].x
- let y = e.touches[0].y
- if (this.zhujue.ismoveing) {
- this.zhujue.x = x - this.zhujue.size / 2
- this.zhujue.y = y - this.zhujue.size / 2
-
-
- this.drawzj()
- }
-
- },
-
- drawbackg: function() {
-
-
-
-
- this.background.position += this.background.speed; // 更新图片位置
- if (this.background.position > this.canvasheight) { // 如果图片完全移出视口
- this.background.position = 0; // 将图片重新放置在视口的另一端
- }
- this.ctx.clearRect(0, 0, this.canvaswidth, this.canvaswidth); // 清除画布
- this.ctx.drawImage(this.background.images[0], 0, this.background.position, this.canvaswidth, this
- .canvasheight); // 绘制图片
- this.ctx.drawImage(this.background.images[1], 0, this.background.position - this.canvasheight, this
- .canvaswidth, this
- .canvasheight); // 绘制图片
-
- this.ctx.setFontSize(14); // 设置字体大小
- this.ctx.setFillStyle('white'); // 设置填充颜色为白色
- this.ctx.setTextAlign('center'); // 设置文本水平对齐方式为居中
- this.ctx.setTextBaseline('middle'); // 设置文本垂直对齐方式为中间
- this.ctx.fillText('剩余' + this.zhujue.lives, 40, 30); // 在圆心位置绘制文本“按钮”
-
- this.ctx.setFontSize(14); // 设置字体大小
- this.ctx.setFillStyle('white'); // 设置填充颜色为白色
- this.ctx.setTextAlign('center'); // 设置文本水平对齐方式为居中
- this.ctx.setTextBaseline('middle'); // 设置文本垂直对齐方式为中间
- this.ctx.fillText('总得分' + this.defen, 120, 30); // 在圆心位置绘制文本“按钮”
-
- this.ctx.setFontSize(14); // 设置字体大小
- this.ctx.setFillStyle('white'); // 设置填充颜色为白色
- this.ctx.setTextAlign('center'); // 设置文本水平对齐方式为居中
- this.ctx.setTextBaseline('middle'); // 设置文本垂直对齐方式为中间
- this.ctx.fillText('关卡' + this.guanka, 200, 30); // 在圆心位置绘制文本“按钮”
-
- this.ctx.setFontSize(14); // 设置字体大小
- this.ctx.setFillStyle('white'); // 设置填充颜色为白色
- this.ctx.setTextAlign('center'); // 设置文本水平对齐方式为居中
- this.ctx.setTextBaseline('middle'); // 设置文本垂直对齐方式为中间
- this.ctx.fillText('关卡得分' + this.guankadefen, 280, 30); // 在圆心位置绘制文本“按钮”
-
- this.ctx.draw();
- },
-
-
-
- game_start: function() {
-
- this.zjfszd()
-
- this.jisuanpz()
-
- this.ytimerX = setInterval(() => {
-
- for (var i = 0; i < this.zjzdlist.length; i++) {
- this.zjzdlist[i].y -= this.zjzdlist[i].speed
- if (this.zjzdlist[i].y < 0) {
- this.zjzdlist.splice(i, 1)
- }
- }
- if (this.isboos) {
- if (this.bosslist.length == 0) {
- this.bosslist = [{
- x: this.canvaswidth / 2,
- y: 0,
- size: 30 + this.guanka * 8,
- image: "../static/rou.png",
- value: 1000 * this.guanka * 0.8,
- speed: this.getRandomInt(1, 5),
- isfszd: this.getRandomInt(0, 1),
- zdspeed: 5,
- isover: false,
- mbx: this.getRandomInt(50, this.canvaswidth - 50),
- mby: this.getRandomInt(50, this.canvasheight - 50),
-
- }]
- }
-
- } else {
- if (this.gslist.length == 0) {
- this.scgs()
- }
- for (var i = 0; i < this.gslist.length; i++) {
- this.gslist[i].y += this.gslist[i].speed
- if (this.gslist.length < 12 && this.gslist[this.gslist.length - 1].y > 80) {
- this.scgs()
- }
- if (this.gslist[i].y > this.canvasheight) {
-
- this.gslist[i].y = -45
- }
- }
- }
-
-
-
- this.drawbackg();
- this.drawzjzd()
-
- }, 16); // 每100毫秒更新一次位置
- },
-
-
- jisuanpz: function() {
-
-
-
- this.jspztimer = setInterval(() => {
-
-
- if (this.zhujue.wdtime > 0) {
- this.zhujue.wdtime -= 1
- }
- this.isCollidingbyzjzdAndGS()
- this.isCollidingbyzjAndGS()
-
- }, 16); // 每100毫秒更新一次位置
- },
-
-
- game_stop: function() {
-
- clearInterval(this.ytimerX); // 停止动画
- clearInterval(this.zjfszdtimer);
-
- clearInterval(this.jspztimer);
-
- this.isshowstart = true
-
- },
-
- /**
- * 生成min 到 max 的随机数
- */
- getRandomInt: function(min, max) {
- min = Math.ceil(min);
- max = Math.floor(max);
- return Math.floor(Math.random() * (max - min + 1)) + min;
- },
- isCollidingbyzjzdAndGS: function() {
- var arr
- if (this.isboos) {
- arr = this.bosslist
-
- } else {
- arr = this.gslist
- }
-
-
- for (var j = 0; j < arr.length; j++) {
- let gsbean = arr[j]
- if (!gsbean.isover && gsbean.y > 0) {
- for (var i = 0; i < this.zjzdlist.length; i++) {
- let zjzdbean = this.zjzdlist[i]
- if (!zjzdbean.isuse) {
- let zdx = zjzdbean.x + this.zhujue.zdsize / 2
- let zdy = zjzdbean.y + this.zhujue.zdsize / 2
- if (zdx > gsbean.x && zdx < gsbean.x + gsbean.size && zdy > gsbean.y && zdy < gsbean
- .y + gsbean.size) {
- this.zjzdlist[i].isuse = true
- if (this.isboos) {
- this.defen += 10
- this.guankadefen += 10
- gsbean.value = gsbean.value - this.zhujue.zdvalue
- if (gsbean.value <= 0) {
- //消灭怪兽
- console.log(JSON.stringify(gsbean))
- if (gsbean.isdj == 1) {
- this.zhujue.zdvalue += 0.1
- }
- if (gsbean.isdj == 2) {
- this.zhujue.fstime -= 0.5
- }
- this.bosslist[j].isover = true
- this.defen += 100
- this.bosslist = []
- this.isboos = false
- this.guanka += 1
- this.guankadefen = 0
- this.zhujue.zdvalue += 5
- this.zhujue.fstime -= 1
- if (this.guanka % 2 == 0) {
- this.zhujue.lives += 1
- }
- }
-
- } else {
- //产生碰撞
-
- this.defen += 5
- this.guankadefen += 5
- gsbean.value = gsbean.value - this.zhujue.zdvalue
- if (gsbean.value <= 0) {
- //消灭怪兽
- console.log(JSON.stringify(gsbean))
- if (gsbean.isdj == 1) {
- this.zhujue.zdvalue += 0.1
- }
- if (gsbean.isdj == 2) {
- this.zhujue.fstime -= 0.5
- }
- this.gslist[j].isover = true
- this.defen += 5
- this.guankadefen += 5
- }
-
- }
- if (this.guankadefen >= 1000 * this.guanka * 1) {
- this.isboos = true
- this.gslist = []
- }
- }
- }
- }
- }
- }
- },
- isCollidingbyzjAndGS: function() {
-
-
-
- let zjx = this.zhujue.x + this.zhujue.size / 2
- let zjy = this.zhujue.y + this.zhujue.size / 2
-
- var arr
- if (this.isboos) {
- arr = this.bosslist
- } else {
- arr = this.gslist
- }
-
-
- for (var j = 0; j < arr.length; j++) {
- let gsbean = arr[j]
-
- if (!gsbean.isover) {
- let gsx = gsbean.x
- let gsy = gsbean.y
- let gssize = gsbean.size
-
- if (zjx < gsx + gssize && zjx > gsx && zjy < gsy + gssize && zjy > gsy) {
- console.log("11111")
- console.log("主角发生碰撞", this.zhujue.wdtime)
- if (this.zhujue.wdtime <= 0) {
- if (this.isboos) {
-
- this.zhujue.value -= gsbean.value
-
- } else {
- this.gslist[j].isover = true
- this.zhujue.value -= gsbean.value
- this.zhujpz = true
- }
- }
-
-
-
- if (this.zhujue.value <= 0) {
- console.log("主角死了。结束")
- this.zhujue.lives -= 1
- this.zhujue.wdtime = 300
- if (this.zhujue.lives < 0) {
- this.game_stop()
- } else {
- this.zhujue.value = 200
- }
-
- }
-
- }
-
-
- }
-
- }
- },
-
- }
- };
- </script>
-
- <style scoped>
- .contentone {
- width: 100vw;
- height: 100vh;
- position: absolute;
-
- display: flex;
- justify-content: center;
-
- }
-
- .contenttwo {
- width: 100vw;
- height: 100vh;
- position: absolute;
-
- display: flex;
- justify-content: center;
-
- }
-
- .canvas_cla {
- width: 100vw;
- height: 100vh;
- }
-
-
- .top_linear {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- display: flex;
- flex-direction: row;
- height: 80rpx;
-
- }
-
- .top_mean_left {
- margin-left: 32rpx;
-
- }
-
- .top_mean_right {
- margin-right: 32rpx;
-
- }
-
- .top_mean_tv {
- color: #07a5a6;
- }
-
-
- .page_main {
- position: fixed;
- overflow: hidden;
- width: 100vw;
- height: 100vh;
- background-color: #efefef;
- }
-
- .zhezhao {
- position: fixed;
- top: 0;
- bottom: 0;
- width: 100vw;
- height: 100vh;
- display: flex;
- justify-content: center;
- align-items: center;
- background-color: rgba(0, 0, 0, 0.4);
- z-index: 9999;
- }
-
- .dialog_back {
- position: fixed;
- z-index: 12;
- top: 0;
- right: 0;
- left: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.3);
- justify-content: center;
- align-items: center;
- display: flex;
- }
-
- .add_button_ef {
- margin-left: 32rpx;
- margin-right: 32rpx;
- padding-top: 30rpx;
- padding-bottom: 30rpx;
- width: 300rpx;
-
- border: solid 2rpx #efefef;
- color: #999;
- background: #efefef;
- font-size: 32rpx;
- border-radius: 10rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- vertical-align: center;
-
-
- }
- </style>