所有继承自Node类型的节点都支持使用getChildByName(name)和getChildByTag(tag)来获取当前节点的某个子节点。这两个函数已经能够满足我们大部分的需求 但有时候我们需要获取某个节点的子节点的子节点、甚至子节点的子节点的子节点、甚至 这样
buttonclick:function(event){
let exportJson = {};
let sysInfo = windowwxgetSystemInfoSync();
//获取微信界面大小
let width = sysInfoscreenWidth;
let height = sysInfoscreenHeight;
windowwxlogin({
success: (res) => {
if (rescode) {
consolelog("rescode:", res);
exportJsoncode = rescode;//向服务端传递code用于获取微信小游戏的用户唯一标识
windowwxgetSetting({
success (res) {
consolelog(resauthSetting);
if (resauthSetting["scopeuserInfo"]) {
consolelog("用户已授权");
windowwxgetUserInfo({
success(res){
consolelog(res);
exportJsonuserInfo = resuserInfo;
//此时可进行登录 *** 作
}
});
}else {
consolelog("用户未授权");
let button = windowwxcreateUserInfoButton({
type: 'text',
text: '',
style: {
left: 0,
top: 0,
width: width,
height: height,
backgroundColor: '#00000000',//最后两位为透明度
color: '#ffffff',
fontSize: 20,
textAlign: "center",
lineHeight: height,
}
});
buttononTap((res) => {
if (resuserInfo) {
consolelog("用户授权:", res);
exportJsonuserInfo = resuserInfo;
//此时可进行登录 *** 作
buttondestroy();
}else {
consolelog("用户拒绝授权:", res);
}
});
}
}
})
}else{
consolelog('登录失败!' + reserrMsg)
}
},
});
},
先从客户端开始
因为pomelo本身并没有给出对cocos creator的支持,所以要自己写,创建如上图4个js文件
emitterjs
pomelo-clientjs
protobufjs
protocoljs
客户端初始化连接服务器
初次连接服务器
后续连接,init每次只需要换账户的时候调用
服务器相关
客户端初始化连接的是gate服,与之对应
初次与客户端连接
后续连接,客户端请求id可以直接从session获取
服务器推送,前面rpc调用的时候已经在game服的gameRemote里创建了channelService并把用户添加进去了
推送方法
CocosCreate可以使用引擎提供的系统事件脚本,来实现鼠标点哪去哪的功能。当使用鼠标点击对象时,游戏会检测并把点击点信息发送至相应的勾子函数,如onClick;onMouseDown、onMouseMemory等;在这些函数里可以读取到点击点的位
Cocos2d-x游戏引擎中的ScrollView在滑动时出现抖动的问题,可以尝试以下方法解决:
1 增加ScrollView的滑动阻尼或者回d效果,这样可以降低ScrollView的灵敏度,减少抖动的发生。可以通过设置ScrollView的"inertia"属性或者"bounceEnabled"属性来实现。
2 减少ScrollView中子节点的绘制量,这样可以减少渲染的负荷,提高ScrollView的性能。可以通过设置ScrollView的"decelerateable"属性或者"scissorRectDirty"属性来实现。
3 对于需要频繁更新的节点,可以将它们拆分成多个小的节点,分别添加到ScrollView中,这样可以避免单一节点过于复杂,导致出现抖动的情况。
4 禁用ScrollView的"scrollbarEnabled"属性,这样可以避免ScrollView中滚动条的显示,减少卡顿的情况。
如果以上方法无法解决问题,建议在Cocos2d-x社区论坛上寻求帮助,获取更详细的技术支持。
在Android环境中,可以使用 androidcontentClipboardManager 来复制和粘贴数据
在iOS环境中,可以使用 UIPasteboard 来复制和粘贴数据
在网上中复制粘贴是最麻烦的,要考虑到不同系统不同浏览器的情况,复制(设置剪切版)稍微还好一点,但是要获取剪切版的内容就太麻烦了,暂时还未找到兼容性很好的方法。
简介使用cocos creator2x版本制作的拼图游戏, 移动图块, 还原最终的样子
开始, 我们分析一下这个游戏的几个要点 1, 是如何将一张完整的分成33 55个小图, 并且这些小图要可以保存自己的位置信息, 等一些属性 2, 是如何表示小图合集的位置, 用什么数据结构保存, 且怎么让逻辑, 与数据逻辑对应 3, 是如何判断游戏结束
上图是游戏的场景结构, 可以看到2x版本和1x版本有一些区别, 最突出的就是新增了一个默认的carmera结点 这个我会在别的帖子内仔细介绍, 这里不再多说
首先我们解决第一个问题, 如何将一个大图切成一个个小图, 并让这个小图保存一些属性值, 我们先新建一个脚本, puzzlePiecets,
const{ ccclass, property } = cc_decorator;
@ccclass
exportclassPieceextendsccComponent{
@property({
type: ccTexture2D
})
privatetexture: ccTexture2D =null;
publicoriCol: number;
publicoriRow: number;
publiccurCol: number;
publiccurRow: number;
publicisBlank:boolean;
publicgetisRight(){
returnthiscurCol ===thisoriCol &&thiscurRow ===thisoriRow;
}
publicinit(col: number, row: number, colNum: number, colWidth: number){
thisoriCol = col;
thisoriRow = row;
thiscurCol = col;
thiscurRow = row;
let sprite =thisnodeaddComponent(ccSprite);
// 升级20后setRect失效
// spritespriteFrame = new ccSpriteFrame(thistexture);
// let rect = spritespriteFramegetRect();
let rect = ccrect(0,0,thistexturewidth,thistextureheight);
let newRectWidth = rectwidth / colNum;
let newRectHeight = rectheight / colNum;
let newRectX = col newRectWidth;
let newRectY = (colNum - row -1) newRectHeight;
let newRect = ccrect(newRectX, newRectY, newRectWidth, newRectHeight);
// spritespriteFramesetRect(newRect);
spritespriteFrame =newccSpriteFrame(thistexture, newRect);
thisnodewidth = colWidth;
thisnodeheight = colWidth;
thisisBlank =thisoriCol === colNum -1&&thisoriRow ===0;
if(thisisBlank) {
thisnodeactive =false;
}
}
}
将小图看做一个类, 使用texture保存纹理,在通过new ccSpriteFrame(thistexture, newRect);获取某一个矩形区域内的纹理, 这样就可以把一张大图切成一张张小图, 并添加几个属性, 保存位置和其他的信息
那么开始解决第二个问题, 我们可以采取二维数组的数据结构保存数据信息private pieceMap: Array; 讲一个个切好的小图保存在内, 然后随机移动(为了保证可以还原, 我采取的方法是将一个正确摆放好的小图数组, 按照游戏规定的移动方式随机移动1000次), 这样一定可以被还原
import{ Piece } from"/PuzzlePiece";
import{ PuzzleScene } from"/PuzzleScene";
const{ ccclass, property, executeInEditMode } = cc_decorator;
@ccclass
// @executeInEditMode
exportclassPuzzleBoardextendsccComponent{
@property(ccPrefab)
privatepiecePrefab: ccPrefab =null;
@property(ccInteger)
privatecolNum: number =5;
@property(ccInteger)
privatecolSpace: number =5;
privatecolWidth: number =0;
privatepieceMap: Array;
privateblankPiece: Piece =null;
privatepuzzleScene: PuzzleScene =null;
init(puzzleScene: PuzzleScene) {
thispuzzleScene = puzzleScene;
thisaddListeners();
}
publicreset(colNum: number){
thiscolNum = colNum;
thiscolWidth = (thisnodewidth -thiscolSpace (thiscolNum +1)) /thiscolNum;
thisnoderemoveAllChildren();
thispieceMap = [];
for(let x =0; x
thispieceMap[x] = [];
for(let y =0; y
let pieceNode = ccinstantiate(thispiecePrefab);
thisnodeaddChild(pieceNode);
pieceNodex = x (thiscolWidth +thiscolSpace) +thiscolSpace;
pieceNodey = y (thiscolWidth +thiscolSpace) +thiscolSpace;
thispieceMap[x][y] = pieceNodegetComponent(Piece);
thispieceMap[x][y]init(x, y,thiscolNum,thiscolWidth);
if(thispieceMap[x][y]isBlank) {
thisblankPiece =thispieceMap[x][y];
}
}
}
thisshuffle();
}
privateshuffle(){
for(let i =0; i <1000; i++) {
let nearPieces =thisgetNearPieces(thisblankPiece);
let n = Mathfloor(Mathrandom() nearPieceslength);
thisexchangeTwoPiece(thisblankPiece, nearPieces[n]);
}
}
privateonBoadTouch(event: ccEventEventTouch){
let worldPos = eventgetLocation();
let localPos =thisnodeconvertToNodeSpaceAR(worldPos);
let x = Mathfloor((localPosx -thiscolSpace) / (thiscolWidth +thiscolSpace));
let y = Mathfloor((localPosy -thiscolSpace) / (thiscolWidth +thiscolSpace));
thispuzzleSceneonBoardTouch(x, y);
}
publicmovePiece(x, y):boolean{
let piece =thispieceMap[x][y];
let nearPieces =thisgetNearPieces(piece);
for(let nearPiece of nearPieces) {
if(nearPieceisBlank) {
thisexchangeTwoPiece(piece, nearPiece);
returntrue;
}
}
returnfalse;
}
publicjudgeWin():boolean{
for(let x =0; x
for(let y =0; y
if(!thispieceMap[x][y]isRight) {
returnfalse;
}
}
}
thisblankPiecenodeactive =true;
returntrue;
}
privategetNearPieces(piece: Piece): Array {
let nearPieces = [];
if(piececurCol >0) {// left
nearPiecespush(thispieceMap[piececurCol -1][piececurRow]);
}
if(piececurCol
nearPiecespush(thispieceMap[piececurCol +1][piececurRow]);
}
if(piececurRow >0) {// bottom
nearPiecespush(thispieceMap[piececurCol][piececurRow -1]);
}
if(piececurRow
nearPiecespush(thispieceMap[piececurCol][piececurRow +1]);
}
returnnearPieces;
}
publicexchangeTwoPiece(piece1: Piece, piece2: Piece){
thispieceMap[piece2curCol][piece2curRow] = piece1;
thispieceMap[piece1curCol][piece1curRow] = piece2;
[piece1curCol, piece2curCol] = [piece2curCol, piece1curCol];
[piece1curRow, piece2curRow] = [piece2curRow, piece1curRow];
[piece1nodeposition, piece2nodeposition] = [piece2nodeposition, piece1nodeposition];
}
privateaddListeners(){
thisnodeon(ccNodeEventTypeTOUCH_END,thisonBoadTouch,this);
}
privateremoveListeners(){
}
}
解决第三个问题, 其实这个很简单, 因为我们已经在小图类中保存了小图本身的位置信息, 我们只需要,每次移动 都遍历一个二维数组判断其是否在正确的位置, 判断成功, 结束游戏 点击链接加入群聊cocos/unity交流群
声明 :发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢
以上就是关于如何获取cocos studio2.2.1中定义的用户数据全部的内容,包括:如何获取cocos studio2.2.1中定义的用户数据、cocos creator 小游戏登录、pomelo服务器对接cocos creator客户端相关(面向纯小白)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)