2013-07-24 35 views
7

Tôi có một hình ảnh của một bánh xe của bánh xe tài sản và tôi đang cố gắng để làm như vậy khi nó quay nó hiển thị số tiền chính xác cho những gì nó được quay.Tìm giá trị trên bánh xe cho bánh xe của tài sản

Tôi có đoạn mã sau: http://jsfiddle.net/maniator/rR67s/

Nhiều lần nó là đúng, và thời gian còn lại là sai.

Ví dụ tôi quay này:

300

Và nó cảnh báo , đó là sai.

Tôi làm cách nào để sửa thuật toán của mình sao cho đúng 99% thời gian (hoặc 100% nếu có thể)?

HTML:

<div id="game"> 
    <div id="tick">⇩</div> 
    <img id="wheel" src="http://i.imgur.com/R7JYazp.png" data-rotation="0"> 
</div> 

Javascript:

var Wheel = (function() { 
    var wheel = document.getElementById('wheel'), 
     wheelValues = [5000, 600, 500, 300, 500, 800, 550, 400, 300, 900, 500, 300, 900, 0, 600, 400, 300, -2, 800, 350, 450, 700, 300, 600], 
     spinTimeout = false, 
     spinModifier = function() { 
      return Math.random() * 10 + 20; 
     }, 
     modifier = spinModifier(), 
     slowdownSpeed = 0.5, 
     prefix = (function() { 
      if (document.body.style.MozTransform !== undefined) { 
       return "MozTransform"; 
      } else if (document.body.style.WebkitTransform !== undefined) { 
       return "WebkitTransform"; 
      } else if (document.body.style.OTransform !== undefined) { 
       return "OTransform"; 
      } else { 
       return ""; 
      } 
     }()), 
     degreeToRadian = function (deg) { 
      return deg/(Math.PI * 180); 
     }; 

    function Wheel() {}; 

    Wheel.prototype.rotate = function (degrees) { 
     var val = "rotate(-" + degrees + "deg)"; 
     if (wheel.style[prefix] != undefined) wheel.style[prefix] = val; 
     var rad = degreeToRadian(degrees % 360), 
      filter = "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=" + rad + ", M12=-" + rad + ", M21=" + rad + ", M22=" + rad + ")"; 
     if (wheel.style["filter"] != undefined) wheel.style["filter"] = filter; 
     wheel.setAttribute("data-rotation", degrees); 
    }; 

    Wheel.prototype.spin = function (callback, amount) { 
     var _this = this; 
     clearTimeout(spinTimeout); 
     modifier -= slowdownSpeed; 
     if (amount === undefined) { 
      amount = parseInt(wheel.getAttribute('data-rotation')); 
     } 
     this.rotate(amount); 
     if (modifier > 0) { 
      spinTimeout = setTimeout(function() { 
       _this.spin(callback, amount + modifier); 
      }, 1000/5); 
     } else { 
      var dataRotation = parseInt(wheel.getAttribute('data-rotation')); 
      modifier = spinModifier(); 
      var divider = 360/wheelValues.length; 
      var wheelValue = wheelValues[Math.floor(Math.round(dataRotation % 360)/divider)]; 
      switch (wheelValue) { 
       case 0: 
        return callback(0); 
       case -1: 
        return callback("Free Spin"); 
       case -2: 
        return callback("Lose a turn"); 
       default: 
        return callback(wheelValue); 
      } 
     } 
    }; 

    return Wheel; 
})();  

var wheel = new Wheel; 
wheel.spin(function(spinVal){ 
    alert(spinVal) 
}); 

Full trò chơi dành cho những ai muốn thử nó ra: http://jsfiddle.net/maniator/XP9Qv/ (< - điều này đã được cập nhật sử dụng câu trả lời được chấp nhận)


Niềm vui tiếp tục here.

+6

Bạn nghĩ rằng bạn đang mát mẻ với trò chơi Wheel of Fortune ưa thích của bạn? Vâng, nó là mát mẻ ... :) – Ian

+0

@Ian Cảm ơn bạn^_^Tôi đã thêm một liên kết ở dưới cùng của OP của tôi vào trò chơi đầy đủ nơi 'Bánh xe' được sử dụng. – Neal

+0

Tôi tin rằng lỗi phải làm với javascript xác định kết quả trước khi bánh xe đã dừng lại hoàn toàn, điều này có vẻ là khi lỗi xảy ra. Tôi sẽ xem liệu tôi có thể xác định nguyên nhân chính xác không. – Duane

Trả lời

6

Tôi nghĩ vấn đề là vào mũi tên ở vị trí đầu tiên nằm ở giữa một khu vực, chứ không phải lúc bắt đầu. Vì vậy, bạn có một offset bắt đầu của (360/wheelValues.length)/2

var divider = 360/wheelValues.length; 
var offset=divider/2; //half division 
var wheelValue = wheelValues[Math.floor(Math.ceil((dataRotation+offset) % 360)/divider)]; 

Điều này dường như làm việc: khi bánh xe dừng lại hoặc vào đầu (nửa đầu) hoặc vào cuối (nửa cuối) của một vùng giá trị cho thấy là một trong những dự kiến (chỉ khoảng một chục bài kiểm tra được thực hiện)

+0

Điều này có vẻ giống như giải pháp tôi đã độc lập đưa ra – Chris

+0

Ok, điều này sẽ làm việc cho tất cả các bánh xe có điểm bắt đầu ở giữa giá trị. Và nếu điểm bắt đầu ở trên một cạnh, mã hiện tại của tôi _should_ làm việc, phải không? – Neal

+0

Đúng, bù đắp sẽ bằng không –

0
var wheelValue = wheelValues[Math.floor(Math.ceil(dataRotation % 360)/15)]; 
      switch (wheelValue) { 

tôi đã thay đổi dòng này từ round để ceil và nhận được 14 trong tổng số 14 kết quả chính xác ..

+0

Bây giờ 33 trên 33. – DevlshOne

+0

Trong số 1000? Ngoài ra hãy thử nó trong một vòng lặp cho với làm mới nó mỗi lần. Tôi không biết nếu nó hoạt động hoàn toàn ... (cũng idk làm thế nào để kiểm tra nếu nó là chính xác khi chạy trong vòng lặp for lol) – Neal

+0

Ngoài ra tôi cập nhật để sử dụng 'divider == 360/wheelValue.length' (đó là giống nhau 15 trong trường hợp này) – Neal

Các vấn đề liên quan