Guest User

Untitled

a guest
Apr 22nd, 2015
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QML 3.46 KB | None | 0 0
  1. Window {
  2.     id: w
  3.     visible: true
  4.     width: 360
  5.     height: 360
  6.  
  7.     property var objects: []
  8.  
  9.     Rectangle {
  10.         width: 20
  11.         height: 20
  12.         color: "red"
  13.         x: 100
  14.         y: 100
  15.         radius: 20
  16.  
  17.         property double dx: 0
  18.         property double dy: 0
  19.  
  20.         property double g: 9.8
  21.         property double k: 20
  22.  
  23.         Component.onCompleted: {
  24.             objects.push(this)
  25.         }
  26.     }
  27.  
  28.     property int fps: 50
  29.     property double skipTicks: 1000 / fps
  30.     property real nextTick: (new Date).getTime()
  31.     property real maxFrameSkip: 5
  32.  
  33.     Timer {
  34.         running: true
  35.         repeat: true
  36.         interval: 10
  37.         onTriggered: {
  38.             var loops = 0
  39.             while ((new Date).getTime() > nextTick && loops < maxFrameSkip) {
  40.                 gUpdate()
  41.                 nextTick += skipTicks
  42.                 loops++
  43.             }
  44.             var interpolation = ((new Date).getTime() + skipTicks - nextTick)/skipTicks
  45.             gRender(interpolation)
  46.         }
  47.     }
  48.  
  49.     function gUpdate() {
  50.         objects.forEach(function(o) {
  51.             var vertical = false
  52.             var horizontal = false
  53.             var isLeft = false
  54.             var isTop = false
  55.  
  56.             o.dy += o.g/o.k
  57.             o.dx += 0.001 * (o.dx > 0 ? -1 : 1)
  58.            
  59.             // это условие должно было остановить дрожание
  60.             // оно работает если убрать этот треклятый while() из таймера
  61.             // if(o.y >= w.height - o.height - 1
  62.             if(o.y + o.dy >= w.height - o.height - 1
  63.                     && Math.abs(o.dy) < 0.1) {
  64.                 o.dx = 0
  65.                 o.dy = 0
  66.             }
  67.  
  68.             // узнаем об какую границу окна ударился шарик
  69.             // и в какую сторону он движется
  70.             if(o.x + o.dx <= 0) {
  71.                 horizontal = true
  72.                 isLeft = true
  73.             }
  74.             else if(o.x + o.dx + o.width >= w.width) {
  75.                 horizontal = true
  76.             }
  77.  
  78.             if(o.y + o.dy <= 0) {
  79.                 vertical = true
  80.                 isTop = true
  81.             }
  82.             else if(o.y + o.dy + o.height >= w.height) {
  83.                 vertical = true
  84.             }
  85.  
  86.             if (horizontal && vertical) {
  87.                 if (o.width > o.height) {
  88.                     horizontal = false
  89.                 } else {
  90.                     vertical = false
  91.                 }
  92.             }
  93.  
  94.             // если шарик ударился, то инвертируем скорость
  95.             // и уменьшаем ее на коэфф.
  96.             if (horizontal) {
  97.                 o.dx *= -1
  98.                 o.dx += o.k/o.g * (o.dx > 0 ? -1 : 1)
  99.  
  100.                 if (isLeft) {
  101.                     o.x = 0
  102.                 } else {
  103.                     o.x = w.width - o.width
  104.                 }
  105.             }
  106.             else if (vertical) {
  107.                 o.dy *= -1
  108.                 o.dy += o.k/o.g
  109.  
  110.                 if (isTop) {
  111.                     o.y = 0
  112.                 } else {
  113.                     o.y = w.height - o.height
  114.                 }
  115.             }
  116.         })
  117.     }
  118.  
  119.     function gRender(interpolation) {
  120.         objects.forEach(function(o) {
  121.             o.x += o.dx * interpolation
  122.             o.y += o.dy * interpolation
  123.         })
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment