如何在动画时找到 div 的位置

Posted

技术标签:

【中文标题】如何在动画时找到 div 的位置【英文标题】:How to find the position of a div while it is animating 【发布时间】:2014-04-11 23:44:20 【问题描述】:

对于编码练习,我正在制作一个简单的游戏,当点击枪时,它会向移动的目标射出一颗红色的小子弹。为了有任何类型的游戏,需要比较子弹和目标的变化位置,所以当发生div重叠(子弹和目标之间的碰撞)时,可以将其添加到条件语句中以便获得积分例如得分。

我能想到的最好方法是在单击枪时使用 while 循环来不断检查两个 div 的位置。但是,当我使用 console.log 运行测试时,子弹的位置总是相同的,尽管子弹是动画的。我不确定我做错了什么。我在下面的代码中设置了用于测试目的的循环,所以while (i<100) 只是临时的。

JSBIN

JS

$(document).ready(function() 

  $('.allShips').animate(left: 400,5000,"linear");

  $('.gun').click(function() 

    $('.bullet').animate(top: '-10px', 1000,"linear", function()
      $(this).animate(top: '385px', 0);
    );

  var i = 0;  
  var allShips = $('.ships');
  var overlap = true;
  var bullet = $('.bullet');
  while (i<100) 
    i++;
    var bulletPos = bullet.position();
  overlap = !(allShips.right < bullet.left || allShips.left > bullet.right || allShips.bottom < bullet.top || allShips.top > bullet.bottom);
    console.log(i+" Top: " + bulletPos.top);
   if (overlap === false) 
      $('.allShips').css('background-color', 'red');
   
      
  ); 
);

【问题讨论】:

我不认为$.animate() 在这种情况下是正确的工具。我认为您需要使用requestAnimationFrame()setInterval() 自己制作动画。它会让你对游戏有更大的控制权。 我同意你可能想要一个主动画循环。在每次迭代中,您计算​​每个对象的下一个位置并执行碰撞检测。但是,查看animate 的阶跃函数可能仍然有用:api.jquery.com/animate/#step。 【参考方案1】:

你可以使用:

 var myprop = getComputedStyle("idofanmdiv", null);

得到类似的属性:

myprop.left;myprop.top

现在您将在 div 动画时获得位置:

 setInterval(function()
  var myprop = getComputedStyle("idofanmdiv", null);
  elmtop = myprop.top;
  elmleft = myprop.left;
 ,25);

如果你想检测两个div 之间的碰撞,那么: 使用 collision detection 和间隔:

function collisions($div1, $div2) 
var x1 = $div1.offset().left;
var y1 = $div1.offset().top;
var h1 = $div1.outerHeight(true);
var w1 = $div1.outerWidth(true);
var b1 = y1 + h1;
var r1 = x1 + w1;
var x2 = $div2.offset().left;
var y2 = $div2.offset().top;
var h2 = $div2.outerHeight(true);
var w2 = $div2.outerWidth(true);
var b2 = y2 + h2;
var r2 = x2 + w2;

if (b1 < y2 || y1 > b2 || r1 < x2 || x1 > r2) return false;
return true;
  

喜欢:

setInterval(function()
 if(collisions($('.allShips'), $('.bullet')))
   alert('shot Ok :)');
  
,25);

Working JSBIN

【讨论】:

以上是关于如何在动画时找到 div 的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何让jquery动画效果在屏幕滚动到指定位置才执行

如何在滚动时从左到右移动 div?

如何在页面呈现时才开始CSS3动画

如何自动检测特定 Div 的 scrollTop 位置? [复制]

冻结动画/防止悬停的回调动画播放

jQuery:如何在没有已知高度的情况下动画高度变化?