JavaScript学习 (一)

来源:互联网 发布:win8系统修复软件 编辑:程序博客网 时间:2024/09/21 06:36

  最近玩了一款手游,被游戏内容给吸引住,于是乎想做一款类似的游戏,题材不同,想了想用以前用过的cocos2dx,但是素材与UI的设计却很费时间,于是乎就找到了cocos creator,两者的区别在于,一个是数据驱动,一个是代码驱动,cocos creator相对来说操作方便,于是就接触到了Js。

  Js的基本语法:http://docs.cocos.com/creator/manual/zh/scripting/javascript-primer.html
  同时推荐看萧井陌的直播:https://search.bilibili.com/all?keyword=%E8%90%A7%E4%BA%95%E9%99%8C&page=1&order=totalrank

  如变量的声明或者对象的声明,函数的声明,在上面都可以找到,学习Js也让我感觉到了,脚本语言的强大,与简便。

  那么,为了上手Js,就写一个简单的小游戏来练习练习,在写脚本的过程中,不知道的东西去查,可以通过MDN+要查的东西,大概能查到,如MDN canvas或者MDN log,或者直接百度怎样在canvas放图片之类的。

  (虽然就短短的几十行,却写了快一下午,也发现了自己分析代码的能力不强,写代码不仔细漏的漏少的少很多时间都浪费在这排错,也感觉到了脚本虽然简单,但是有一种类型有点用着用着就乱的感觉,在写的过程中也慢慢的熟悉了)

代码大概意思是:写一个板子,和一个球,当球碰到板子回反弹。在实现的过程中,较好的封装,让代码更方便于修改,如添加一些功能,事件之类的。通过event与相应的callback绑定(存储在一个对象容器中),再通过eventlistener监听事件判断是否事件发生并相应的处理事件,在调度器或者timer中遍历事件容器,若事件处于发生状态,如下列,keydown为事件发生,则在listener中改变该事件状态,在调度器中调用。
(晚上顺便用C++写一遍。。)

<!DOCTYPE html><html><head>    <title>Hello Wrold</title>    <style media="screen">        canvas {            border: 1px black solid        }    </style></head><body>    <canvas id="m_canvas" width="400" height="300"></canvas>    <script>        var log = console.log.bind(console)        var setImagePath = function (path) {            var img = new Image()            img.src = path            return img        }        //Paddle        var Paddle = function () {            //图片文件放在html文件同一个文件夹            var img = setImagePath('paddle.png')            paddle = {                img: img,                x: 100,                y: 200,                speed: 5,            }            paddle.moveleft = function () {                paddle.x -= paddle.speed            }            paddle.moveright = function () {                paddle.x += paddle.speed            }            paddle.clash=function(ball){                if (ball.y + ball.img.height > paddle.y) {                    if (ball.x > paddle.x && ball.x < paddle.x + paddle.img.width) {                        log('相撞')                        return true                    }                }                return false            }            return paddle        }        //Ball        var Ball = function () {            //图片文件放在html文件同一个文件夹            var img = setImagePath('ball.png')            ball = {                img: img,                x: 100,                y: 100,                dx: 10,                dy: 10,                isfire:false,            }            ball.move = function () {                if (ball.isfire) {                    if (ball.x < 0 || ball.x > 400) {                        ball.dx = -ball.dx                    }                    if (ball.y < 0 || ball.y > 300) {                        ball.dy = -ball.dy                    }                    ball.x+=ball.dx                    ball.y+=ball.dy                }            }            return ball        }        //game        var gameinit = function () {            var gameManage = {                action: {},                keydown: {},            }            var canvas = document.querySelector('#m_canvas')            var context = canvas.getContext('2d')            //init canvas            gameManage.canvas = canvas            gameManage.ctx = context            gameManage.drawImage = function (guaImage) {                gameManage.ctx.drawImage(guaImage.img, guaImage.x, guaImage.y)            }            //register event            gameManage.registerEvent = function (key, callback) {                gameManage.action[key] = callback            }            //eventlistenr            window.addEventListener('keydown', function (event) {                log(event)                gameManage.keydown[event.key] = true;            })            window.addEventListener('keyup', function (event) {                log(event)                gameManage.keydown[event.key] = false;            })            //timer            setInterval(function () {                // actions为获取对象的keys数组                var actions = Object.keys(gameManage.action)                log(actions)                for (var i = 0; i < actions.length; i++) {                    var key = actions[i]                    if (gameManage.keydown[key]) {                        // 如果按键被按下, 调用注册的 action                        gameManage.action[key]()                    }                }                // update                gameManage.update()                // clear                gameManage.ctx.clearRect(0, 0, gameManage.canvas.width, gameManage.canvas.height)                // draw                gameManage.draw()            }, 1000 / 30)            return gameManage        }        //入口        var _main=function(){            var paddle=Paddle()            var ball=Ball()            var game=gameinit()            //register Event            game.registerEvent('a',function(){                paddle.moveleft()            })            game.registerEvent('d',function(){                paddle.moveright()            })            game.registerEvent('f',function(){                ball.isfire=true            })            game.update=function(){                ball.move()                if(paddle.clash(ball)){                    ball.dy*=-1                }                  }             //init some event            game.draw=function(){                game.drawImage(paddle)                game.drawImage(ball)           }        }        _main()    </script></body></html>

C++版本(大概写法):
至于怎么实现一个setinterval,我觉得弄一个Time类,随便写的。。不用在意细节。。大概想法

struct GameMenerge {    //初始画面    void init() {    }    //事件绑定    map<std::string, std::function<void()>>eventContain;    map<std::string, bool>actionType;    //注册事件    void regsiterEvent(std::string name, std::function<void()>callback) {        eventContain[name] = callback;    }    void Eventlistener(string state) {        if (eventContain.find(state) != eventContain.end() ){            actionType[state] = true;        }        else {            actionType[state] = false;        }    }    //draw    void clearCanvas() {    }    void draw() {    }    void Setinterval() {        while (1) {        }    }};struct Sprite {    int pos_x, pos_y;    string imagePath;};struct Paddle :public Sprite{    void moveleft() {    }    void moveright() {    }};struct Ball :public Sprite{    void move() {    }};//##为可允许省略可变参数#define CCAllBACK(__selector__, __target__, ...) std::bind(&__selector__, __target__, ##__VA_ARGS__)//应该为Timer添加一个停止某个调度器,类似于加一个判断某Timer是否运行的key(Timer-id)-Value(bool)struct Timer {    list<std::function<void()>>_TimerContain;    void addsetInterval(std::function<void()>func) {        _TimerContain.push_back(func);    }    void run()    {        for (auto i : _TimerContain)        {            if(isrun[Timer-id])                _TimerContain[Timer-id]        }    }};
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 融创洞庭壹号 融创金贸时代商铺 融创待遇如何 融创天下科技股份有限公司 融创奥山博爵堡 融创中心天街1956 融创君澜装修 融创御景二期 融创之江一号 融创律师事务所 融创理想城市三期 保利融创枫丹壹号 融创金茂时代 融创熙园租房 融创中心物业 融创都会中心 万达茂为什么改名融创茂 融券余额 融券 什么是融券 融券做空 融券卖出 融券费用 融资 融券 融券余量 融资融券余额多好还是少好 融资融券余额 融资融券利率 开通融资融券条件 融资融券利息 齐鲁融资融券 融资融券费用怎么算 融资融券对股票的影响 融资融券新规定 融资融券股票池 融资融券首批 两市融资融券余额查询 融资融券余额查询 融券是什么意思 什么是融资融券 融资融券余额什么意思