退出后按钮没销毁(回收),再进入后又重新生成了新的按钮
小游戏canvas开发,两个页面,可以点击切换页面。监听点击事件的时候,点击事件被多次执行?这几天在封装canvas,想弄成比较好开发的自用框架。 其实就是两个页面,点一下开始游戏,进入游戏,点一下结束,退出游戏,回到开始页面。(说白了,就是事件监听和页面切换) 我在第一次点击的时候,一切正常,正常跳转到了游戏主页面。我点退出的时候,也正常,回到了主页。 然后我多点了几次,忽然发现,日志打印了3次,也就是说触发了3次,接着8次,21次,离了个大谱,点了几次之后,100多次了。再点几次估计能上千。 然后就这么简单两个按钮跳转,直接让页面卡死。 底下的console里能看到,后面多点击一下,打印的日志乌拉拉几何级上升。 [图片] 代码结构如下,就用红框的五个文件: [图片] game.js里的直接调用new test(),会在test.js和test2.js来回跳转,模拟两个页面。 我上传一下完整代码吧: test.js import buttonSprite from './base/buttonSprite' import Point2d from './base/point2d' import test2Page from './test2' let ctx = canvas.getContext('2d') let gamesPage =0; //精灵摆放 const arr = [ {x:100, y:390, width:100, height:50,name:'开始',color:'green',image:"images/start.png",funName:"start"},//退出 ] let i=0; let limit = 1; export default class test{ constructor() { document.body.innerHTML="";//清空所有内容 // this.init();//数据初始化 console.log("进入开始页面!-----") // console.log("数组:"+this.allShapes); this.draw() } start(){ let test2 = new test2Page(); } draw(){ ctx.fillStyle = "#f5f5f5"; // ctx.fillStyle = "#000000"; ctx.fillRect(0, 0, canvas.width, canvas.height); let i = 0; let startButton = new buttonSprite(arr[i].x,arr[i].y,arr[i].width,arr[i].height,arr[i].name,arr[i].funName); startButton.drawToCanvas(ctx,arr[i].image); this.allShapes=[]; this.allShapes.push(startButton); canvas.addEventListener('touchend', this.handleTestEvent('touchend'),false)//目前一个canvas就监听所有按钮了 } getNewEvent(event) { let touchX = event.changedTouches[0].clientX; let touchY = event.changedTouches[0].clientY; let point = new Point2d(touchX, touchY) return { point, isStopBubble: false, ...event, } } handleTestEvent = (name) => (event) => { // event.stopPropagation(); event = this.getNewEvent(event) this.allShapes.forEach((shape) => { // 获取当前事件的所有监听者 ,遍历每个形状 // const listerns = shape.listenerMap.get(name) if ( shape.isPointInClosedRegion(event.point.x,event.point.y) //判断点击落在对应的图形内,则触发事件 && (!event.isStopBubble) ) { console.log("命中shape:"+shape) this.callMethodOnFunctionName(shape.functionName,[1]);//执行对应函数 } }) } //挨个判断是什么函数……暂时没法写成反射 callMethodOnFunctionName(functionName,arg) { // 使用 Function 构造函数创建一个新的函数 let newFunction = new Function(functionName); switch(functionName){ case "start": this.start(); break; case "showList": this.showList(arg); break; case "clearStor": this.clearStor(arg); break; } } } test2.js import buttonSprite from './base/buttonSprite' import Point2d from './base/point2d' import testPage from './test' let ctx = canvas.getContext('2d') //精灵摆放 const arr = [ {x:200, y:90, width:100, height:50,name:'退出',color:'green',image:"images/exit.png",funName:"exit"},//退出 //{x:100, y:200, width:100, height:50,name:'开始游戏',color:'green',image:"images/startBtn2.png",funName:"startGame"},//开始 // {x:100, y:260, width:100, height:50,name:'排行榜',color:'blue',image:"images/paihangbang.png",funName:"showList"},//排行榜 // {x:100, y:320, width:100, height:50,name:'清除缓存',color:'red',image:"images/clearStorage.png",funName:"clearStor"},//清除缓存 ] export default class test{ init(){ // this.i = 0; //精灵摆放 this.arr = [ {x:200, y:90, width:100, height:50,name:'退出',color:'green',image:"images/exit.png",funName:"exit"},//退出 ] // this.gamesPage =0; } constructor() { document.body.innerHTML="";//清空所有内容 this.draw() } exit(){ let test = new testPage(0); } draw(){ ctx.fillStyle = "#f5f5f5"; // ctx.fillStyle = "#000000"; ctx.fillRect(0, 0, canvas.width, canvas.height); let i = 0; let exitButton = new buttonSprite(arr[i].x,arr[i].y,arr[i].width,arr[i].height,arr[i].name,arr[i].funName); exitButton.drawToCanvas(ctx,arr[i].image); this.allShapes=[]; // if() this.allShapes.push(exitButton); canvas.addEventListener('touchend', this.handleEvent('touchend'),true)//目前一个canvas就监听所有按钮了 } getNewEvent(event) { let touchX = event.changedTouches[0].clientX; let touchY = event.changedTouches[0].clientY; let point = new Point2d(touchX, touchY) return { point, isStopBubble: false, ...event, } } handleEvent = (name) => (event) => { // event.stopPropagation(); event = this.getNewEvent(event) this.allShapes.forEach((shape) => { // 获取当前事件的所有监听者 ,遍历每个形状 // const listerns = shape.listenerMap.get(name) if ( shape.isPointInClosedRegion(event.point.x,event.point.y) && (!event.isStopBubble) ) { console.log("命中shape"+shape) this.callMethodOnFunctionName(shape.functionName,[1]);//执行对应函数 } }) } //挨个判断是什么函数……暂时没写成反射 callMethodOnFunctionName(functionName,arg) { // 使用 Function 构造函数创建一个新的函数 let newFunction = new Function(functionName); switch(functionName){ case "exit": this.exit(); break; case "showList": this.showList(arg); break; case "clearStor": this.clearStor(arg); break; } } } base文件夹下的buttonSprite.js let x = 0; let y = 0; let width = 0; let height = 0; let name="按钮"; let leftTop={x:0,y:0}; /** * 游戏基础的精灵类 */ export default class buttonSprite { constructor( x, y, width, height,name,functionName) { this.name = name this.functionName = functionName this.x = x this.y = y this.leftTop = { x, y } leftTop = { x, y } this.width = width this.height = height this.visible = true this.listenerMap = new Map() this.props = {leftTop, width,height} } on(eventName, listener) { console.log("hey,wobeidiaoyongle,jingguolew") if (this.listenerMap.has(eventName)) { this.listenerMap.get(eventName).push(listener) } else { this.listenerMap.set(eventName, [listener]) } } /** * 将精灵图绘制在canvas上 */ drawToCanvas(ctx,imgSrc) { if ( !this.visible ) return let img = new Image(); let x = this.x; let y = this.y; let width = this.width; let height = this.height; img.onload = function(){ ctx.drawImage( img, x, y, width, height )} img.src = imgSrc;//先onload再给出src } callMethodOnFunctionName() { // 使用 Function 构造函数创建一个新的函数 const newFunction = new Function(this.functionName); // 使用 apply 方法调用传递的函数 newFunction.apply(this, [this]); } // 判断鼠标的点是否在图形内部 isPointInClosedRegion(touchX,touchY) { // const { x, y } = mouse.point const { leftTop, width, height } = this.props const { x: minX, y: minY } = leftTop const maxX = minX + width const maxY = minY + height if (touchX >= minX && touchX <= maxX && touchY >= minY && touchY <= maxY) { return true } return false } } base 文件夹下的point2d.js export default class point2d { constructor(x,y) { this.x = x || 0; this.y = y || 0; } clone() { return this.constructor(this.x, this.y); } add(v) { this.x += v.x; this.y += v.y return this; } random() { this.x = Math.random() *1800; this.y = Math.random() * 800; return this } } 入口文件:game.js import './js/libs/weapp-adapter' import './js/libs/symbol' import test from './js/test' new test()
06-26 wx.downloadFile({//从网络下载文件到本地 url : '真实地址', filePath:`${wx.env.USER_DATA_PATH}/a.png`,//指定文件下载后存储的路径 (本地路径)可选 success (res) {//res.filePath var img = new Image() img.src = res.filePath } }) 这样赋值就可以用了,开发者工具上文件路径是"http://usr/a.png",真机上文件路径是"wxfile://usr/a.png"
小游戏 图片保存到本地用户文件目录 怎么读取?- 当前 Bug 的表现(可附上截图) - 预期表现 - 复现路径 - 提供一个最简复现 Demo 保存图片到本地用户文件目录 wx.env.USER_DATA_PATH 成功没有问题 不能使用 img.src = wx.env.USER_DATA_PATH 对应地址 直接赋值显示图片 不能使用 wx.previewImage 直接预览图片 使用FileSystemManager 读取图片 转码后 经putimagedata 还是无法正确查看到图片 请问有没有什么办法可以将图片存储到本地,再在界面正确显示的 [图片] [图片]
01-26可以
请问微信小游戏开发工具里的排行榜可以加载玩家游戏中的本地图片信息吗?请问微信小游戏开发工具里的排行榜可以加载玩家游戏中的本地图片信息吗?比如说玩家当前穿的装备图片信息。
01-26打印下context的width和height看下,看看是不是起始点超显示范围了
开放数据域绘制本地图片不显示在开放数据域中进行本地图片canvas绘制: var leftImage = wx.createImage() leftImage.src = 'res/imgs/arrow_left.png' context.drawImage(leftImage, 400, 400,100,100) 图片是放在res/imgs下面的,代码运行没有报错,但是界面上没有任何显示
2023-11-30最近都变的很慢很慢了,跟版本号没关系
版本回退导致了审核时间延长吗[图片] 昨天中午11点提交的了 再等2小时就超过24小时了,前两天审核都很快,是因为我回退了一个版本造成的提交审核有问题吗?
2022-10-28这是因为没有选Entry Resource。在project里选中你要作为入口的scene,然后在Inspector里的Set as entry resource设置为true,编译的时候也选择这个scene。然后再真机调试就不报这个了
小游戏真机调试无法启动 Cannot read property 'path' of undefin可以扫二维码进行预览,但是无法进行真机调试 [图片] message:TypeError: Cannot read property 'path' of undefined ideVersion: 1.05.2109101 osType: darwin-x64 time: 2021-09-26 15:22:17
2021-12-01