HTML5 画布轮盘赌

2023-12-14

我有这个http://jsfiddle.net/e7fwt4wb/! html5 canvas 中的轮盘旋转正常运行,当我调用 spin 方法时,轮盘会旋转并停止在我的数字数组中的随机数中!如何调用传递参数的函数以停止在数字数组的某个位置?

<script type="text/javascript">
var colors = ["#336600", "#660000", "#000000", "#660000",
    "#000000", "#660000", "#000000", "#660000",
    "#000000", "#660000", "#000000", "#660000", "#000000", "#660000", "#000000"];
var numbers = ["0", "1", "8", "2",
    "9", "3", "10", "4",
    "11", "5", "12", "6", "13", "7", "14"];

var startAngle = 0;
var arc = Math.PI / 6;
var spinTimeout = null;

var spinArcStart = 10;
var spinTime = 0;
var spinTimeTotal = 0;

var ctx;

function drawRouletteWheel() {
    var canvas = document.getElementById("canvas");
    if (canvas.getContext) {
        var outsideRadius = 200;
        var textRadius = 160;
        var insideRadius = 125;

        ctx = canvas.getContext("2d");
        ctx.clearRect(0, 0, 500, 500);


        ctx.strokeStyle = "black";
        ctx.lineWidth = 2;
        ctx.font = 'bold 18px Helvetica, Arial';

        for (var i = 0; i < 12; i++) {
            var angle = startAngle + i * arc;
            ctx.fillStyle = colors[i];

            ctx.beginPath();
            ctx.arc(250, 250, outsideRadius, angle, angle + arc, false);
            ctx.arc(250, 250, insideRadius, angle + arc, angle, true);
            ctx.stroke();
            ctx.fill();

            ctx.save();
            ctx.shadowOffsetX = -1;
            ctx.shadowOffsetY = -1;
            ctx.shadowBlur = 0;
            ctx.shadowColor = "rgb(220,220,220)";
            ctx.fillStyle = "white";
            ctx.translate(250 + Math.cos(angle + arc / 2) * textRadius,
                    250 + Math.sin(angle + arc / 2) * textRadius);
            ctx.rotate(angle + arc / 2 + Math.PI / 2);
            var text = numbers[i];
            ctx.fillText(text, -ctx.measureText(text).width / 2, 0);
            ctx.restore();
        }

        //Arrow
        ctx.fillStyle = "yellow";
        ctx.beginPath();
        ctx.moveTo(250 - 4, 250 - (outsideRadius + 5));
        ctx.lineTo(250 + 4, 250 - (outsideRadius + 5));
        ctx.lineTo(250 + 4, 250 - (outsideRadius - 5));
        ctx.lineTo(250 + 9, 250 - (outsideRadius - 5));
        ctx.lineTo(250 + 0, 250 - (outsideRadius - 13));
        ctx.lineTo(250 - 9, 250 - (outsideRadius - 5));
        ctx.lineTo(250 - 4, 250 - (outsideRadius - 5));
        ctx.lineTo(250 - 4, 250 - (outsideRadius + 5));
        ctx.fill();
    }
}

function spin() {
    spinAngleStart = Math.random() * 10 + 10;
    spinTime = 0;
    spinTimeTotal = Math.random() * 3 + 4 * 1500;
    rotateWheel();
}

function rotateWheel() {
    spinTime += 30;
    if (spinTime >= spinTimeTotal) {
        stopRotateWheel();
        return;
    }
    var spinAngle = spinAngleStart - easeOut(spinTime, 0, spinAngleStart, spinTimeTotal);
    startAngle += (spinAngle * Math.PI / 180);
    drawRouletteWheel();
    spinTimeout = setTimeout('rotateWheel()', 30);
}

function stopRotateWheel() {
    clearTimeout(spinTimeout);
    var degrees = startAngle * 180 / Math.PI + 90;
    var arcd = arc * 180 / Math.PI;
    var index = Math.floor((360 - degrees % 360) / arcd);
    ctx.save();
    ctx.font = 'bold 30px Helvetica, Arial';
    ctx.textAlign = "center";
    var text = numbers[index]
    ctx.fillStyle = colors[index];
    ctx.fillText("Rolled: " + text, 250 - ctx.measureText(text).width / 2, 250 + 10);
    ctx.restore();
}

function easeOut(t, b, c, d) {
    var ts = (t /= d) * t;
    var tc = ts * t;
    return b + c * (tc + -3 * ts + 3 * t);
}

drawRouletteWheel();
</script>

以下是如何旋转轮盘并停在轮盘上所需的数字处。

要使用 Penner 缓动方程旋转轮子,您需要定义以下 4 个属性:

  • 动画当前经过的时间
  • 车轮的起始角度
  • 将车轮旋转至所需数字所需的总角度变化
  • 动画总时长

给定这 4 个属性,您可以应用缓动方程之一来计算动画期间随时的车轮角度:

// t: current time inside duration, 
// b: beginning value,
// c: total change from beginning value,
// d: total duration
function easeOutQuart(t, b, c, d){
    // return the current eased value based on the current time
    return -c * ((t=t/d-1)*t*t*t - 1) + b;
}

例如,假设您想要在 2 秒的时间内旋转到 9 号口袋。然后将应用这些属性值:

  • 当前经过时间:800ms(例如),
  • 车轮起始角度:0 radians,
  • 旋转到数字 9 所需的总角度变化:3.6652 radians
  • 总持续时间:2000ms,

你可以这样计算 800ms 时车轮旋转的缓和角度:

easeOutQuart(800,0,3.6652,2000);

三个必需的 Penner 属性是“给定的”,但旋转到数字 9 所需的总变化计算如下:

// "9" is element#4 in numbers[]
var indexOfNumber9 = 4;  

// calc what angle each number occupies in the circle
var angleSweepPerNumber = (Math.PI*2) / totalCountOfNumbersOnWheel;

// calc the change in angle required to rotate the wheel to number-9
var endingAngleAt9 = (Math.PI*2) - angleSweepPerNumber * (indexOfNumber9+1);

// the arrow is at the top of the wheel so rotate another -PI/2 (== -90 degrees)
endingAngleAt9 -= Math.PI/2;

// endingAngle is now at the leading edge of the wedge
// so rotate a bit further so the array is clearly inside wedge#9
endingAngleAt9 += Math.random()*angleSweepPerNumber;

这是示例代码和演示:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");

var colors = ["#336600", "#660000", "#000000", "#660000",
              "#000000", "#660000", "#000000", "#660000",
              "#000000", "#660000", "#000000", "#660000", "#000000", "#660000", "#000000"];
var numbers = ["0", "1", "8", "2",
               "9", "3", "10", "4",
               "11", "5", "12", "6", "13", "7", "14"];
var pocketCount=12;
var cheatText=numbers[4];
$('#cheat').text('Stop on '+cheatText);

var cw=canvas.width=ch=canvas.height=500;
var cx=cw/2;
var cy=ch/2;

// wheel & arrow are used often so cache them
var wheelCanvas=drawRouletteWheel();
var arrow=drawArrow();

var wheel={
  cx:cw/2,
  cy:ch/2,
  radius:Math.min(cw,ch)/2-20,
  startAngle:0,
  endAngle:Math.PI*4+cheatingSpin(cheatText),
  totalSteps:360,
  currentStep:0,
}

drawAll(wheel);

$('#spin').click(function(){requestAnimationFrame(animate);$(this).hide()});


// funcs

function cheatingSpin(hit){
  var PI=Math.PI;
  var PI2=PI*2;
  var index=numbers.indexOf(cheatText);
  var pocketSweep=PI2/pocketCount;
  // cheatText not in numbers[]? -- then spin randomly
  if(index<0){return(PI2*2+Math.random()*PI2);}
  // if cheating, calc random endAngle inside desired number's pocket
  return((PI2-pocketSweep*(index+1))+Math.random()*pocketSweep-PI/2);
}

function animate(time){
  if(wheel.currentStep>wheel.totalSteps){return;}
  drawAll(wheel);
  wheel.currentStep++;
  requestAnimationFrame(animate);
}

function easing(w){
  var t=w.currentStep;
  var b=w.startAngle;
  var d=w.totalSteps;
  var c=w.endAngle-w.startAngle;
  // Penner's OutQuart
  return (-c*((t=t/d-1)*t*t*t-1)+b+w.startAngle);    
}

function drawAll(w){
  var angle=easing(w);
  ctx.clearRect(0,0,cw,ch);
  ctx.translate(cx,cy);
  ctx.rotate(angle);
  ctx.drawImage(wheelCanvas,-wheelCanvas.width/2,-wheelCanvas.height/2);
  ctx.rotate(-angle);
  ctx.translate(-cx,-cy);
  ctx.drawImage(arrow,cx-arrow.width/2,44);
}

function drawRouletteWheel() {
  var outsideRadius = 200;
  var textRadius = 160;
  var insideRadius = 125;
  var canvas = document.createElement("canvas");
  var ctx = canvas.getContext("2d");   
  canvas.width=canvas.height=outsideRadius*2+6;
  var x=outsideRadius+3;
  var y=outsideRadius+3;
  var arc = Math.PI / (pocketCount/2);
  ctx.strokeStyle = "black";
  ctx.lineWidth = 2;
  ctx.font = 'bold 18px Helvetica, Arial';
  // wheel
  for (var i = 0; i < pocketCount; i++) {
    var angle = i * arc;
    ctx.fillStyle = colors[i];
    ctx.beginPath();
    ctx.arc(x,y, outsideRadius, angle, angle + arc, false);
    ctx.arc(x,y, insideRadius, angle + arc, angle, true);
    ctx.stroke();
    ctx.fill();
    ctx.save();
    ctx.shadowOffsetX = -1;
    ctx.shadowOffsetY = -1;
    ctx.shadowBlur = 0;
    ctx.shadowColor = "rgb(220,220,220)";
    ctx.fillStyle = "white";
    ctx.translate(x+Math.cos(angle + arc / 2) * textRadius,
                  y+Math.sin(angle + arc / 2) * textRadius);
    ctx.rotate(angle + arc / 2 + Math.PI / 2);
    var text = numbers[i];
    ctx.fillText(text, -ctx.measureText(text).width / 2, 0);
    ctx.restore();
  }
  //
  return(canvas);
}

function drawArrow(){
  var canvas = document.createElement("canvas");
  var ctx = canvas.getContext("2d");   
  canvas.width=18;
  canvas.height=18;
  //Arrow
  ctx.fillStyle = "yellow";
  ctx.beginPath();
  ctx.moveTo(5,0);
  ctx.lineTo(13,0);
  ctx.lineTo(13,10);
  ctx.lineTo(18,10);
  ctx.lineTo(9,18);
  ctx.lineTo(0,10);
  ctx.lineTo(5,10);
  ctx.lineTo(5,0);
  ctx.fill();
  return(canvas);
}
body{ background-color: ivory; }
#canvas{border:1px solid red; background:lightgray; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<span id=cheat>Stop on this number</span>
<button id=spin>Spin</button><br>
<canvas id="canvas" width=300 height=300></canvas>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 画布轮盘赌 的相关文章

  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • HTML W3C 有效元素 - DIV 在 TD 内有效吗?

    我正在和一位同事争论 但找不到证据证明我们俩都是对的 我之前已经看过给定标签的有效元素列表 但只是无法再次找到它 有人能指出我正确的方向吗 我对 XHTML 很好奇 但分歧具体在于 DIV 标签在 HTML 4 01 中的 TD 标签内是否
  • 两列表:一列尽可能小,另一列占据其余部分

    我在 div 中有一个 to columns 表 div table tbody tr td class action a a td td class content p Bigger text variable size p td tr
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 如何在模态打开时防止主体滚动

    我在用着W3schools 模态脚本 https www w3schools com howto tryit asp filename tryhow css modal我想添加一个功能 防止模型打开时整个主体滚动 我根据我的需要对原始脚本做
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • $resource.query 返回分割字符串(字符数组)而不是字符串

    我正在使用像下面这样的 Angular resource angular module app factory data function resource var Con resource api data update method P
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo

随机推荐

  • 当数组中给出级别时转换对象列表

    假设我有一个数组 它告诉我标签列表和一个值 我需要将它们添加到 JSON 对象中 怎么把它改成这样呢 所以基本上我有一个数组和一个值100 arr 1 Male 应该将其转换为对象 obj 1 Male 100 你可以使用reduceRig
  • 如何将字符串添加到 string[] 数组?没有 .Add 功能

    private string ColeccionDeCortes string Path DirectoryInfo X new DirectoryInfo Path FileInfo listaDeArchivos X GetFiles
  • 在 addClassRules 中添加组

    我该如何添加groups for require from group添加到addClassRules validator addClassRules group input require from group 1 group input
  • Rails 3.1 提交带有链接的 ajax (remote: true) 表单

    在 Rails 3 1 应用程序上使用 ajax 我需要能够使用链接而不是提交按钮提交 ajax 表单 使用远程 true 我需要对链接 或表单 做什么才能使其作为 ajax 提交而不是正常的表单提交 我尝试将 onclick java 添
  • 如何彻底删除gcloud?

    我是 mac 新手 我只是删除了 gcloud 文件夹 现在 当我打开命令行窗口时 我总是会看到下一个 bash Users myuser gcloud google cloud sdk completion bash inc 没有这样的文
  • C编程:scanf中的字符[重复]

    这个问题在这里已经有答案了 scanf 字符有问题 运行程序时不要让我输入字符 当我输入整数时程序会打印 printf 并转到最后一个 else include
  • 为什么 Spark 的 Word2Vec 返回向量?

    运行Spark 的 Word2Vec 示例 我意识到它接受一个字符串数组并给出一个向量 我的问题是 它不应该返回矩阵而不是向量吗 我期望每个输入单词有一个向量 但它返回一个向量周期 或者也许它应该接受字符串 而不是字符串数组 一个单词 作为
  • 如何在 PHP 应用程序内从另一个站点呈现 javascript?

    我想做的是从 PHP 应用程序内部的网页读取特定行 这是迄今为止我的实验设置
  • ASP 中的访问控制允许来源

    我有一个 DOM 文件 它调用另一个域上的 ASP 文件 不是 NET 我该如何写Access Control Allow Origin在ASP 中 Access Control Allow Origin是 PHP 的 但我找不到 ASP
  • oracle.jdbc.OracleDatabaseException: ORA-00972: 标识符太长

    这是我的实体类 Entity public class ProjectDetails Id private int projectId private String projectDescription private int langua
  • jQuery.extend 和 jQuery.fn.extend 之间的区别?

    我试图理解 jquery 插件语法 因为我想将两个插件合并到 一 信号灯还需要能够间隔停止或运行多次 反正 这个语法与以下相同吗 jQuery fn extend everyTime function interval label fn t
  • 自定义 SSL 处理在 Android 2.2 FroYo 上停止工作

    对于我的应用程序 Transdroid 我通过 HTTP 连接到远程服务器 也可以选择通过 HTTPS 安全连接 对于与 HttpClient 的这些 HTTPS 连接 我使用自定义 SSL 套接字工厂实现来确保自签名证书正常工作 基本上
  • VBA COM 互操作问题

    我有一些来自 MSDN 的示例代码 我正在尝试对其进行修改以供使用 但 VBA 编译器拒绝尖括号的内容 lt gt 我在模块中有以下代码 Imports System Imports System Runtime InteropServic
  • java上的rtsp流

    任何人都可以帮我提供有关如何使用 gstreamer 在 java 中实现 RTSP 流媒体服务器的教程 链接文本 RTSP建立过程Server 代码是用 C 编写的 但请查看我的客户端代码以了解如何使用 gstreamer java AP
  • Pygame 使用对象和矩形进行碰撞检测

    是的 我正在问有关该程序的另一个问题 D 不管怎样 我目前有一个程序 可以在屏幕上创建两条线 它们之间有一个可以滚动的间隙 从这里 我显然需要查看两个物体是否发生碰撞 由于我只有一个精灵和一个矩形 我认为为它们创建两个类有点毫无意义和过分
  • Android WebView:在 JavaScript 中处理箭头键

    我有一个简单的 WebView 应用程序 我想用键盘控制它 是否可以在 Javascript 中捕捉箭头键 我尝试过以下代码 但没有任何运气 function handleArrowKeys evt console info key doc
  • 使用 ssh 时出现错误 EOF:找不到命令

    我正在尝试重命名远程服务器中的文件名 例如 filename dirname suffix 并将文件复制到我的服务器 我写过这样的代码 usr bin bash TRANSFERSERVERXMLS emp transfer XMLS RE
  • AngularJS,在显示视图之前解析数据

    这个主题已经被问过 但我不知道在我的情况下该怎么做 Using AngularJS 1 0 5 在显示视图 登录 之前 我想获取一些数据并在未从 AJAX 请求加载数据时延迟视图呈现 这是主要代码 这是好方法吗 angular module
  • 使用递归将嵌套对象重新格式化为字符串数组

    我有以下对象 const modules celebrity actor male male female female director director movie movie user user 结果我想要一个字符串数组 如下所示 c
  • HTML5 画布轮盘赌

    我有这个http jsfiddle net e7fwt4wb html5 canvas 中的轮盘旋转正常运行 当我调用 spin 方法时 轮盘会旋转并停止在我的数字数组中的随机数中 如何调用传递参数的函数以停止在数字数组的某个位置