zoukankan      html  css  js  c++  java
  • = =用createJS写个flyppyPeople

      声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!

      最近flyppybird很流行啊,今天中午闲着没事干,就用现有的素材写了个flyppyPeople,因为角色是个人,所以就叫People啦,哈哈

      上链接:http://whxaxes.github.io/canvas-test/src/Game-demo/FlppyPeople/index.html。。。。。。。

      最近在看createJs,所以就用了createJs来写啦。

      起跳落下用了简单的自由落体运动公式。动画是通过createJS的精灵表绘制器实现的,话说用框架就是舒服啊,都给你封装好了,哪像楼主写的上一篇博文里的打飞机游戏,精灵表绘制器之类的还得自己手动写。。。。造轮子虽然好玩,不过如果赶时间还是尽量用别人的轮子吧。

      = =游戏原理很简单。如果园友无聊。。。就可以玩玩

      游戏有个我故意留的bug,因为楼主玩flyppybird的时候最高只有十分,所以留了那个bug,为了分高一点。。。。仅此而已    = =绝对不是因为楼主懒。。。  = =有人说有bug不好玩,于是还是修复了。。。

    代码直接贴啦(因为是随便写来玩的,很多东西可能没考虑完全,性能之类的,将就下吧):

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <style>
            /*#cas{margin:auto;display: block;}*/
            .view{width: 700px;height: 500px;margin:auto;position: relative;}
            #onceAgain{width: 152px;text-align: center;border:1px solid;background-color: #FFF;position: absolute;left: 270px;top: 190px;display: none;cursor: pointer;padding:20px 0 20px 0;}
            #points{position: absolute;left: 20px;top: 20px;font-size: 20px;color: #FFF;}
        </style>
        <title>FlyppyPeople</title>
        <script src="easeljs-0.7.1.min.js"></script>
        <script src="preloadjs-0.4.1.min.js"></script>
        <script src="person.js"></script>
        <script src="stone.js"></script>
    </head>
    <body>
        <div class="view">
            <canvas id="cas" width="700" height="500">您的浏览器不支持canvas</canvas>
            <div id="onceAgain"></div>
            <div id="points">得分:0</div>
            <div style="position: absolute;bottom:-30px;">按空格进行起跳</div>
        </div>
        <div id="showFPS"></div>
        <script>
            var fps = document.getElementById("showFPS")
            var stage , w , h , loader;
            var man , ground , sky , high;
            var stones = [] , again = document.getElementById("onceAgain") , pt = document.getElementById("points");
    
            function init(){
                stage = new createjs.Stage("cas");
                w = stage.canvas.width;
                h = stage.canvas.height;
    
                var manifest = [
                    {src:"image/man.png" , id:"man"},
                    {src:"image/ground.png" , id:"ground"},
                    {src:"image/bg.png" , id:"bg"},
                ]
    
                loader = new createjs.LoadQueue(false);
                loader.addEventListener("complete" , handleComplete);
                loader.loadManifest(manifest);
            }
    
    
            function handleComplete(){
                var manImage = loader.getResult("man");
                var groundImage = loader.getResult("ground");
                var bgImage = loader.getResult("bg")
                ground = new createjs.Shape();
                sky = new createjs.Shape();
                sky.graphics.bf(bgImage).drawRect(0,0,w,h);
    
                ground.graphics.beginBitmapFill(groundImage).drawRect(0, 0, w+groundImage.width, groundImage.height);
                ground.tileW = groundImage.width;
                ground.y = h-groundImage.height;
                ground.activity = true;
                ground.action = {
                    run:function(){
                        if(ground.activity){
                            ground.x = ground.x-3;
                            if(ground.x<-groundImage.width){
                                ground.x=0;
                            }
                        }
                    }
                }
    
                stage.addChild(sky , ground , high);
    
                for(var i=0;i<10;i++){
                    stones.push(new stone(w+5 , groundImage));
                }
    
                man = new Man(200,326,manImage);
    
                kuang = new createjs.Shape();
                kuang.graphics.beginStroke("rgba(255,0,0,0.5)").drawRect(23 , 0 , 50 , 96);
                stage.addChild(kuang)
    
                createjs.Ticker.timingMode = createjs.Ticker.RAF;
                createjs.Ticker.setFPS(60);
                createjs.Ticker.addEventListener("tick", tick);
    
                window.addEventListener("keydown" , function(event){
                    event = event||window.event;
                    if(event.keyCode===32&&man.state!=="die"){
                        man.jump();
                    }
                });
    
                again.onclick = function(){
                    for(var i=0;i<stones.length;i++){
                        stones[i].visible = false;
                        stones[i].x = w+5;
                        stones[i].update();
                    }
    
                    man.run();
                    ground.activity = true;
                    stst = false;
                    again.style.display="none";
    
                    point = 0;
                    pt.innerHTML = "得分:"+point;
                }
            }
    
            var tt = true,stst=false,point=0,lastStone=null;
            function tick(event){
                var deltaS = event.delta/1000;
                var grantW = man.sprite.getBounds().width*man.scaleX;
                
                ground.action.run();
                man.update();
    
                if(tt&&!stst){
                    tt = false;
                    for(var i=0;i<stones.length;i++){
                        if(!stones[i].visible){
                            stones[i].visible = true;
                            stones[i].x = w;
                            stones[i].build();
                            break;
                        }
                    }
    
                    setTimeout(function(){
                        tt = true;
                    },2000)
                }
    
                for(var i=0;i<stones.length;i++){
                    if(stones[i].visible&&man.state!=="die"){
                        if(!stst) stones[i].update();
    
                        for(var j=0;j<stones[i].bones.length;j++){
                            var sbx = stones[i].bones[j].x+stones[i].getStoneSize()/2,
                                sby = stones[i].bones[j].y+stones[i].getStoneSize()/2,
                                manx = man.sprite.x+48,
                                many = man.sprite.y+48;
    
                            if(Math.abs(manx-sbx)<25+stones[i].getStoneSize()/2 && Math.abs(many-sby)<48+stones[i].getStoneSize()/2){
                                man.die();
                                ground.activity = false;
                                stst = true;
                                again.style.display="block";
                                again.innerHTML = "你的得分:"+point+"<br>再来一遍"
                                break;
                            }else if(Math.abs(manx-sbx)<25+stones[i].getStoneSize()/2 && lastStone!==stones[i]){
                                point++;
                                pt.innerHTML = "得分:"+point;
                                lastStone=stones[i];
                            }
                        }
                    }
                }
    
                kuang.x = man.sprite.x;
                kuang.y = man.sprite.y;
    
                stage.update(event)
            }
    
            init();
        </script>
    </body>
    </html>

    下面是人物处理js:就是对createJs的sprite对象进行进一步抽象成一个man对象。

    (function(w){
        var FRAME_RATE = 13,    //精灵表播放速度
            SCALE_X = 1.5,    //X轴缩放
            SCALE_Y = 1.5,    //Y轴缩放
            GRAVITY = 9.8,    //重力加速度
            JUMP_SPEED = 2.5,        //垂直速度
            PROPORTION = 200/1;  //游戏与实际的距离比例
    
        w.Man = function(x , y , img){
            this.x = x;
            this.y = y;
            this.vy = 0;
            this.state = "run";
            this.init(img);
        }
    
        Man.prototype = {
            constructors:Man,
    
            init:function(img){
                var manSpriteSheet = new createjs.SpriteSheet({
                    "images":[img],
                    "frames":{"regX":0,"height":64,"count":45,"regY":1,"width":64},
                    "animations":{
                        "run":{
                            frames:[21,20,19,18,17,16,15,14,13,12],
                            next:"run",
                            speed:1,
                        }, 
                        "jump":{
                            frames:[34,35,36,37,38,39,40,41,42,43],
                            next:"run",
                            speed:1,
                        },
                        "die":{
                            frames:[8,7,6,5,4,3,2,1,0],
                            next:"die",
                            speed:1,
                        },
                    }
                });
                this.sprite = new createjs.Sprite(manSpriteSheet , this.state);
                this.sprite.framerate = FRAME_RATE;
                this.sprite.setTransform(this.x, this.y, SCALE_X, SCALE_Y);
                stage.addChild(this.sprite);
            },
    
            update:function(){
                var sprite = this.sprite;
                var time = createjs.Ticker.getInterval()/1000;
                switch(this.state){
                    case "jump":
                        sprite.y += time*this.vy*PROPORTION;
                        this.vy += time*GRAVITY;
                        if(sprite.y > this.y && this.vy > 0){
                            sprite.state = "run";
                            sprite.y=this.y;
                            this.vy = 0;
                        }
                    break;
    
                    case "die":
                        sprite.y += time*this.vy*PROPORTION;
                        this.vy += time*GRAVITY;
                        if(sprite.y > this.y && this.vy > 0){
                            sprite.y=this.y;
                            this.vy = 0;
                        }
                        if(sprite.currentFrame===0){
                            sprite.paused = true;
                        }
                    break;
                }
            },
    
            jump:function(){
                this.vy = -JUMP_SPEED;
                this.state = "jump";
                this.sprite.gotoAndPlay("jump")
            },
    
            die:function(){
                this.state = "die";
                this.sprite.gotoAndPlay("die")
            },
    
            run:function(){
                this.state = "run";
                this.sprite.gotoAndPlay("run")
            }
        }
    })(window)

    还有阻碍物的js:(就是分成上跟下两部分,总共的石头三块,然后取随机数,让它一个一个出来就行了)

    (function(w){
        var STONE_SIZE = 70,
            STONE_NUM = 3,
            STONE_SPEED = 3;
    
        w.stone = function(x , img){
            this.x = x;
            this.y = 0;
            this.img = img
            this.visible = false;
            this.bones = [];
    
            this.init();
        }
    
        var s = stone.prototype;
    
        s.init = function(){
            for(var g=0;g<STONE_NUM;g++){
                bone = new createjs.Shape();
                bone.graphics.s("#000").f("#59554D").drawRect(0 , 0 , STONE_SIZE , STONE_SIZE);
                bone.x = this.x;
                stage.addChild(bone)
                this.bones.push(bone);
            }
        }
    
        s.getStoneSize = function(){
            return STONE_SIZE;
        }
    
        s.update = function(){
            var index=0;
            for(var z=0;z<this.top;z++){
                this.bones[index].x = this.x;
                this.bones[index].y = z*STONE_SIZE;
                index++;
            }
    
            for(var t=0;t<this.bottom;t++){
                this.bones[index].x = this.x;
                this.bones[index].y = h-this.img.height-(t+1)*STONE_SIZE;
                index++;
            }
    
            if(this.visible){
                if(this.x<=-STONE_SIZE){
                    this.visible = false;
                }
                this.x -= STONE_SPEED;
            }
        }
    
        s.build = function(){
            this.top = parseInt(Math.random()*STONE_NUM);
            this.bottom = STONE_NUM-this.top;
        }
    })(window)

       源码地址:

      https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Game-demo/FlppyPeople

  • 相关阅读:
    bus总线
    vue 动态组件、父子组件传参
    echarts
    记录板
    留言板
    如何移除双系统mac中的windows系统
    Kernel,Shell,Bash 的关系
    zju 校队选拔 被虐记
    COGS 2638. 数列操作ψ 线段树
    退役公告【现已复活】
  • 原文地址:https://www.cnblogs.com/axes/p/3600751.html
Copyright © 2011-2022 走看看