SuperBall开发总结(二)-让小球动起来

有了上篇SuperBall开发总结(一)-游戏框架,我们可以用JavaScript来做一个有趣的小实验。

其实就是在一个封闭的小盒子里,有个小球在不停地弹来弹去。

实验效果

SuperBall_01-Add_A_BALL

注意JavaScript代码,由于该网站将提交的Javascript代码用window.onload = function(){}封装,所以做了一些微调。

首先新建一个 canvas

<canvas id="count_down_canvas"
        width="1024" height="768"
        style="border:1px grey solid;display: block;
               margin: 20px"></canvas>`

然后设置一个小球对象

var ball = {
         x :  200 , 
         y :  200, 
         r :  10, 
         vx : 80, 
         vy : -80, 
         color : "rgb(0, 122, 122)"};`
var frequency = 25; //每个1/25秒刷新一次`

设置主循环函数

window.onload = function(){
    
    var canvas = document.getElementById("super_ball_canvas");
    canvas.width = 300;
    canvas.height = 300;
    var context = canvas.getContext("2d");


    setInterval(
            function(){
                render(context); //渲染函数
                checkHit(); //碰撞检测函数
                update(); //状态更新函数
            },
            frequency
    );
}

这里的setInterval()函数作用是每个1/frequency时间执行一次function(){}里面的函数

render()函数

function render(context){
    //清空当前画布
    context.clearRect(0, 0, context.canvas.width, context.canvas.height);        

    //画圆
    context.beginPath();        
    //参数:圆心X,圆心Y,半径R,起始角度,终止角度,(顺时针)
    context.arc(ball.x, ball.y, ball.r, 0, 2*Math.PI);
    context.closePath();
    
    //填充颜色
    context.fillStyle= ball.color;
    context.fill();
}

这里绘制的基本思路是现将上次绘制的小球清空,再绘制新的小球

用到了一些基本的绘图函数,值得一提的是beginPath()closePath()将当前图形封闭,不会影响也不会受其他图形的影响

checkHit()函数

function checkHit(){

    if(ball.x <= ball.r){
        ball.x = ball.r;
        ball.vx *= -1;
    }

    if(ball.x >= 300 - ball.r){
        ball.x = 300 - ball.r;
        ball.vx *= -1;
    }

    if(ball.y <= ball.r){
        ball.y = ball.r;
        ball.vy *= -1;
    }

    if(ball.y >= 300 - ball.r){
        ball.y = 300 - ball.r;
        ball.vy *= -1;
    }

}

这个函数很简单,主要是判断小球是否碰到或者已经超过边界,若符合条件,则要调整小球的坐标和速度。

这里有个细节,将小球的坐标拉回边界值,目的是防止速度过大导致小球在下一时刻依然“碰撞”而无法“反弹”。

update()函数

function update(){
    ball.x += ball.vx / frequency;
    ball.y += ball.vy / frequency;
}

非常简单的update()函数,其实就是初中物理知识,s = s0 + vt。只是这里把速度的值与更新频率做了一个简单的换算。

总结

从这简单的几行代码中可以看出,让小球按照我们的规则动起来,其实非常简单,只需要设计好简单逻辑框架和一点物理知识。

这只是用于学习游戏开发的一些基本的机制,而对于一个完善的游戏引擎来说,需要考虑的地方就会复杂的多。

下一篇SuperBall开发总结(三)-加入木板将介绍,玩家可以控制的木板如何加入游戏当中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,832评论 25 707
  • 大商場的鑽戒閃著一克拉七萬的驕傲 蓬頭垢面的著裝載著輕蔑不屑的眼光 買一顆戴著玩真正的實話 售貨小姐聽來瘋子嘴裡的...
    无限不循环F阅读 187评论 0 0
  • 如果两个指定的表达式相等,则返回空值。 语法NULLIF(expression1,expression2) 参数e...
    forever_smile阅读 647评论 0 0
  • 不如让我 念着夏天 写下蜂鸟的名字 将它装进信封 下山投寄 你展信时 便会忆起 忆起那段时日 ...
    深吉月阅读 591评论 0 3