亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS小游戲實例:2D桌面臺球

2024-09-06 12:41:01
字體:
來源:轉載
供稿:網友

demo: http://cnwander.com/demo/billiards/
原文地址:http://cnwander.com/blog/?p=11

先貼上代碼:

運行代碼框

[ctrl+a 全部選擇 提示:你可先修改部分代碼,再按運行]

雖厚顏冠名桌球,其實與真實桌球還相差甚遠,還有太多需要改進的地方。
具體待解決的問題:

  1. 由于瀏覽器上刷新頻率不可能太高,可能當檢測兩球距離時,兩球已經重疊了大部分,甚至完全越過。
    完全越過的情況先不考慮,重疊部分如果還原到精確的相切狀態,運行非常緩慢,所以我只采用了計算量較少的近似值,具體問題主要體現在開球時,多球碰撞時有些詭異。
    (如果哪位有好的優化計算方法,可以拿出來與wander分享,那wander真的感激不盡)
  2. 球自身滾動與桌面摩擦力問題。如正中擊球的瞬間,母球滑行狀態的摩擦力會大于向前滾動時的摩擦力,小于縮桿時摩擦力等等。這個問題好解決,只是剛開始沒考慮進去,之后也沒添加了,具體體現在兩球正撞后,撞擊球將完全靜止,這是不正確的。
  3. 能量損耗問題,無論與邊沿碰撞還是球與球相撞,都是直接減去一個固定值,這肯定是存在很大問題的。

其它肯定還會有很多問題,擔心假期把心玩油了,回頭沒心思繼續,干脆一氣呵成,趕得有些匆忙,問題回頭再慢慢解決吧,先發上來,對這塊有興趣的同學一塊兒探討探討。

大學數學基本是過場,高中的物理數學與忘得所剩無幾,真正做東西才發現自己這塊太薄弱,希望在這方面經驗比較豐富的同學不吝賜教。

|||

貼出一些關鍵代碼稍作解釋,有興趣的同學看看。

// ball class
function ball(type,x,y) {
    ...
    this.type = type;
    this.x = x; //位置
    this.y = y;
    this.angle = 0; //角度
    this.v = 0; //速度(不包含方向)
    ...
    return this;
}
描述小球的四個信息,小球的類型(母球,目標球),坐標,角度,速度
在更新坐標時,讀取小球的v,刷新小球的位置
在與邊沿碰撞時,更改小球angle

var formpos = getballpos(cueball.elem),
      topos = getballpos(guideball),
      angle = math.atan2(topos[0] - formpos[0],topos[1] - formpos[1]);
計算母球,與參考球之間的角度,其它任意小球之間也是如此
值得注意的是我采用的是math.atan2,而非math.atan,這是因為math.atan2返回的是(0 - math.pi)和(-math.pi - 0),可以確定唯一的角度,而math.atan不唯一。

//邊緣碰撞
if(ball.x < r || ball.x > w - r) {
ball.angle *= -1;
ball.v = ball.v * (1 - loss);
...
if(ball.type == "cue")    {
    if(ball.angle > 0) vy -= rollright;
    else vy += rollright;
    vx += rollup;
    rollup *= 0.2;
    rollright *= 0.2;
    ball.v = math.sqrt(vx*vx + vy*vy);
    ball.angle = math.atan2(vx,vy);
}
...
if(ball.y < r || ball.y > h - r) {
ball.angle = ball.angle > 0 ? math.pi - ball.angle : - math.pi - ball.angle ;
...
不考慮小球旋轉時,邊緣碰撞很簡單,更改小球angle即可
當小球旋轉時,如果碰到固定不動的物體時,那將會把速度作用給自身
并且自身旋轉速度減小
我這里計算球與球之間碰撞,并沒有將旋轉傳遞,這是不準確的,有待改善

這一段是核心,即小球與小球碰撞后各自的速度,其實并不難
先判斷兩球距離
var dis = math.sqrt(math.pow(disx,2)+math.pow(disy,2));
if(dis <= gap) {
    //如果目標球是靜止的,則添加到數組movingballs
    if(math.round(obj.v) == 0)   
    movingballs.push(obj);
   
    //還原兩球相切狀態,用其它方式做我不知道,但用js來做,這一步相當關鍵,否則誤差將相當大
    ball.x -= (gap - dis)*sin;
    ball.y -= (gap - dis)*cos;
    disx = obj.x - ball.x;
    disy = obj.y - ball.y;
   
    // 下面則是先將整個坐標系旋轉到相撞的水平方向
    // 計算角度和正余弦值
    var angle = math.atan2(disy, disx),
        hitsin = math.sin(angle),
        hitcos = math.cos(angle),
        objvx = obj.v * math.sin(obj.angle),
        objvy = obj.v * math.cos(obj.angle);
        //trace(angle*180/math.pi);
       
    // 旋轉坐標
    var x1 = 0,
        y1 = 0,
        x2 = disx * hitcos + disy * hitsin,
        y2 = disy * hitcos - disx * hitsin,
        vx1 = vx * hitcos + vy * hitsin,
        vy1 = vy * hitcos - vx * hitsin,
        vx2 = objvx * hitcos + objvy * hitsin,
        vy2 = objvy * hitcos - objvx * hitsin;
   
    // 碰撞后的速度和位置
    var plusvx = vx1 - vx2;
    vx1 = vx2;
    vx2 = plusvx + vx1;
   
    //母球加塞
    if(ball.type == "cue")    {
        vx1 += rollup;
        rollup *= 0.2;
    }               
   
    x1 += vx1;
    x2 += vx2;
   
    // 將位置旋轉回來
    var x1final = x1 * hitcos - y1 * hitsin,
        y1final = y1 * hitcos + x1 * hitsin,
        x2final = x2 * hitcos - y2 * hitsin,
        y2final = y2 * hitcos + x2 * hitsin;
    obj.x = ball.x + x2final;
    obj.y = ball.y + y2final;
    ball.x = ball.x + x1final;
    ball.y = ball.y + y1final;
   
    // 將速度旋轉回來
    vx = vx1 * hitcos - vy1 * hitsin;
    vy = vy1 * hitcos + vx1 * hitsin;
    objvx = vx2 * hitcos - vy2 * hitsin;
    objvy = vy2 * hitcos + vx2 * hitsin;
   
    //最終速度
    ball.v = math.sqrt(vx*vx + vy*vy) * (1 - 0);
    obj.v = math.sqrt(objvx*objvx + objvy*objvy) * (1 - 0);
   
    // 計算角度
    ball.angle = math.atan2(vx , vy);
    obj.angle = math.atan2(objvx , objvy);
}

  • 坐標旋轉的公式
    x1 = math.cos(angle) * x - math.sin(angle) * y;
    y1 = math.cos(angle) * y + math.sin(angle) * x;
  • 反坐標旋轉
    x1 = math.cos(angle) * x + math.sin(angle) * y;
    y1 = math.cos(angle) * y - math.sin(angle) * x;

不一定用坐標旋轉,我只是習慣了用這種方式來計算碰撞,只要將正向碰撞的速度相差即可

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.日韩av.com| 亚洲人成伊人成综合网久久久| 亚洲国产91精品在线观看| 亚洲午夜av电影| 51精品国产黑色丝袜高跟鞋| 久久精品一偷一偷国产| 亚洲天堂av在线免费| 国语自产精品视频在线看一大j8| 97香蕉超级碰碰久久免费软件| 成人国内精品久久久久一区| 精品国产乱码久久久久久天美| 国产成人精品视| 国产丝袜一区视频在线观看| 亚洲色在线视频| 亚洲精品成人久久久| 国产啪精品视频网站| 福利二区91精品bt7086| 色偷偷88888欧美精品久久久| 国产一区私人高清影院| 日韩精品视频免费在线观看| 91精品国产综合久久香蕉的用户体验| 日韩欧美亚洲国产一区| 国产成人97精品免费看片| 欧美电影免费观看高清完整| 欧美色视频日本版| 欧美成人剧情片在线观看| 91国产一区在线| 国产精品高潮呻吟久久av黑人| 国产91在线播放| 亚洲精品日韩激情在线电影| 国产精品入口夜色视频大尺度| 欧美专区在线观看| 国产精品观看在线亚洲人成网| 精品视频在线播放免| 国产成人在线一区二区| 国产精品免费在线免费| 欧美激情视频在线观看| 5566日本婷婷色中文字幕97| 日本高清不卡的在线| 欧美日韩国产成人在线观看| 国产精品偷伦免费视频观看的| 亚洲精品电影久久久| 亚洲精品不卡在线| 欧美精品www| 69久久夜色精品国产7777| 69**夜色精品国产69乱| 一区二区在线视频播放| 九九九热精品免费视频观看网站| 91精品国产自产在线老师啪| 国产成人avxxxxx在线看| 日本一欧美一欧美一亚洲视频| 136fldh精品导航福利| 久久久噜噜噜久久| 九九久久精品一区| 久久香蕉国产线看观看网| 日韩禁在线播放| 97av在线影院| 欧美日韩亚洲一区二区三区| 日韩精品免费在线观看| 久久久久一本一区二区青青蜜月| 亚洲国产精品久久久久| 97在线免费观看| 欧美人与性动交a欧美精品| 亚洲国产精品99久久| 亚洲国产毛片完整版| 国产自产女人91一区在线观看| 亚洲国产女人aaa毛片在线| 日韩欧美aaa| 日韩电影视频免费| 久久久亚洲网站| 97精品视频在线观看| 日韩国产精品视频| 久久在精品线影院精品国产| 色哟哟入口国产精品| 国产精品一区二区三区免费视频| 日韩欧美在线免费观看| 色www亚洲国产张柏芝| 成人xxxx视频| www.欧美精品一二三区| 亚洲欧洲中文天堂| 久久69精品久久久久久久电影好| 亚洲欧美一区二区三区在线| 精品视频一区在线视频| 国产精品亚洲网站| 国产在线精品成人一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 岛国av一区二区三区| 欧美午夜美女看片| 欧美久久精品一级黑人c片| 国产在线一区二区三区| 91久久久久久久| 欧美激情国产精品| 亚洲日韩欧美视频一区| 色妞一区二区三区| 日本一区二区三区四区视频| 欧美成人一区二区三区电影| 国产91亚洲精品| 日韩精品免费在线视频| 91性高湖久久久久久久久_久久99| 亚洲国产成人精品一区二区| 欧美老少做受xxxx高潮| 亚洲激情电影中文字幕| 成人在线视频福利| 5566成人精品视频免费| 欧美成人黄色小视频| 麻豆成人在线看| 日本在线精品视频| 亚洲大尺度美女在线| 国产综合福利在线| www.亚洲一二| 在线观看欧美日韩国产| 国产欧美日韩视频| 国产精品高潮呻吟久久av无限| 亚洲国产成人91精品| 午夜精品久久久久久久久久久久久| 在线a欧美视频| 欧美视频精品一区| 国产欧美日韩视频| 91久久精品国产| 久久综合网hezyo| 亚洲毛茸茸少妇高潮呻吟| 日本精品久久久久久久| 欧美一级视频免费在线观看| 日韩激情第一页| 一本一本久久a久久精品牛牛影视| 亚洲人免费视频| 最近2019中文字幕第三页视频| 亚洲另类xxxx| 亚洲人在线视频| 国产精品久久久久久中文字| 韩国三级日本三级少妇99| 日韩免费观看在线观看| 91久久综合亚洲鲁鲁五月天| 日韩av电影手机在线| 国内精品400部情侣激情| 91免费版网站入口| 成人免费看片视频| 久久99亚洲精品| 成人免费淫片aa视频免费| 精品在线观看国产| 欧美激情国产精品| 国产精品国产三级国产aⅴ9色| 亚洲国产精品久久精品怡红院| 欧美性猛交丰臀xxxxx网站| 欧美精品久久久久久久久| 国产日韩在线播放| 日韩在线观看免费全集电视剧网站| 97成人在线视频| 综合136福利视频在线| 国产精品福利在线| 欧美一区在线直播| 5566日本婷婷色中文字幕97| 久久亚洲综合国产精品99麻豆精品福利| 91精品国产网站| 91精品久久久久久| 色综合亚洲精品激情狠狠| 欧美高清在线视频观看不卡| 欧美最顶级丰满的aⅴ艳星| 亚洲精品久久久久久久久久久久| 欧美高清在线观看| 国产精品久久久久免费a∨| 欧美成在线观看| 国产精品久久久久久五月尺| 国产99久久精品一区二区|