感谢您抽出宝贵时间查看我的菜鸟问题,我们将非常感谢您的帮助。
首先,我试图使用bezier曲线(从不想使用box2d)将对象从屏幕的一侧“反弹”到另一侧(
)。对象有4个状态代表4个动作,当对象击中(反应)从前一个状态移动到新状态的地板时,请参见下图...
**我的问题是我无法正确使用CGRect从状态1转换到状态4。我现在可以让对象移动状态,但随后发生了两件事之一......
1)以下代码将允许对象正确地从状态1更改为状态2,但是在状态2结束时它将不会与地板(它只是通过它)发生反应,因此不会更改为状态3
-(void)updateStateWithDeltaTime:(ccTime)deltaTime andListOfGameObjects:(CCArray *)listOfGameObjects {
[self setDebugLabelTextAndPosition];
if ([self isOutsideOfScreen])
return;
CGPoint currentSpitePosition = [self position];
floorCharacter = (GameCharacter*)[[self parent]
getChildByTag:kfloorSpriteTagValue];
CGRect floorBoudingBox = [floorCharacter adjustedBoundingBox];
CGRect ballBoundingBox = [self adjustedBoundingBox];
CGRect characterBox = [character adjustedBoundingBox];
if (CGRectIntersectsRect(floorBoudingBox, ballBoundingBox)) {
if (characterState == kStateTravelling) {
[self changeState:kStateTravellingPoint2];
}
if (characterState == kStateTravellingPoint2) {
[self changeState:kStateTravellingPoint3];
}
}
2)下面的代码会在第一次撞击地板时停止对象,但是如果我在程序运行时移除了地板一秒钟,则对象将移动到状态3并在它撞到地板时再次停止,如果我再次移除地板,它将再次移动到状态4,这是没有添加其他状态(如下所示),所以它只是每次重复状态2。我猜这是因为它一碰到底就会返回TRUE,而当它为真时它就不会动作。
-(void)updateStateWithDeltaTime:(ccTime)deltaTime andListOfGameObjects:(CCArray *)listOfGameObjects {
[self setDebugLabelTextAndPosition];
if ([self isOutsideOfScreen])
return;
CGPoint currentSpitePosition = [self position];
floorCharacter = (GameCharacter*)[[self parent]
getChildByTag:kfloorSpriteTagValue];
CGRect floorBoudingBox = [floorCharacter adjustedBoundingBox];
CGRect ballBoundingBox = [self adjustedBoundingBox];
isfloorWithinBoundingBox =
CGRectIntersectsRect(floorBoudingBox, ballBoundingBox) ?
YES : NO;
if (isfloorWithinBoundingBox) {
[self changeState:kStateTravellingPoint2];
}
我想要它做的是在4个状态之间移动,如果地板在“反弹”运动中处于活动状态,那么只要状态1完成它就会撞到地板并进入状态2直到它完成曲线移动并再次击中地板然后进入状态3等。
对,我已经完成了上述工作,但并不完全理解我是如何做到的!
我尝试使用screenSize来确定对象的位置并将CGRect作为基础,但它起初并不起作用。然后我保留了代码,但添加了'CGSize screenSize = [CCDirector sharedDirector] .winSize;'方法,然后对象执行我想要的方式。
我现在使用screenSize时出现以下错误。 ''screenSize'的本地声明'隐藏实例变量'
我想知道的是为什么在我在方法中声明它之前它不使用screenSize(因为它已经在导入到这个中的另一个类中声明了)。
再次感谢任何花时间阅读此内容的人。
我的代码在下面......
-(void)updateStateWithDeltaTime:(ccTime)deltaTime andListOfGameObjects:(CCArray *)listOfGameObjects {
[self setDebugLabelTextAndPosition];
if ([self isOutsideOfScreen])
return;
CGPoint currentSpitePosition = [self position];
floorCharacter = (GameCharacter*)[[self parent]
getChildByTag:kfloorSpriteTagValue];
CGRect floorBoudingBox = [floorCharacter adjustedBoundingBox];
CGRect ballBoundingBox = [self adjustedBoundingBox];
CGPoint floorPosition = [floorCharacter position];
*Below is where I have added screenSize*
CGSize screenSize = [CCDirector sharedDirector].winSize;
isfloorWithinBoundingBox =
CGRectIntersectsRect(floorBoudingBox, ballBoundingBox) ?
YES : NO;
if ((characterState == kStateTravelling) && (isfloorWithinBoundingBox == YES)) {{
[self changeState:kStateTravellingPoint2];
}
return;
}
if ((characterState == kStateTravellingPoint2)&&(isfloorWithinBoundingBox == YES) && (floorPosition.x > screenSize.width*0.32f) && (floorPosition.x < screenSize.width*0.45f)) {{
[self changeState:kStateTravellingPoint3];
}
return;
}
if ((characterState == kStateTravellingPoint3)&&(isfloorWithinBoundingBox == YES) && (floorPosition.x > screenSize.width*0.45f) && (floorPosition.x < screenSize.width*0.55f)) {{
[self changeState:kStateTravellingPoint4];
}
return;
}