仿微信游戏《勇闯独木桥》-HTML5版本

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>勇闯独木桥</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400" style="border: 1px solid #000;"></canvas>
    <script>
        var canvas = document.getElementById('canvas');
        var cxt = canvas.getContext('2d');

        // 定时器
        var timer;
        // 游戏结束控制开关
        var iStop = false;
        // 得分
        var score = 1;

        // 起点
        var start = {x:0,y:300,w:100,h:100};
        // 终点
        var end = {x:200,y:300,w:100,h:100};

        // 过桥人的位置
        var manX = 90;
        // 过桥速率
        var manStep = 0;

        // 桥的宽度
        var loadWidth = 0;
        // 桥变长的速率
        var loadStep = 0;
        // 桥倒下控制开关
        var loadRun = false;
        // 桥倒下的速率
        var loadDeg = 0;

        // 过桥是否成功
        var isSuccess = false;
        // 是否正在过桥
        var isOn = false;

        // 画布移动速率
        var canvasMove = 0;

        // 终点的位置列表
        var intervals = [];
        for(var i=0; i<400; i+=10){
            intervals.push(i);
        }

        // 终点的宽度列表
        var blocks = [];
        for(var i=30; i<100; i+=10){
            blocks.push(i);
        }

        // 桥变长
        function pave(){
            loadWidth += loadStep;
        }

        // 人过桥
        function step(){
            manX += manStep;
        }

        // 绘制图形
        function draw(){
            cxt.save();
            cxt.fillRect(start.x, start.y, start.w, start.h);
            cxt.fillRect(end.x, end.y, end.w, end.h);
            cxt.restore();

            cxt.save();
            cxt.fillStyle = 'gray';
            cxt.translate(start.w, 300);
            cxt.rotate(loadDeg*Math.PI/180);
            cxt.fillRect(0, 0, 10, -loadWidth);
            cxt.restore();

            cxt.save();
            cxt.fillStyle = '#FF4500';
            cxt.fillRect(manX, 290, 10, 10);
            cxt.restore();

        }

        // 清除画布
        function erase() {
            cxt.clearRect(0, 0, canvas.width, canvas.height)
        }

        // 随机终点
        function initEnd(){
            var interval = intervals[Math.floor(Math.random()*intervals.length)];
            var block = blocks[Math.floor(Math.random()*blocks.length)];

            if(interval > start.w && interval + block < 400){
                end.x = interval;
                end.w = block;
            }else{
                initEnd();
            }
        }

        // 画得分
        function drawScore() {
            cxt.save();
            cxt.font="40px Verdana";
            cxt.fillStyle = 'black';
            cxt.fillText('第' + score +'关', 130, 50);
            cxt.restore();
        }

        // 画结束
        function drawEnd() {
            cxt.save();
            cxt.font="40px Verdana";
            cxt.fillStyle = 'red';
            cxt.fillText('游戏失败,继续努力!', 10, 150);
            cxt.restore();
        }

        // 控制桥的长度-空格键(space)
        document.onkeydown = function(ev){
            if(ev.keyCode == 32 && !isOn){
                loadStep = 2;
                isOn = true;
            }else{
                return;
            }

            document.onkeyup = function(ev){
                if(ev.keyCode == 32 && loadDeg == 0){
                    loadStep = 0;
                    loadRun = true;

                    if(loadWidth + start.w > end.x && loadWidth + start.w < end.x + end.w){
                        isSuccess = true;
                    }
                }
            }
        };

        window.requestAnimationFrame =
                window.requestAnimationFrame ||
                window.mozRequestAnimationFrame ||
                window.webkitRequestAnimationFrame ||
                window.msRequestAnimationFrame;

        window.cancelRequestAnimationFrame =
                window.cancelRequestAnimationFrame ||
                window.mozCancelRequestAnimationFrame ||
                window.webkitCancelRequestAnimationFrame ||
                window.msCancelRequestAnimationFrame;

        function animate() {
            erase();
            pave();
            step();
            draw();
            drawScore();

            // 桥开始倒下
            if(loadRun){
                loadDeg += 2;
            }

            // 桥倒下后,人开始过桥
            if(loadDeg == 90){
                loadRun = false;
                manStep = 5;
            }

            // 过桥是否能成功
            if(isSuccess){
                // 到达目的地
                if(manX >= (end.x + end.w - 10)){
                    canvasMove = 5;
                    manStep = 0;
                    loadWidth = 0;
                }
                // 初始化,开始下一关过桥
                if(end.x == 0){
                    loadDeg = 0;
                    isSuccess = false;
                    isOn = false;
                    canvasMove = 0;

                    start.x = 0;
                    start.w = end.w;
                    manX = start.w - 10;

                    initEnd();
                    score ++;
                }else{
                    start.x -= canvasMove;
                    end.x -= canvasMove;
                    manX -= canvasMove;
                }
            }else{
                // 过桥失败,游戏结束
                if(manX >= start.w + loadWidth){
                    manStep = 0;
                    drawEnd();
                    iStop = true;
                }

            }

            if(iStop){
                cancelRequestAnimationFrame(timer);
            }else{
                timer = requestAnimationFrame(animate);
            }
        }

        animate();

    </script>
</body>
</html>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 04:19:31

仿微信游戏《勇闯独木桥》-HTML5版本的相关文章

仿微信抢红包 Golang实战多版本抢红包系统

第1章 课程导学[征途*扬帆起航]没有梦想,何必远方?本小结将站在更高的起点,从项目演示开始 ,然后到本课程适用人群定位,再到通过思维导图介绍课程内容体系,接着到分析收获,最后到学习本课程的一些前置要求,为你的学习征途扬帆起航做保证. 第2章 红包业务概述&系统建模[磨刀不误砍柴工]或许大家体验过抢红包,但如何对现实世界的业务场景进行抽象,形成软件系统的需求,进行建模与技术选型,这是有一套“方法论”的.因此,本章分四点:红包系统业务知识:选用的技术框架:业务建模与数据库建模:红包算法&库存

web版仿微信聊天界面|h5仿微信电脑端案例开发

前几天开发了一款手机端h5仿微信聊天,人唯有不停学习才能进步,这段时间倒腾着整理了下之前项目,又重新在原先的那版基础上开发了一款仿微信聊天电脑端web版本,聊天页面又重新优化了多图预览.视频播放,右键菜单menu,聊天底部编辑器模块重新优化源码,弹窗则是继续使用之前自己开发的wcPop.js,具体看项目效果图吧! 效果图: // ...表情.选择区切换 $(".wc__editor-panel").on("click", ".btn", func

网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信的聊天窗口界面, 以及其中涉及到的一些技术点. 作者前端是初学者, 请大拿们轻拍. 效果展示: 先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^) . 仿微信窗口的设计源于第四关--倾听女神的故事. 这种聊天对话的布局模式, 比PC端QQ的那种聊天方式更贴近移动端, 我个人感觉. 需求设定:

HTML5游戏探讨,如何让微信游戏只能运行在微信中

大致文件布局如下,一个html文件,一个loading.js,在loading.js中加载其他需要的js和css. 至于具体的速度的话,建议cdn或者一个域中最多加载6个js文件.在loading.js中加载js和css之前,检测是不是微信游览器,是的话,go.不是则跳转到提示. function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i) == 'mi

HTML5仿微信聊天界面、微信朋友圈实例

这几天使用H5开发了一个仿微信聊天前端界面,尤其微信底部编辑器那块处理的很好,使用HTML5来开发,虽说功能效果并没有微信那么全,但是也相当不错了,可以发送消息.表情,发送的消息自动回滚定位到底部,另外可以对消息.图片.视频有不同的右键处理提示,还有打赏.占屏等操作. html代码片段: <!--BEGIN 打赏--> <div class="js_dialog" id="J_Dialog_dashang" style="display:

html5聊天案例|趣聊h5|仿微信界面聊天|红包|语音聊天|地图

之前有开发过一个h5微直播项目,当时里面也用到过聊天模块部分,今天就在之前聊天部分的基础上重新抽离模块,开发了这个h5趣聊项目,功能效果比较类似微信聊天界面.采用html5+css3+Zepto+swiper+wcPop+flex等技术融合开发,实现了发送消息.表情(动图),图片.视频预览,添加好友/群聊,右键长按菜单.另外新增了语音模块.地图定位模块.整体功能界面效果比较接近微信聊天. 项目运行效果图: // ripple波纹效果 wcRipple({ elem: '.effect__ripp

【H5小游戏开发教程】如何限制微信游戏只能在微信端打开?

在这行里接触的时间多了,就会发现很多有意思的东西. 比如,很多微信小游戏会限制只能在微信端打开,有木有? 有这样的, 也有这样的, 妈蛋,不能用PC访问,这游戏就没法扒呀..... 其实涛舅舅告诉你,这两种都可以扒 而且是用PC! 但是今天,我不教你扒皮 我要教你的是,怎么让你的微信游戏也能限制PC打不开 很想学吧  准备开始! 1.第一种不提了,因为人家是设置了微信授权登录,从微信那里就拦截住了,只能用微信访问,你可能弄不了这么高级的微信授权这块,如果你真能弄,这一讲你也不用听了,因为你已经能

Android仿微信UI布局视图(圆角布局的实现)

圆角按钮,或布局可以在xml文件中实现,但也可以使用图片直接达到所需的效果,以前版本的微信就使用了这种方法. 实现效果图:    不得不说,这种做法还是比较方便的. 源代码: MainActivity(没写任何代码,效果全在布局文件中实现): package com.android_settings; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity

Android控件:高仿微信主UI

高仿微信主UI 之前在Android组件:Fragment切换后保存状态 一文中讲到了Fragment切换后,是如何保存原来的状态的,最重要的就是用add方法取代现在各种教程常见的replace方法.然而我发现有不少App都貌似采用ViewPager + Fragment来做主UI的.于是在Android组件:Fragment切换后保存状态 的基础上加入了ViewPager,看了下微信界面,要高仿就尽力模仿到最像,所以也把ActionBar也修改成微信的样子. 先上一张效果图: 布局 我知道微信