4

我正在使用 html5 开发基于赌场的游戏。动画工作正常,但这不是很平滑,即一旦车轮停止旋转,我移动球作为最终重新定位以平滑过渡,但这并不符合预期。完整代码在这里

BallReposition 函数 - 在我的轮子停止运动后运行,以对球进行最终重新定位,从而为动画提供一些真实感。

function ballReposition(){
curX = findNearestOnCircle(curX);
 if(curX > deadXRight){
        sign = "-";
    }else if(curX < deadXLeft){
        sign = "+";
    }       
    if(sign == "+"){
        curX = parseInt(curX) + ballRepositionIncVal;
        curY = Math.floor(Math.abs(getYOnCircle(curX, 130, 1)) + 0.5);      
    }else{
        curX = parseInt(curX) - ballRepositionIncVal;           
        curY = Math.floor(Math.abs(getYOnCircle(curX, 130, 0)) + 0.5);
    }
    var xy = normalizeXY(curX, curY);

    curX = parseInt(xy.split("-")[0]);
    curY = parseInt(xy.split("-")[1]);
    surface = document.getElementById("myCanvas");
    var surfaceContext = surface.getContext("2d");
    //removing older ball image.
    surfaceContext.save();
    // Translate to the center point of our image
    surfaceContext.translate(happy.width * 0.5, happy.height * 0.5);
    // Perform the rotation
    surfaceContext.rotate(DegToRad(angle));
    // Translate back to the top left of our image

    surfaceContext.translate(-happy.width * 0.5, -happy.height * 0.5);             
    surface.getContext("2d").drawImage(happy, 0, 0);
    surface.getContext("2d").drawImage(ball, curX, curY);
    console.log(curX + curY);
    surfaceContext.restore();

    ballRepositionIncVal-=5;
    if(ballRepositionIncVal <= 0){
        clearInterval(myIntervalVar);
    }

}

其他功能详情——

  1. drawCanvas - 加载图像,一旦加载图像,它将开始调用循环函数,该函数将旋转轮子并以逆时针方向移动球。
  2. normalizeXY - 用于将球放在一些离散的位置,即低于轮数的适当位置。

编辑 -在这里更新小提琴配置

4

1 回答 1

4

要创建逼真的旋转轮,您可以使用对数方法来降低轮速。

这意味着每个帧的角度都会减少很小的百分比。因为它是百分比,所以你会得到一个平滑的结束旋转(你还会注意到你得到了臭名昭著的车轮混叠效果)。

此在线演示显示了隔离的循环(请随意实现):

var angle = 2;          /// start angle in radians
ctx.translate(w, h);    /// prepare canvas for rotation (w and h = 50%)

ctx.globalAlpha = 0.67; /// optional bonus: motion blur(-ish)
loop();                 /// start loop

function loop() {

    ctx.rotate(a);      /// use incremental rotation
    ctx.drawImage(img, -w , -h);

    /// spin down and only loop if angle > certain value
    a *= 0.995;

    /// continue if there is enough "inertia"
    if (a > 0.001) requestAnimationFrame(loop);
}

继续循环的阈值决定了您希望停止的“残酷”程度。如果您希望轮子看起来更重(质量更大),您可以以更小的增量减小角度(例如 try 0.998)。

要让球在周围反弹,您需要借助物理建模,或者至少是伪物理建模。这包括对车轮上所有小细节的碰撞检测以及子时间步(射线投射)检查和 z 轴定位。

我觉得这在 SO 上描述有点宽泛,但可以找到一篇关于碰撞检测和物理模拟的好文章。这是基础知识的良好开端

于 2013-09-04T01:21:12.430 回答