如何实现一个似乎坚持它的位置的'菜单'?卡住了我的意思是说scene
正在移动,或者它仍然保持在它的位置上。这让人觉得它就在它的位置。我通过使用滚动场景移动它来实现它,它的工作原理却表现得很荒谬,“有时候”。
以下是我如何创建menu
的代码:
resetPosition =[CCMenuItemImage itemFromNormalImage:@"position.png"
selectedImage:@"position_over.png"
disabledImage:@"disabled.png"
target:self
selector:@selector(reset)];
resetPosition.position =ccp(400, 300);
myresetMenu = [CCMenu menuWithItems:resetPosition, nil];
myresetMenu.position = ccp(0,0);
[[self parent] addChild:myresetMenu z:10];
[resetPosition setIsEnabled:NO];
现在用于移动场景的代码(当用户尝试滚动场景时)。此外,我已使用scene
移动了菜单,因此它显示菜单仍然包含scene
:
if([touchArray count]==1)//scroll
{
UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
moveLocation1 = [[CCDirector sharedDirector] convertToGL:location];
float diffX = beginLocation1.x - moveLocation1.x;
float diffY = beginLocation1.y - moveLocation1.y;
//NAVIGATION TOWARDS X AND Y WhenEver and how ever you want
if (abs(diffX) > abs(diffY))
{
CCLOG(@"yScrlFlag=%d",yScrlFlag);
if(diffX > 0)
{
xScrlFlag=1;
[self.parent runAction:[CCMoveTo actionWithDuration:round(-(-3112-self.parent.position.x)/650)
position:ccp((-3112-self.position.x),self.parent.position.y)]];
[resetPosition setIsEnabled:YES];
[resetPosition runAction:[CCMoveTo actionWithDuration:round(-(-3112-self.parent.position.x)/650)
position:ccp((3112+self.position.x+400),resetPosition.position.y)]];
}
else
{
xScrlFlag=0;
[self.parent runAction:[CCMoveTo actionWithDuration:(-self.parent.position.x/650)
position:ccp(0,self.parent.position.y)]];
//[resetPosition setIsEnabled:YES];
[resetPosition runAction:[CCMoveTo actionWithDuration:(-self.parent.position.x/650)
position:ccp(400,resetPosition.position.y)]];
}
}
else
{
if(diffY < 0)
{
yScrlFlag=1;
CCLOG(@"\n nodePosition.x=%f \n nodePosition.y=%f",nodePosition.x,nodePosition.y);
[self.parent runAction:[CCMoveTo actionWithDuration:(-(-300-self.parent.position.y)/650)
position:ccp(self.parent.position.x,(-self.position.y))]];
//[self.parent runAction:[CCMoveBy actionWithDuration:(-(-300-self.parent.position.y)/650)
// position:ccp(self.parent.position.x, -diffY)]];
[resetPosition setIsEnabled:YES];
//[resetPosition runAction:[CCMoveBy actionWithDuration:round(-(-300-self.parent.position.x)/650)
// position:ccp(resetPosition.position.x, (self.parent.position.y))]];
}
else
{
yScrlFlag=0;
[self.parent runAction:[CCMoveTo actionWithDuration:(-(-300-self.parent.position.y)/650)
position:ccp(self.parent.position.x,0)]];
//[resetPosition runAction:[CCMoveTo actionWithDuration:round(-(-300-self.parent.position.x)/650)
// position:ccp(resetPosition.position.x,300)]];
}
}
}
答案 0 :(得分:2)
您没有指定如何创建菜单以及您正在使用它们做什么,所以我的回答非常普遍......
对我而言,正确的方法是拥有一个UI层,您可以放置所有UI内容(菜单,按钮等),并且与其他游戏层的处理方式不同。换句话说,您将UI图层赋予固定位置,然后不对其应用任何操作或任何其他类型的转换。它应该保持相当静态。
Cocos2d提供了自己的类来管理CCMenu
,CCMenuItem
和CCLabel
,以便您轻松构建UI。但是,如果您愿意,还可以尝试集成UIKit
个对象。如果你确实需要,请查看CCUIViewWrapper
。
编辑:
关于拥有UI层的想法更详细:
您有一个根层充当所有图层的容器;
其中一个层是“游戏层”,这就是你现在所拥有的;
另一个是“ui层”;
触摸和任何类型的转换仅应用于“游戏层”,它在根层内移动而不会影响“ui层”。
Steffen Itterheim在“Learn Game Development with Cocos2D”中有一个很好的教程。如果你想学习cocos2d游戏的几种漂亮方法,这本书太棒了。我正在谈论的教程可以在Steffen的网站上以代码形式获得。您可以从this page下载它并查看第5章“场景和图层”示例,特别是从ScenesAndLayers04开始,您将在其中找到'MultiLayerScene.h / m`类。
答案 1 :(得分:1)
这一段时间我有点麻烦。我一直试图让相机移动时没有丢失的UI元素。我最后做的是在孩提时代添加一个CCParallaxNode,并将视差比设置为ccp(0.0,0.0)。这样,场景可以移动,但我的UI层保持不变。我不确定这是否是最好的方法,但我是一个肮脏的黑客程序员:)
答案 2 :(得分:0)
@sergio有正确的想法。
尽管你的代码。将它放在一个层中,然后在触摸动作中移动它就像你已经移动一样,当你采取行动再次重新启动菜单时重置它的位置。