我试图找出,如何使用cocos2d js
创建一个平滑的光标跟随动画这里有一些代码:
var listener = cc.EventListener.create({
event: cc.EventListener.MOUSE,
onMouseMove: function (event) {
var str = "MousePosition X: " + event.getLocationX() + " Y:" + event.getLocationY();
var actionBy = cc.MoveTo.create(2, cc.p(event.getLocationX(), $scope.bar._position.y));
$scope.bar.stopAllActions();
$scope.bar.runAction(
cc.sequence(
//cc.rotateTo(2, 0),
actionBy
)
);
// do something...
}});
这里的问题,因为事件经常被触发而被卡住了“$ scope.bar.stopAllActions();”停止动画。
如果我删除“$ scope.bar.stopAllActions();”动画疯狂,“酒吧”飞越屏幕。
我只是不会按照鼠标光标,就像狗跟随人类一样
答案 0 :(得分:1)
这里的问题是,如果您删除stopAllActions();
,那么您正试图对已经同时执行某项操作的对象执行操作。在任何一种情况下,你都经常在一个物体上发射动画,我很少看到这项工作如预期的那样。
我尝试直接运行该操作,而不是先将其置于cc.Sequence
之内,但如果这不起作用,那么您有两个选择,都依赖于手工劳动:
一个。只需将鼠标移动到鼠标移动位置即可:
$scope.bar.x = event.getLocationX();
湾假设你想要"榨汁"游戏,只需在鼠标上设置栏就会很无聊,所以你可以让酒吧逐渐赶上鼠标:
在你的常数部分:
var EASING_CONSTANT = 0.9;
在事件处理程序中:
$scope.bar.x += ($scope.bar.x - event.getLocationX()) * EASING_CONSTANT;
EASING_CONSTANT
越低,条形图越慢,只能使用0到1之间的值。
现在,如果您尝试使用此功能,您将意识到该栏杆永远不会完全赶上您的鼠标,因此您必须将此代码放在更新功能中(在主游戏层中#&#) 39;例如s update
方法,因此它运行每一帧。
BUT!然后您无法访问event
对象,因此您必须得到以下内容:
在事件处理程序中:
$scope.bar.targetX = event.getLocationX();
在更新方法中:
$scope.bar.x += ($scope.bar.x - $scope.bar.targetX) * EASING_CONSTANT;
你可以使用很多缓动功能,我给你最简单的例子。
例如,请注意您还有event.getDeltaX()
方法,它会返回事件的最后一次调用与当前之间的位置差异(自上次调用以来鼠标移动了多少)事件)。有了这个,你可以做一些事情:
在你的常数部分:
var EASING_CONSTANT = 0.9;
var WOBBLING_CONSTANT = 10;
在事件处理程序中:
$scope.bar.targetX = event.getLocationX();
$scope.bar.mouseDeltaX = event.getDeltaX();
在更新方法中:
$scope.bar.x += ($scope.bar.x - $scope.bar.targetX) * EASING_CONSTANT + Math.cos($scope.bar.mouseDeltaX) * WOBBLING_CONSTANT;
只是发挥创意并开始搞乱公式,直到找到一种感觉"感觉"对。但一定要先简单开始吧!
PS:我猜你想要你的" bar"只在x轴上移动,所以..你正在制作一个arkanoid克隆? :d