【发布时间】:2010-10-03 22:45:13
【问题描述】:
我有一个精灵动画,一个使用 3D 应用程序渲染的小炮。我正好有 360 帧的 360 度转弯。每张图片的像素大小为 100x100。
所以基本上我想要做的是当我点击页面中的任何地方时,大炮的枪管需要旋转以指向鼠标光标,这听起来可能很简单,但我真的不能让它很好地工作,也许是因为我缺乏数学技能:P
我目前拥有的是这样的
/* This is my div with the cannon background image (360 images stitched into one) each "image area" is 100x100px */
obj.cannon = $('#cannon');
/* Get the X/Y of the cannon loc in the dom */
var cannonX = $(obj.cannon).offset().left;
var cannonY = $(obj.cannon).offset().top;
/* Get radians using atan2 */
var radians = Math.atan2(e.pageY-cannonY, e.pageX-cannonX);
/* Convert to degrees */
var degrees = radians * (180/Math.PI);
这就是我所在的位置,我的意思是因为图像宽度是 100 像素,我需要将背景位置移动 100 像素才能将大炮向右移动 1 度,因为总共 360 幅图像 * 100 像素 = 36000 像素。所以拼接后的精灵大概是 36000px 宽。
所以
根据图像精灵的当前 backgroundPosition 在此处插入奇怪的计算,并根据鼠标光标单击的位置应用新的 backgroundPosition,然后使用某种 setTimeout(animateIt, speed);将背景位置“动画化”到新位置。
function animateIt(){
if(newpos!=targetpos) { //Use < > here if we need to add or remove
newpos+=100; //Until we arrive at the new backgroundPosition
$(obj.cannon).css({backgroundPosition: newpos+'px' });
setTimeout(animateIt, speed);
}
}
我在这里是否完全正确,我是否正确地考虑了这一点?我觉得很愚蠢,这应该是一件简单的事情,但现在我的大脑崩溃了,我想=P。我的问题是我不知道如何正确到达“新目标背景位置”然后对其进行动画处理 ++ 或 -- 基于当前背景位置:/
【问题讨论】:
-
使用一个图像和基于 HTML5 的图像旋转方法怎么样? raphaeljs.com/image-rotation.html .. 还是渲染出来的图片真的不一样?
-
对大炮的看法真的改变了吗?你有精灵的链接吗?就像 Fosco 所说的 raphael 可以做到这一点,或者你甚至可以使用 CSS 转换来旋转图像本身(虽然不是在 IE 中)。
-
恐怕这是不可能的,因为这门大炮是透视的,排序等距视图,它实际上是一个真正的 3D 对象,当精灵旋转时它不能直接从上面看到等等......因此简单的 css 旋转将不起作用...
标签: javascript jquery rotation sprite css-sprites