最新要闻
- 环球速看:可怕一幕!男子骑摩托车遭风筝线勒喉受伤 官方科普风筝线比刀还锋利
- 焦点信息:男子未悬挂号牌 竟是嫌老婆选的“250”车牌太丢人
- 【天天播资讯】为鼓励走出家门:韩国为宅男宅女每月发3400元补贴 网友直呼羡慕
- 世界热议:解决国产手机厂商5G卡脖子:国产射频滤波器搞定了 年产12万片项目落地
- 世界热头条丨女子吐槽领导隔监控点名员工加班 大家为工作不敢反抗:网友唏嘘
- 【世界聚看点】广东家常菜名字_广东家常菜
- 天天热文:比亚迪上海车展几号展台公布:比亚迪百万豪车在这里
- 当前焦点!2023LPL春季赛总决赛落幕 JDG 3:1击败BLG问鼎总冠军
- 全球最资讯丨宣传防盗、防电诈,送反诈螺蛳粉!柳州警方为企业守平安
- 每日视点!1克燃料等于8吨石油 日本明确首个核聚变战略:2050年发电
- 曝淄博酒店网上标价千元前台仅200元引热议:官方回应
- 全球关注:首发仅1899元!铁威马F4-423(4G)四盘位NAS开售
- 世界关注:WTT新乡冠军赛:孙颖莎获女单冠军
- 全球百事通!智己NOA体验:高速上我撒手半个小时 回过头竟还在人寰
- 环球热推荐:网易云音乐上线“鲸云母带”音质:一首歌170MB SVIP专享
- 【环球快播报】破纪录!西班牙女子洞穴生活500多天 回地面称“不想出来”
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【世界热闻】我的第一个项目(十) :处理全局变量(解决模块化后变量无法获取的问题)
好家伙,
【资料图】
飞机大战分包分的差不多了,
但是又出现了问题:
文件目录如下:
然而关于变量
helloworld.vue完整代码
helloworld.vue<script>// Award,// Bullet,// Enemy,// Hero,// Loading,// Main,// Sky//七个大类引进来import Award from "./js/award"import Bullet from "./js/bullet"import Enemy from "./js/enemy"import Hero from "./js/hero"import Loading from "./js/loading"// import Main from "./js/main"import Sky from "./js/sky"// import SKYY from "./js/config"import { START, STARTING, RUNNING, PAUSE, END, LOADINGING } from "./js/config"import { SKY, LOADING, HERO, BULLET, E1, E2, E3, C1 } from "./js/config"import { bg, copyright, pause } from "./js/config"export default { mounted() { //console测试 console.log("模块化测试") //canvas初始化 console.log("我被执行啦") let canvas = document.createElement("canvas"); this.$refs.stage.appendChild(canvas); canvas.width = 480; canvas.height = 650; canvas.ref = canvas; canvas.style = "border: 1px solid red;" const context = canvas.getContext("2d"); //state表示游戏的状态 取值必须是以上的五种状态 let state = START; //score 分数变量 life 变量 let score = 0; let life = 3; //初始化奖励类 // class Loading { // constructor(config) { // this.frame = config.frame; // this.img = this.frame; // this.frameIndex = 0; // this.width = config.width; // this.height = config.height; // this.x = config.x; // this.y = config.y; // this.speed = config.speed; // this.lastTime = new Date().getTime(); // } // judge() { // const currentTime = new Date().getTime(); // if (currentTime - this.lastTime > this.speed) { // this.frameIndex++; // if (this.frameIndex === 4) { // state = RUNNING; // } // this.lastTime = currentTime; // } // } // paint(context) { // if (this.frameIndex < 3) // context.drawImage(this.img[this.frameIndex], this.x, this.y); // } // } class Main { //一下全为全局变量或方法 (全局的!!) //初始化一个天空实例 //主启动方法 maingame() { const sky = new Sky(SKY); //初始化一个飞机界面加载实例 const loading = new Loading(LOADING); loading.prototype =this; //初始化一个英雄实例 英雄是会变的 let hero = new Hero(HERO); //该变量中有所有的敌机实例 let enemies = []; //该变量中存放所有的奖励实例 let awards = []; //敌机产生的速率 let ENEMY_CREATE_INTERVAL = 800; let ENEMY_LASTTIME = new Date().getTime(); function stateControl() { //为canvas绑定一个点击事件 且他如果是START状态的时候需要修改成STARTING状态 canvas.addEventListener("click", () => { if (state === START) { state = STARTING; } }); // 为canvas绑定一个鼠标移动事件 鼠标正好在飞机图片的正中心 canvas.addEventListener("mousemove", (e) => { let x = e.offsetX; let y = e.offsetY; hero.x = x - hero.width / 2; hero.y = y - hero.height / 2; }); // 为canvas绑定一个鼠标离开事件 鼠标离开时 RUNNING -> PAUSE canvas.addEventListener("mouseleave", () => { if (state === RUNNING) { state = PAUSE; } }); // 为canvas绑定一个鼠标进入事件 鼠标进入时 PAUSE => RUNNING canvas.addEventListener("mouseenter", () => { if (state === PAUSE) { state = RUNNING; } }); //为canvas绑定一个屏幕移动触摸点事件 触碰点正好在飞机图片的正中心 canvas.addEventListener("touchmove", (e) => { // let x = e.pageX; // let y = e.pageY; console.log(e); // let x = e.touches[0].clientX; // let y = e.touches[0].clinetY; let x = e.touches[0].pageX; let y = e.touches[0].pageY; // let x = e.touches[0].screenX; // let y = e.touches[0].screenY; let write1 = (document.body.clientWidth - 480) / 2; let write2 = (document.body.clientHeight - 650) / 2; hero.x = x - write1 - hero.width / 2; hero.y = y - write2 - hero.height / 2; // hero.x = x - hero.width / 2; // hero.y = y - hero.height / 2; console.log(x, y); console.log(document.body.clientWidth, document.body.clientHeight); e.preventDefault(); // 阻止屏幕滚动的默认行为 }) } stateControl(); // 碰撞检测函数 //此处的碰撞检测包括 //1.子弹与敌机的碰撞 //2.英雄与敌机的碰撞 //3.英雄与随机奖励的碰撞 function checkHit() { // 遍历所有的敌机 for (let i = 0; i < awards.length; i++) { //检测英雄是否碰到奖励类 if (awards[i].hit(hero)) { //当然了,这个随机奖励的样式也要删了 awards.splice(i, 1); //清除所有的敌机 // for (let i = 0; i < enemies.length; i++) { // enemies.splice(i, 1); // } enemies.length = 0; } } for (let i = 0; i < enemies.length; i++) { //检测英雄是否撞到敌机 if (enemies[i].hit(hero)) { //将敌机和英雄的destory属性改为true enemies[i].collide(); hero.collide(); } for (let j = 0; j < hero.bulletList.length; j++) { enemies[i].hit(hero.bulletList[j]); //检测子弹是否撞到敌机 if (enemies[i].hit(hero.bulletList[j])) { //将敌机和子弹的destory属性改为true enemies[i].collide(); hero.bulletList[j].collide(); } } } } // 全局函数 隔一段时间就来初始化一架敌机/奖励 function createComponent() { const currentTime = new Date().getTime(); if (currentTime - ENEMY_LASTTIME >= ENEMY_CREATE_INTERVAL) { let ran = Math.floor(Math.random() * 100); if (ran < 55) { enemies.push(new Enemy(E1)); } else if (ran < 85 && ran > 55) { enemies.push(new Enemy(E2)); } else if (ran < 95 && ran > 85) { enemies.push(new Enemy(E3)); } else if (ran > 95) { awards.push(new Award(C1)); } ENEMY_LASTTIME = currentTime; } } // 全局函数 来判断所有的子弹/敌人组件 "负责移动" function judgeComponent() { for (let i = 0; i < hero.bulletList.length; i++) { hero.bulletList[i].move(); } for (let i = 0; i < enemies.length; i++) { enemies[i].move(); } for (let i = 0; i < awards.length; i++) { awards[i].move(); } } // 全局函数 来绘制所有的子弹/敌人组件 绘制score&life面板 function paintComponent() { for (let i = 0; i < hero.bulletList.length; i++) { hero.bulletList[i].paint(context); } for (let i = 0; i < enemies.length; i++) { enemies[i].paint(context); } for (let i = 0; i < awards.length; i++) { awards[i].paint(context); } context.font = "20px 微软雅黑"; context.fillStyle = "green"; context.textAlign = "left"; context.fillText("score: " + score, 10, 20); context.textAlign = "right"; context.fillText("life: " + life, 480 - 10, 20); //重置样式 context.fillStyle = "black"; context.textAlign = "left"; } // 全局函数 来销毁所有的子弹/敌人组件 销毁掉英雄 function deleteComponent() { if (hero.destory) { life--; hero.destory = false; if (life === 0) { state = END; } else { hero = new Hero(HERO); } } for (let i = 0; i < hero.bulletList.length; i++) { if (hero.bulletList[i].outOfBounds() || hero.bulletList[i].destory) { hero.bulletList.splice(i, 1); } } for (let i = 0; i < enemies.length; i++) { if (enemies[i].outOfBounds() || enemies[i].destory) { enemies.splice(i, 1); } } } //当图片加载完毕时,需要做某些事情 bg.addEventListener("load", () => { setInterval(() => { switch (state) { case START: sky.judge(); sky.paint(context); let logo_x = (480 - copyright.naturalWidth) / 2; let logo_y = (650 - copyright.naturalHeight) / 2; context.drawImage(copyright, logo_x, logo_y); break; case STARTING: sky.judge(); sky.paint(context); loading.judge(); loading.paint(context); break; case RUNNING: sky.judge(); sky.paint(context); hero.judge(); hero.paint(context); hero.shoot(context); createComponent(); judgeComponent(); deleteComponent(); paintComponent(); checkHit(); break; case PAUSE: let pause_x = (480 - pause.naturalWidth) / 2; let pause_y = (650 - pause.naturalHeight) / 2; context.drawImage(pause, pause_x, pause_y); break; case END: //给我的画笔设置一个字的样式 //后面写出来的字都是这个样式的 context.font = "bold 24px 微软雅黑"; context.textAlign = "center"; context.textBaseline = "middle"; context.fillText("GAME_OVER", 480 / 2, 650 / 2); break; } }, 10); }); } } let main_1 = new Main() main_1.maingame(); }}</script>
来看helloworld.vue中的部分代码
import Loading from "./js/loading"/******/let state = START;const loading = new Loading(LOADING);/******/loading.judge();
loading.js
// import { state } from "./config"// 初始化一个飞机界面加载类import { RUNNING } from "./config";class Loading { constructor(config) { this.frame = config.frame; this.img = this.frame; this.frameIndex = 0; this.width = config.width; this.height = config.height; this.x = config.x; this.y = config.y; this.speed = config.speed; this.lastTime = new Date().getTime(); } judge() { const currentTime = new Date().getTime(); if (currentTime - this.lastTime > this.speed) { this.frameIndex++; if (this.frameIndex === 4) { state = RUNNING; } this.lastTime = currentTime; } } paint(context) { if (this.frameIndex < 3) { context.drawImage(this.img[this.frameIndex], this.x, this.y); } }}export default Loading
若我把Loading这个类写在Helloworld.vue中,是不会有报错的,
但我把Loading这个类写在外部的.js文件,然后再使用模块化导入,
可见,es6模块化把原先的作用域分隔开了
那么这个问题怎么解决呢?
同时我还有另外两个全局变量life(生命值)和score(分数)要处理
//state表示游戏的状态 取值必须是以上的五种状态 let state = START; //score 分数变量 life 变量 let score = 0; let life = 3;
只能委屈一下window了,把他们都变成全局变量
//state表示游戏的状态 取值必须是以上的五种状态 window.state = START; //score 分数变量 life 变量 window.score = 0; window.life = 3;
搞定,不报错了
关键词:
-
预训练模型-从BERT原理到BERT调包和微调
一、BERT原理BERT取名来自BidirectionalEncoderRepresentationsfromTransformers。架构为:预训练+fine-tuning(对于特定
来源: -
【世界热闻】我的第一个项目(十) :处理全局变量(解决模块化后变量无法获取的问题)
好家伙,飞机大战分包分的差不多了,但是又出现了问题:文件目录如下:然而关于变量helloworld vue完整代码...
来源: 预训练模型-从BERT原理到BERT调包和微调
【世界热闻】我的第一个项目(十) :处理全局变量(解决模块化后变量无法获取的问题)
【环球新视野】2023年Rust发展如何?
环球速看:可怕一幕!男子骑摩托车遭风筝线勒喉受伤 官方科普风筝线比刀还锋利
焦点信息:男子未悬挂号牌 竟是嫌老婆选的“250”车牌太丢人
【天天播资讯】为鼓励走出家门:韩国为宅男宅女每月发3400元补贴 网友直呼羡慕
世界热议:解决国产手机厂商5G卡脖子:国产射频滤波器搞定了 年产12万片项目落地
世界热头条丨女子吐槽领导隔监控点名员工加班 大家为工作不敢反抗:网友唏嘘
【世界聚看点】广东家常菜名字_广东家常菜
全球播报:socat的下载和基础使用
天天热文:比亚迪上海车展几号展台公布:比亚迪百万豪车在这里
当前焦点!2023LPL春季赛总决赛落幕 JDG 3:1击败BLG问鼎总冠军
全球最资讯丨宣传防盗、防电诈,送反诈螺蛳粉!柳州警方为企业守平安
【Visual Leak Detector】VS 中 VLD 输出解析
当前通讯!upload-labs writeup
每日视点!1克燃料等于8吨石油 日本明确首个核聚变战略:2050年发电
曝淄博酒店网上标价千元前台仅200元引热议:官方回应
全球关注:首发仅1899元!铁威马F4-423(4G)四盘位NAS开售
【Visual Leak Detector】在 VS 2015 中使用 VLD
世界关注:WTT新乡冠军赛:孙颖莎获女单冠军
全球百事通!智己NOA体验:高速上我撒手半个小时 回过头竟还在人寰
环球热推荐:网易云音乐上线“鲸云母带”音质:一首歌170MB SVIP专享
视焦点讯!如何快速而优雅的解决问题(提问的智慧简略版)
天天讯息:cin与CTRL+z的问题
世界快看点丨如何防止设备被重复控制
【环球快播报】破纪录!西班牙女子洞穴生活500多天 回地面称“不想出来”
世界热消息:被海鸥圈粉 沈义人:感觉要购入第一台比亚迪了
每日精选:成龙被观众当场要求退票上热搜 电影《龙马精神》回应:起诉造谣账号
最新资讯:几十秒看完10分钟的视频 就靠这AI输入法:日语也不怕
快讯:唯一全面实现国产化!低端低价的1LCD爆发:超DLP成智能投影仪主流
当前热议!6错误代码C3848.
全球关注:电影《龙马精神》剧组发声明辟谣“退票”事件
天天看热讯:5万元小车谁加速快?长安糯玉米零百22秒 秒杀宏光MINI EV
每日速递:诺奖得主杨振宁倡议 清华推出攀登计划:培养未来物理大师
全球新动态:都是4799元!你买AMD上代旗舰卡6950XT、还是老黄的RTX 4070
【全球快播报】无处不在的激光可能会毁掉你的双眼!
世界今头条!张艺谋去看LPL季后赛决赛了:此前宣布筹拍网剧《英雄联盟》
送父亲的礼物排行榜
全球观察:Steam最受欢迎的软件Wallpaper Engine疑似中病毒 网友称游戏库被盗
环球热头条丨优质长绒棉 亲肤透气:VXGY精梳棉五分裤49元(减120元)
当前资讯!ChatGPT带火AI芯片!NVIDIA顶级显卡售价超4万美元
视讯!张兰称自己不是网红:网红是一时的 我是一世的
即时:小s啥情况?看开了
全球新消息丨ChatGPT人工智能热潮之下,NCSI功能OCP网卡助力数据中心发展
python进程池中的回调函数
疑似回应“比500万SUV更好” 李想:持续刷存在感、因为心力不强大
热点!雷军:小米13 Ultra小米手机史上最强信号体验
泼水节变味?女生颜值越高被泼越狠:网友喊话虽是祝福也请适量
观点:meterpreter后渗透攻击
焦点简讯:发展氢能应符合各国情况和市场需求——访德国能源专家科马尔尼茨基教授
天天热点评!五一假期淄博再成顶流,“北京南-淄博”火车票开售1分钟售罄
全球首搭帝瓦雷音响!比亚迪腾势N7猎跑SUV将开售:或35万起
每日速讯:《圣斗士星矢》真人电影抢先看:星矢帅呆了
世界看热讯:Apifox手动和自动两种更新token方式(推荐自动)
每日观察!刚需速囤!中石化出品竹浆抽纸狂促:券后每包只需1元
环球观点:向木星前进!欧洲木星探测器JUICE发射成功:旅途长达八年
天天速读:薛之谦上热搜 巡演唱到一半被伴舞撞飞了:观众忍俊不禁
第08章_索引的创建与设计原则
【大国基理】党建引领,创造基层治理“天津范式”
天天看点:【财经分析】REITs拟纳入深港通 大湾区财富管理市场开放步伐加速
移动散热史革新!小米环形冷泵揭秘:热导率三倍于传统VC
仰望U8平替来了!原地掉头、100%爬坡度:奇瑞捷途出品
环球聚焦:年度“奇幻大片”潍坊风筝节上映 网友:放的是人类想象力
销量又该暴涨 大神绘制新款特斯拉Model 3:有豪车味了
天天简讯:历史一刻!贾跃亭的FF91量产车正式下线:百公里加速2.3秒 交付时间又“跳票”
环球微资讯!【最新】上海修订中小学生欺凌防治手册:欺凌行为并非普通打闹
天天热资讯!使用自签名证书,新手必然会遇到的问题
焦点消息!小米13 Ultra搭载澎湃P2/G1芯片:支持应急模式 1%电量续航60分钟
马里奥游戏改编电影史上最强
最新资讯:Hololens2 开发(仿真器)配置
智能快递车揽收功能规模化上线 京东小哥“好帮手”再升级
多省都要封杀!北京定义老头乐危害公共安全 倒逼大爷买新能源车、考驾照
环球热消息:首款下载量超10亿手游!《愤怒的小鸟》卖了:世嘉出价近70亿收购
播报:分布式事务--Seata
每日速讯:【环球财经】美联储官员发表鹰派言论 美元指数14日显著上涨
华为首次下放卫星通信!nova 11系列上架预约:下周一发布
【焦点热闻】美方以涉俄为由将多家中国企业列入清单实施制裁,商务部回应
【播资讯】史上最大屏!苹果15英寸MacBook Air确认搭载M2芯片:6月发布
医院回应护士上班戴美甲给患者扎针:已让其卸掉!专业人士科普
地产网红称没几千万怎么叫人才引热议:网友称价值观扭曲 谁钱多谁就是人才?
万元买手机很难吗?中美日韩等1月销量TOP 5:iPhone完爆安卓
全球简讯:学系统集成项目管理工程师(中项)系列06a_信息系统安全管理(上)
世界热推荐:国内油价17日料上调 部分地区95号汽油或重返“8元时代”
世界最资讯丨CPU买散片还是盒装 DIY老鸟:怎么选都是错!
当前视讯!沙特俄罗斯等减产后!国内新一轮油价调整将至 或重返8元时代
Java 在线编程工具上线(直接编译运行Java代码)
全球观天下!民声丨合理优化社区规模 提升社会服务质量
环球热门:诚意十足!国产科幻FPS《边境》制作组24小时直播修BUG
环球观速讯丨00后网红马若松遇车祸身亡监控曝光:面包车双实线掉头致追尾
当前速递!性能残血还带风扇 海盗船PCIe 5.0硬盘开卖:性价比竟然很高
世界今日讯!诺基亚一个暗箱操作 给华为喂了口九转大肠
天天快报!小米13 Ultra全曝光 核心配置已无悬念
苹果手机无法下载app什么原因_苹果手机无法下载app是什么原因
天天滚动:4.14训练解题报告
即时:Java + Jpcap实现监控 IP包流量
微头条丨MAUI之Android记录设备号+动态授权
当前焦点!RTX 4070显卡首发驱动531.61发布:4款游戏优化、修复黑屏崩溃
今日观点!南京动物园回应网红猴被欺负困在水中:没有霸凌 会游泳
欧洲探测器启程奔赴木星
【天天新要闻】内部类