问题描述
|
如何实现看起来像固定在其位置上的“菜单”?在这里,我的意思是说ѭ0正在移动或仍保持在它的位置。这给人的感觉就像是在它的位置上。我正在通过滚动场景来实现它,它可以工作,但有时会表现得很荒谬。
这是我如何创建
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)]];
}
}
}
解决方法
不久前,我对此有些麻烦。我一直试图让UI元素在相机移动时不会丢失。我最终要做的是添加一个CCParallaxNode作为子级,并在我放置的所有内容上将视差比设置为ccp(0.0,0.0)。这样,场景可以四处移动,但我的UI层保持原位。我不确定这是否是最好的方法,但是我是一种肮脏的hack程序员:)
, 您没有指定如何创建菜单以及如何使用它们,所以我的回答很笼统...
对我而言,正确的方法是拥有一个UI层,在其中放置所有UI内容(菜单,按钮等),并与其他游戏层区别对待。换句话说,您给UI层一个固定的位置,然后不对其执行任何操作或任何其他类型的转换。这样,它应该保持静态。
Cocos2d提供了自己的类来管理
CCMenu
,CCMenuItem
和CCLabel
,使您可以轻松构建UI。但是,如果您愿意,也可以尝试集成“ 9”个对象。如果确实需要,请看看CCUIViewWrapper
。
编辑:
关于UI层的想法如下:
您有一个根层充当所有层的容器;
其中的一层是“游戏层”,几乎就是您现在拥有的;
另一个是“ ui层”;
触摸和任何类型的转换仅应用于“游戏层”,该游戏层在根层中移动而不会影响“ ui层”。
Steffen Itterheim的“使用Cocos2D学习游戏开发”中有一个很好的教程。如果您想学习几种cocos2d游戏的精妙方法,这本书将是很棒的。我正在谈论的教程可以在Steffen网站上以代码形式获得。您可以从此页面下载它,并查看第5章“场景和图层”示例,特别是从ScenesAndLayers04开始,您将在其中找到\'MultiLayerScene.h / m`类。
, @sergio有正确的主意。
虽然你的代码。将其置于一个完整的层中,然后在触摸操作上将其移动,就像您已经在移动它一样,并在执行该操作以再次将菜单重新备份时重新设置其位置。