我尝试使用在屏幕左右两侧墙壁之间反弹的物体制作游戏,直到它们到达底部。
目前,我的工作didBeginContact方法如下所示:
- (void)didBeginContact:(SKPhysicsContact *)contact {
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (crabCategory | leftWallCategory)) {
// figure out which crab in the array made the contact...
for(HHCrab *object in crabs) {
if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
[object stop];
[object moveRight];
}
}
} else if (collision == (crabCategory | rightWallCategory)) {
// figure out which crab in the array made the contact...
for(HHCrab *object in crabs) {
if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
[object stop];
[object moveLeft];
}
}
}
当我尝试添加其他声明时:
else if (collision == (crabCategory | bottomWallCategory)) {
// figure out which crab in the array made the contact...
for(HHCrab *object in crabs) {
if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
[object stop];
[object resetPosition];
[object moveLeft];
}
}
}
当螃蟹到达屏幕底部时重置螃蟹位置,螃蟹不会移动。在之前的question中,我意识到这可能是因为绘制螃蟹被物理模拟覆盖了。我们通过创建一个布尔值解决了这个问题,当螃蟹与底壁相交时,该布尔值将被打开和关闭,然后在didSimulatePhysics方法中重新定位螃蟹:
-(void)didSimulatePhysics{
if(self.shouldResetPosition){
self.player.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMaxY(self.frame)- _player.size.height-30);
self.shouldResetPosition = NO;
}
}
虽然这适用于一只螃蟹,但现在我使用的NSMutable螃蟹数组各有一个唯一的名称,但事实并非如此。我尝试将布尔值移动到Crab类,因此每个螃蟹都具有该属性,但这并没有解决问题。
答案 0 :(得分:1)
您需要对OOD(面向对象开发)概念进行一些研究。我建议买一本关于Objective-C编程的书来教授这些概念。
您正在创建自定义Crab对象的正确轨道上。使它成为UIView(或自定义基类的子类,但暂时忽略它)。然后,您可以创建一个“Arena”或“Scene”对象,作为蟹对象的容器。它将有一个可变数组,可以容纳你的蟹对象数组。
您可能想要概括您的Arena对象,以便它管理一系列抽象视图对象,这些对象知道如何绘制自己并拥有一些常见的动画设置方法。为所有自定义视图对象创建基类,然后使crab对象成为此自定义视图对象的子类。这样,如果您以后想要添加Fish对象,或Snail对象,甚至是Boat对象或Net对象等,您都可以这样做,而无需重新执行所有操作。
你可以使用UIView动画或核心动画让你的蟹对象自己动画,或者你可以使用计时器和基于帧的动画。使用其中一种内置动画方法,您将获得更流畅的动画和更好的性能。
您的控制代码会产生多个自定义视图对象(例如10个螃蟹,12个鱼,一个船,一个渔夫和一个网络),为它们配置位置和速度/行为,并将它们添加到竞技场对象中。 (竞技场可能会将它们添加到数组中以便跟踪它们。)然后,竞技场对象将使用基类的共享方法来管理这些对象。
答案 1 :(得分:0)
尝试使用对象。
可以使用这些方法创建对象CRAB类。
然后,对于每个螃蟹,创建一个CRAB类的实例并将它们添加到数组中以供参考。
基本上,你应该得到一组CRAB类。
玩得开心:)
答案 2 :(得分:0)
我会创建一个反映这个对象的类蟹。因此,该类将由若干函数和属性组成。然后你的应用程序可以保存一个列表或几个螃蟹的数组。此外,每只螃蟹的行为都相似。