万物皆代码之2D跳一跳

最近微信小程序跳一跳发火,又掀起了一阵浪潮!身为一个二手前端,本着万物皆代码的原则,趁四下无人、闲来无事之时,想尝试一下能不能敲出来??翻了几本Javascript资料,猫了几眼大神的博客,在论坛田里也搂了两耙子,写了一个2D版本的跳一跳。话不多说,直接上干货:

1、HTML

2、JS

a.即使代码千变万化,也要先进行初始化


b.既然是跳一跳,最基本的人物角色和默认平台总要有的


c.一开始角色(小方块认停在第一个平台,接下来就要判断玩家做了什么操作?(ps:这里长按鼠标左键为蓄力,松开则为释放)


d.松开鼠标方块跳跃,绘制下一个平台

扫描二维码关注公众号,回复: 1113380 查看本文章


e.判断方块位置,是否失败,移动镜头(可视区域)(๑乛◡乛๑)


f.跳跃中,如果失败就结束


f.每一帧画面的绘制


运行效果如图:

fail-1


fail-2


success


所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<div style="width: 800px;height: 600px;margin: 0 auto">
	<canvas id="stage" width="800" height="600"></canvas>
</div>
	<!-- <canvas id="stage" width="800" height="600"></canvas> -->
</body>
<script type="text/javascript">
	var canvas = document.getElementById('stage');
    var context = canvas.getContext('2d');
    Math.randomRange = function(min, max) {
        return Math.floor(Math.random() * (max - min) + min);
    }
    var player = {
        x: 0,
        y: 300,
        width: 30,
        jumping: false, //标识是否跳跃中
        power: 0, //标识蓄力程度,决定跳多远
        speedY: 10 //标识Y轴上的速度,模拟重力加速度
    }
    var gameover = false;
    var cameraMoving = false; //镜头是否移动中
    var timerPowerUp; //蓄力操作用的计时器
    var platforms = []; //存储所有生成的平台
    //初始化平台
    platforms.push({
        x: 0,
        width: 100
    }, {
        x: 200,
        width: 100
    });
    var lastPlatform = platforms[platforms.length - 1]; //最新生成的平台
    var currentPlatform = platforms[0]; //当前落脚的平台
    
    // 绘制玩家
    var drawPlayer = function() {
        context.fillStyle = "blue";
        context.save();
        context.fillRect(player.x, player.y, player.width, player.width);
        context.restore();
    }
    //绘制跳跃的平台
    var drawPlatform = function() {
        context.fillStyle = "#A3A3A3";
        context.save();
        platforms.forEach(function(platform) {
            context.fillRect(platform.x, 300 + player.width, platform.width, 300);
        });
        context.restore();
    }
    // 挑战失败
    var drawTextFailed = function() {
        if (gameover) {
            context.fillStyle = "#ff0000";
            context.save();
            context.font = "normal 30px sans-serif";
            context.textBaseline = 'top';
            var text = "失败!";
            context.fillText(text, canvas.clientWidth / 2 - text.length * 30 / 2, 300);
            context.restore();
        }
    }
    //玩家跳跃中
    var playerJumping = function() {
        if (player.jumping) {
            player.y -= player.speedY;
            player.speedY -= 0.7;
            player.x += player.power;
            if (player.y >= 300) {
                player.jumping = false;
                player.y = 300;
                player.power = 0;
                if (!iscurrentplatform()) {
                    if (isfailed()) {
                        gameover = true;
                    } else {
                        currentPlatform = lastPlatform;
                        generateNextPlatform();
                        cameraMoving = true;
                    }
                }
            }
        }
    }
    //生成下一个平台
    var generateNextPlatform = function() {
        var x = Math.randomRange(lastPlatform.x + 100, 500);
        var width = Math.randomRange(player.width, 100);
        lastPlatform = {
            x: x,
            width: width
        }
        platforms.push(lastPlatform);
    }
    //判断玩家位置是否在当前平台
    var iscurrentplatform = function() {
        return player.x > currentPlatform.x - player.width && player.x < currentPlatform.x + currentPlatform.width;
    }
    //判断是否失败
    var isfailed = function() {
        return player.x <= (lastPlatform.x - player.width) || player.x >= (lastPlatform.x + lastPlatform.width);
    }
    //移动镜头(场景整体移动)
    var moveCamera = function() {
        if (cameraMoving) {
            player.x -= 10;
            platforms.forEach(function(platform) {
                platform.x -= 10;
            });
            if (player.x <= 0 || currentPlatform.x <= 0) {
                cameraMoving = false;
                if (player.x < 0) {
                    player.x = 0;
                } else if (currentPlatform.x < 0) {
                    currentPlatform.x = 0;
                }
            }
        }
    }
    //蓄力中
    var PowerUping = function() {
        player.power += 1;
    }
    //开始蓄力
    var PowerUp = function() {
        if (!gameover && !player.jumping) {
            timerPowerUp = setInterval(PowerUping, 100);
        }
    }
    //停止蓄力
    var PowerUpStop = function() {
        if (!gameover && !player.jumping) {
            clearInterval(timerPowerUp);
            player.jumping = true;
            player.speedY = 10;
        }
    }
    //帧刷新时执行的其他操作
    var withFrameUpdate = function() {
        playerJumping();
        moveCamera();
    }
    //帧绘制
    var drawFrame = function() {
        window.requestAnimationFrame(drawFrame, canvas);
        context.clearRect(0, 0, canvas.width, canvas.height);
        drawPlayer();
        drawPlatform();
        drawTextFailed();
        withFrameUpdate();
    }
    document.addEventListener("mousedown", PowerUp);
    document.addEventListener("mouseup", PowerUpStop);
    drawFrame();
</script>
</html>
github源码: 传送门

猜你喜欢

转载自blog.csdn.net/weixin_42230045/article/details/80451630