- 为什么db.collection().where().update()修改原记录后还添加了一条新的?
是这样的,我先查一下,如果存在,则update,如果不存在,则add scoreDB.where({ _openid: openid }).get().then(res=>{ console.log("查到了"+res.data[0]._id)//打印返回结果 //更新 scoreDB.where({ _id: res.data[0]._id }).update({ data:{ highScore:_highScore } }).then(res=>{ debugger console.log("更新成功了"+res.data)//打印返回结果 }).catch(err=>{ console.log("更新失败了"+err)//打印错误信息 }) }).catch(err=>{ console.log("查不到"+err)//打印错误信息 }) 我debug看了,update完了以后,就生成了两条记录。 除了_id,其他内容一模一样,也就是所,update他还add了?
2023-06-16 - 微信小游戏canvas离屏开发,有没有让用户乎出键盘进行输入的API?
微信小游戏canvas离屏开发,有没有让用户乎出键盘进行输入的API? 数字键盘,以及 字母键盘
2023-06-12 - 微信小游戏canvas里,两个元素如果有重叠(哪怕隔了个遮罩),也会出现了事件冒泡穿透点击的情况?
比如我本来在(100,100)放了一个按钮 然后我弹出一个弹框,盖住了这个(100,100)的位置,被挡住了看不到了。 但是实际上我隔着这个遮罩去点击这个(100,100)的位置,还是会触发到按钮。 给用户的感觉,就是,我明明挡住他了,为啥还能被挡住?
2023-06-12 - 微信小游戏离屏canvas里的高和宽以及位置,可以用百分比,对各种机型做自适应吗?
比如drawImage的时候,传入的(x,y,width,height),目前看是绝对值。更改一下机型,就会出现跑到视野外面去的情况。 能不能做成百分比啊,放在具体机型的百分比的位置上?
2023-06-12 - cloud.callFunction:fail Error: access token?
失败了 Error: cloud.callFunction:fail Error: access_token missing (callId: 1686445099606-0.509313497978721) (trace: 8:58:19 start->8:58:19 system error (Error: access_token missing), retry->8:58:19 system error (Error: access_token missing), retry->8:58:20 system error (Error: access_token missing), abort)
2023-06-11 - 微信小游戏的canvas对象,从不同的js文件new出来,可以有多个吗?
是这样。 我开发小游戏,然后写了2个js文件,对应两个不同的页面。 页面A是js A,页面B是js B。代码按照页面,分开看得清楚些。 但我发现,我在A页面里有一些按钮,当我跳转到B页面,canvas画布已经重新绘制了,但依然能点到A页面的按钮。 这个时候,我怀疑那两个js是同时存在在咱们内存里,每个js对应的canvas是不同的,我跳转过去以后,原来那个js对象的canvas还在! 所以才能点到上个页面的canvas。 但我在离开页面的时候,调用的离开函数里,已经remove监听了,而且页面也重绘了,按道理旧的画布和监听都不复存在,然后才去的新页面啊。 为啥还能点击到上个页面的按钮啊? [图片]
2023-06-07 - 小游戏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()
2023-05-22 - 制作小游戏,按钮是png的一个图标,直接引入到canvas里,不规则图形。现在要判断点击,用射线法?
制作小游戏,按钮是png的一个图标,直接引入到canvas里,按钮可能是一个不规则图形,比如说一个人。 现在要判断点击这个不规则的人物,触发事件。 由于canvas里不能直接定义元素,我看一般处理方法是用射线法穿透,判断是否在一个不规则的闭合图形里。 那么问题来了,我这个image是一个png,不是我用canvas工具draw出来的lineTo那种方式画的。 所以我先要获取到这个png的边框,形成一个闭合的图形,然后再判断。 请问怎么获取图形的边框,描出一个闭合形状呢? 补充一句:图片好像都是方的,所以人物也可能是在一个方形图片里,只不过背景色透明,所以最后画出来是个不规则图形。 因此我是要对那个不规则图形进行描边。 求大佬指导。 哎,这个百度上都搜不到啊……自学都有点难。
2023-05-16 - canvas里绑定点击事件监听的函数,但不触发也没反应?
新手小白,代码如下。 第一个问题: 已经获取到了canvas,也把图片绑在ctx上draw也能显示。 就是绑定事件的时候,我试了click,mousedown,mousemove,都没反映。 [图片] 第二个问题: 后来又抄了另一种写法,封装了一下: 这次倒是触发了,但是不是我点击触发的,而是这个界面onLoad的时候自己触发的…… 然后我去点击他,依然不触发。 [图片] [图片] 请大佬帮我看看。 我的问题一的写法,和问题二,也没区别啊。
2023-05-12 - 希望小程序也可以调用开放数据域接口,而不是仅限于小游戏,有这个版本计划吗?
用小程序写了一个小游戏,基本都写完了,美工都找到了,然后要去做排行榜。 好家伙。 排行榜需要调用开放数据域,只有小游戏才支持。 本以为小游戏和小程序差不多,结果打开一看,好家伙,这技术栈差异太大了。 学习了一会儿,发现canvas就是个画布,没有html元素,事件绑定都得靠坐标,各种靠绘制,靠坐标。 我能说这是和我现在所学的dom也好,vue也好,是完全不同的技术栈吗??? 所以这个成本转化让人吐血,请问小程序能支持吗? 咱们微信是好,但是受限太多了,我已经折腾了一个月,而且很多信息在网上搜不到,你非要自己摸索到临门一脚的时候,才发现不支持——一切都白搭。
2023-05-05