HTML5游戏实战之消灭星星(完整源代码)

版权声明:欢迎访问studio.holaverse.cn!HTML5游戏零基础超快上手!一天一个小游戏!!! https://blog.csdn.net/yinlijun2004/article/details/50931503

消灭星星是一款经典的休闲游戏,因此花了一点时间在Hola Studio上实现它。本游戏包含完整的游戏元素,包括广告、音乐、音效、振动、关卡、分享等。

游戏截图

这里写图片描述

扫描二维码

这里写图片描述

游戏链接:http://studio.holaverse.com/apprun.html?mode=preview&user_id=0f4a0994-b11d-494f-bfa0-a1a006a63d01&game_key=23eeacdf3f2e4002b1d5f721e637b5e5&company_id=1cd6f6b2-30ae-43fc-8b87-25ff89e27699

导入链接

你可以将以下链接粘贴到地址栏,进行导入,这个游戏就成为你自己的项目了。
http://studio.holaverse.com/?mode=preview&user_id=0f4a0994-b11d-494f-bfa0-a1a006a63d01&game_key=23eeacdf3f2e4002b1d5f721e637b5e5&company_id=1cd6f6b2-30ae-43fc-8b87-25ff89e27699

游戏代码

整个游戏分为两部分,一部分是逻辑部分,是通用的,可以移植到任意的游戏引擎,另一部分是在Hola Studio上的实现。

游戏的逻辑

游戏逻辑在一个独立的文件中,http://studio.holaverse.com/holaverse/storage/read.php?path=1cd6f6b2-30ae-43fc-8b87-25ff89e27699/23eeacdf3f2e4002b1d5f721e637b5e5/libs/johnny_game_lib_1.js

消灭星星的路程图如下:
玩家点击一颗星星——遍历周围的星星找出相同颜色的所有星星——挨个播放星星爆炸特效——向下移动——向左移动——判断有无相邻颜色相同的星星——升级或者游戏结束

其中几个主要的代码段

遍历相同颜色的星星

递归调用countRemoveableStar方法

StarGame.prototype.countRemoveableStar = function(clickedStar, row, col, removeableArray) {
    var starArray = this.starArray;
    if(row < 0 || row >= this.rowNum
        || col < 0 || col >= this.colNum
        || starArray[row][col] === null
        || starArray[row][col].counting === true) {
        return;
    }

    var star = starArray[row][col];

    if(!clickedStar.matchBlock(star)) {
        return;
    }

    removeableArray.push(star);
    starArray[row][col].counting = true;
    starArray[row][col].countingNum = col * this.rowNum + row;

    this.countRemoveableStar(clickedStar, row + 1, col, removeableArray);
    this.countRemoveableStar(clickedStar, row - 1, col, removeableArray);
    this.countRemoveableStar(clickedStar, row, col + 1, removeableArray);
    this.countRemoveableStar(clickedStar, row, col - 1, removeableArray);
};

向下移动

StarGame.prototype.movingDown = function() {
    var starArray = this.starArray;
    for(var j = 0; j < this.colNum; j++) {
        var i = 0;
        while(i < this.rowNum) {
            if(starArray[i][j] !== null) {
                i++;
                continue;
            }
            var k = i + 1;
            while(k < this.rowNum) {
                if(starArray[k][j] === null) {
                    k++;
                    continue;
                }
                if(starArray[k][j].starHeightNum === undefined) {
                    starArray[k][j].starHeightNum = 0;
                }
                starArray[k][j].starHeightNum++;
                k++;
            }
            i++;
        }

        for(i = 0; i < this.rowNum; i++) {
            if(starArray[i][j] !== null) {
                var star = starArray[i][j];
                if(star.starHeightNum === undefined|| star.starHeightNum < 1) {
                    continue;
                }
                starArray[i - star.starHeightNum][j] = star;
                starArray[i][j] = null;
                star.queueAnimate(i - star.starHeightNum, j);
                star.starHeightNum = 0;
            }
        }
    }
};

向左移动

StarGame.prototype.movingLeft = function() {
    var needAnimate = false;
    var blankNum = [];
    var starArray = this.starArray;
    for(var j = 0; j < this.colNum; j++) {
        var blank = true;
        for(var i = 0; i < this.rowNum; i++) {
            if(starArray[i][j] !== null) {
                blank = false;
                break;
            }
        }
        if(blank) {
            for(k = j + 1; k < this.colNum; k++) {
                if(blankNum[k] === undefined) {
                    blankNum[k] = 0;
                }
                blankNum[k]++;
                needAnimate = true;
            }
        }
    }
    if(!needAnimate) {
        return;
    }

    for(var j = 0; j < this.colNum; j++) {
        if(!blankNum[j]) {
            continue;
        }
        for(var i = 0; i < this.rowNum; i++) {
            var star = starArray[i][j];
            if(star !== null && blankNum[j] > 0) {
                starArray[i][j - blankNum[j]] =  starArray[i][j];
                starArray[i][j] = null;
                star.queueAnimate(i, j - blankNum[j]);
            }
        }
    }
};

判断有无相同颜色的星星

StarGame.prototype.checkCompleteCondition = function() {
    var starArray = this.starArray;
    for(var i = 0; i < this.rowNum; i++) {
        for(var j = 0; j < this.colNum; j++) {
            var block = starArray[i][j];
            if(block !== null) {
                if(((i < this.rowNum - 1) && block.matchBlock(starArray[i + 1][j])) 
                    || ((j < this.colNum - 1) && block.matchBlock(starArray[i][j + 1]))) {
                        return false;
                    }

            }
        }
    }
    return true;
};

游戏的界面

游戏的界面在Hola Studio上大概300行代码左右。

星星溅落的效果

星星溅落效果采用贝塞尔曲线实现,Hola Studio提供了UIPath组件,只需要配置几个参数即可。

win.doBezeierAnimation = function(element) {
    var path = win.dupChild("path");

    var left = Math.random() > 0.5;
    var begin = {};
    begin.x = element.x;
    begin.y = element.y;

    var control = {};
    var diffX = Math.random() * 300 * (left ? -1 : 1);
    control.x = begin.x + diffX;
    control.y = element.y - Math.random() * 800;

    var end = {};
    end.x = control.x + diffX;
    end.y = win.h;

    path.addQuad(1000, null, {x:begin.x, y:begin.y}, {x:control.x, y:control.y}, {x:end.x, y:end.y});
    path.addObj(element, null, function() {
        path.pause();
        path.remove();
        element.remove();
    }, 0, true);    
}

星星的绘制

这里星星的绘制是用的canva手动绘制的,当然更建议你用图片。

StarInterfaces.drawStar = function(context) {
    var element = this;
    if(!StarInterfaces.STAR_CANVAS) {
        StarInterfaces.STAR_CANVAS = {};
    }
    if(!StarInterfaces.STAR_CANVAS[element.blockColor]) {
        StarInterfaces.STAR_CANVAS[element.blockColor] = StarInterfaces.prepareStarCanvas(element.blockColor);
    }
    var canvas = StarInterfaces.STAR_CANVAS[element.blockColor];
    context.drawImage(canvas, 0, 0);
};

StarInterfaces.prepareStarCanvas = function(fillColor) {
    var canvas = document.createElement("canvas");
    canvas.height = 50;
    canvas.width = 50;
    var c2d = canvas.getContext("2d");
    c2d.scale(0.8, 1);
    c2d.beginPath();  
    c2d.moveTo(15/9, 150/9);  
    c2d.lineTo(100/9,140/9);  
    c2d.lineTo(170/9,90/9);  
    c2d.lineTo(230/9,140/9);  
    c2d.lineTo(315/9,150/9);  
    c2d.lineTo(230/9,200/9);  
    c2d.lineTo(300/9,263/9);  
    c2d.lineTo(170/9,233/9);  
    c2d.lineTo(30/9,263/9);  
    c2d.lineTo(100/9,200/9);
    c2d.fillStyle = fillColor;
    c2d.fill(); 
    c2d.closePath();
    canvas.c2d = c2d;
    return canvas;
};

广告的实现

把广告组件拖进来之后,
一行代码:

win.find("hola-ads").setEnable(true);

如果你也想做H5游戏,或者在这个项目基础上修改。

欢迎加群

这里写图片描述

猜你喜欢

转载自blog.csdn.net/yinlijun2004/article/details/50931503