Turbulenz
Turbulenz是一个开源的HTML5游戏引擎,提供了可以运行在Windows、MacOS、Linux上的SDK,允许开发人员创建高质量和硬件加速的2D、3D游戏。包括以下功能:异步资源加载、进行特效和粒子渲染、支持物理效果、碰撞检测以及动画、3D音效支持、支持网络交互以及社交网络分享、场景和资源的管理。
优点:
1 功能强大,同时支持2D和3D
2 基于MIT协议的开源引擎
Construct2
Construct 2是一个运行于Windows平台的游戏制作工具,它可以让没有任何编程基础的用户在短时间内不写一行代码快速开发出一款可运行于所有平台(Windows、Mac、Linux、Android、iOS等)的游戏。版可以将游戏导出成HTML5。收费版本分为个人版(79英镑)和企业版(259英镑),可以导出所有平台的版本,同时提供了更多的特效和音乐。如果使用该工具盈利超过5000美元,需要升级到企业版。
优点:
1 简单易用,可实时运行游戏
2 强大的事件系统,可以不通过写代码来控制游戏逻辑
3 提供了可编程扩展的接口
4 提供了大量特效,支持物理效果
5 支持所有平台
6 完整的文档以及社区支持
缺点:
不如直接写代码灵活
ImpactJS
ImpactJS是一个基于JavaScript的HTML5游戏引擎,同时支持PC和移动平台浏览器。它是目前除了Construct2之外最受欢迎的HTML5游戏引擎,使用需要支付99美元。
优点:
1 提供了灵活的关卡编辑器,可以快速构建游戏地图
2 提供了强大的调试工具
3 提供了Ejecta可以将JavaScript的执行结果通过OpenGL渲染出来,可以在iOS平台上获得与原生应用相近的效率
4 文档齐全,有两本专门介绍ImpactJS开发的书
5 支持物理效果
6 支持自己编写插件来扩展
App Store游戏
1 Biolab Disaster
2 Drop JS
Cocos2d-html5
Cocos2d-html5是一款基于Cocos2d-x API的2D开源HTML5游戏引擎。它目前通过canvas进行渲染,将来会支持WebGL。它由国内Cocos2d-x核心团队主导开发和维护,行业领袖、HTML5大力推动者Google为这个项目提供支持。同时,Zynga、Google等大公司的工程师也参与到它的设计工作中。
优点:
1 与Cocos2d的API类似,容易上手
2 中文文档齐全,资料丰富
3 基于MIT协议的开源引擎
H5edu教育html5开发解答
1、简历格式:简历应该简洁明了,格式清晰,字体大小适中,排版整齐。可以使用模板或者自己设计简历格式。
2、个人信息:在简历的开头,应该写上自己的姓名、、邮箱等基本信息,方便招聘人员联系你。
3、教育背景:写上自己的教育背景,包括学校、专业、学历等信息。如果有相关的证书或培训经历,也可以写上。
4、工作经历:写上自己的工作经历,包括公司名称、职位、工作时间、工作内容等信息。如果有CocosCreator相关的工作经验,一定要突出强调。
5、技能和项目经验:写上自己的技能和项目经验,包括熟练掌握的编程语言、开发工具、CocosCreator版本等信息。同时,也可以写上自己参与过的项目,包括项目名称、项目描述、自己的具体工作等信息。
6、自我评价:在简历的结尾,可以写上自己的自我评价,包括个人特点、职业目标等信息。这部分内容可以突出自己的优势和特长,让招聘人员更好地了解你。需要注意的是,CocosCreator是一种比较专业的开发工具,因此在写简历时要突出自己的CocosCreator技能和经验,让招聘人员更好地了解你的能力和潜力。同时,也要注意简历的真实性和准确性,不要夸大自己的能力和经验。简介使用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交流群
声明 :发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)