所以我一直在寻找一种围绕中心点的背景轨道的方法。我遇到了greensock blitmask,它可以很好地包装位图数据以进行infinte滚动效果。但是,我无法想出一种方法来使用这个blitmask旋转位图数据并仍然具有包装效果。以下是我的SWF的链接。
移动的图像是我想要包装并具有无限滚动效果的图像。问题是在图像旋转后从图像移出屏幕后处理重新定位。
编辑:我完全忘记了这个问题,并决定把它放在我的游戏上,因为它需要很长时间才能完成。我最近回到了这个概念,因为我有一个想法让它工作。下面是.SWF的链接,显示了我想要完成的任务。虽然这个例子有效,但我觉得它不是最好的解决方案。
“WASD”控制运动
我使用了一些三角法来计算一个星星离玩家的距离。如果该星超出该距离,则使用它的角度* -1重新定位它。此代码位于链接下。
var travelVal:Number = 0;
var turnVal:Number = 0;
var currentChild:DisplayObject;
var currentStar:Star;
var childIndex:int = 0;
var angle:Number = 0;
var distance:Number = 0;
if (controller.isKeyDown(Keyboard.A))
{
turnVal += TURN_SPEED;
}
if (controller.isKeyDown(Keyboard.D))
{
turnVal -= TURN_SPEED;
}
if (controller.isKeyDown(Keyboard.W))
{
travelVal += PLAYER_SPEED;
}
if (controller.isKeyDown(Keyboard.S))
{
travelVal -= PLAYER_SPEED
}
for (childIndex = 0; childIndex < numChildren; childIndex++)
{
currentChild = getChildAt(childIndex);
//if (currentChild != player && currentChild != debugOutput && currentChild != blackBkgd)
if(currentChild is Star)
{
currentStar = currentChild as Star;
//move this child based on the travel value
currentChild.y += travelVal * currentStar.speed;
//calculate the orbiting
distance = Math2.distanceBetweenObjects(player, currentChild);
angle = Math.atan2(currentChild.y - player.y, currentChild.x - player.x);
if (distance > STAGE_WIDTH ) angle = angle * -1;
//get orginal angle in radians
//angle = Math.atan2(currentChild.y - player.y , currentChild.x - player.x);
angle = Math2.radiansToDegress(angle);
angle += turnVal;
//currentStar.rotation = angle;
angle = Math2.degreesToRadians(angle);
currentChild.x = player.x + (distance * Math.cos(angle));
currentChild.y = player.y + (distance * Math.sin(angle));
}
}
答案 0 :(得分:1)
为了围绕某个中心点旋转,首先翻译(-centerpoint.x,-centerpoint.y),然后绕(0,0)旋转然后再翻译(centerpoint.x,centerpoint.y) 。