Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Objective-C';中,如何在MyScene以外的类中调用update方法;s雪碧套件项目?_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios 在Objective-C';中,如何在MyScene以外的类中调用update方法;s雪碧套件项目?

Ios 在Objective-C';中,如何在MyScene以外的类中调用update方法;s雪碧套件项目?,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,所以我正在制作一个基于Objective-C精灵工具包的游戏。我对Objective-C相当陌生,所以我似乎被一些涉及更新方法的东西卡住了 传统上,在默认的精灵工具包项目中,它会为您创建一个视图,其中包含一个场景,该场景包含您要操纵的所有节点。它还附带了一个预生成的空更新方法,从那时起我就用自己的方法代替了它(非常有效)。但是我不希望我的更新方法基于MyScene类,这就是我的问题所在。如果我把update方法留在MyScene类中,我可以看到使用了NSLog,它实际上一直在被调用,就像它应该被

所以我正在制作一个基于Objective-C精灵工具包的游戏。我对Objective-C相当陌生,所以我似乎被一些涉及更新方法的东西卡住了

传统上,在默认的精灵工具包项目中,它会为您创建一个视图,其中包含一个场景,该场景包含您要操纵的所有节点。它还附带了一个预生成的空更新方法,从那时起我就用自己的方法代替了它(非常有效)。但是我不希望我的更新方法基于MyScene类,这就是我的问题所在。如果我把update方法留在MyScene类中,我可以看到使用了NSLog,它实际上一直在被调用,就像它应该被调用的那样,但是如果我把它移动到ViewControler类中,它就根本不会被调用

我的问题是如何让它在MyScene以外的类中调用update方法?您可能会问我为什么要这样做,因此我将在下面解释,但回答这个问题并不完全必要,但是如果您对我的程序有任何提示,请让我知道

传统雪碧套装项目

ViewController-->创建一个MyScene(仅从SKScene继承) MyScene-->创建所有节点,并具有手动游戏逻辑/图形的更新方法

我的精灵游戏的理想结构

ViewController-->创建前场场景和背景场景(仍从SKScene继承) 前场场景-->为游戏创建所有节点/角色 背景场景-->为游戏创建天空、云彩和一般景观。 GameController-->包含调用displayView和UpdateName的更新方法

编辑:为了消除混淆,ForgegroundScene和BackgroundScene本质上与最初生成的MyScene类相同,但现在有两个类重新命名,一个包含背景内容,另一个包含前景内容

更新游戏仍然位于GameController类中,它只执行碰撞测试、更新节点位置、删除被杀死的角色等操作

DisplayView位于ViewController中,其名称不言自明。它显示游戏的视图,该视图由背景场景和前景场景中的节点组成

不管怎样,这是我为一个游戏设定的想法,不确定它有多实用。我很乐意接受建议

这里是我想要的更新方法,以防您对它感兴趣,但正如我所说的,我使用NSLog测试它,它会相应地滴答作响,但在任何其他类中它都从未调用过

-(void)update:(CFTimeInterval)currentTime
{
    const int TICKS_PER_SECOND = 35;
    const int SKIP_TICKS = 1000 / TICKS_PER_SECOND; //these ivars would be moved to top of intended class
    const int MAX_FRAMESKIP = 10;

    NSDate *referenceDate = [NSDate date];

    double timePassed_ms = [referenceDate timeIntervalSinceNow] * -1000.0;
    NSUInteger next_game_tick = timePassed_ms;
    int loops;

    bool game_is_running = true;
    while( game_is_running ) {

        loops = 0;
        while([referenceDate timeIntervalSinceNow] * -1000.0 > next_game_tick && loops < MAX_FRAMESKIP) {
            [self updateGame] //calls GameController to do logic updates/collision test, etc.
            NSLog(@"update game");

            next_game_tick += SKIP_TICKS;
            loops++;
        }
        [self displayGame]; //calls viewcontroler to display game
    }
}
-(void)更新:(CFTimeInterval)currentTime
{
常数int TICKS每秒钟=35;
const int SKIP_TICKS=1000/TICKS_PER_SECOND;//这些IVAR将移动到预期类的顶部
const int MAX_FRAMESKIP=10;
NSDate*referenceDate=[NSDate日期];
double timePassed_ms=[referenceDate TimeIntervalncesInnow]*-1000.0;
NSU整数next\u game\u tick=时间经过\u ms;
int循环;
bool game\u is\u running=true;
同时(游戏正在运行){
循环=0;
同时([referenceDate TimeIntervalencesInnow]*-1000.0>next\u game\u tick&loops
您可以将每次调用
-update:
时要通知的类作为场景的实例变量,然后将消息转发给该类。例如,在场景中创建要通知的类的实例变量

@interface MyScene ()
@property (nonatomic) ClassToNotify *notify;
@end
然后在
-update:
方法中,只需通知实例变量

- (void)update:(CFTimeInterval)currentTime
{
    // pass the message on
    [self.notify notifyThatUpdateWasJustCalledWithTime:currentTime];
}

在这种情况下,
-notifythatUpdateWasUstCalledWithTime:
将是您的
类通知
类的一种方法。

听起来您只需要在
[self-UpdateName]
中使用两个场景。我在这里看到了几个问题:1)您在任何时间只能有一个场景(显示,接收更新:),另一个“场景”必须是常规sknode或仅是通过实际场景中的ivar引用的nsobject。2) 您的referenceDate过于工程化,您只需要将currentTime与上一次更新调用的时间进行比较,以获取增量时间。3) 只有当您计划创建自己的需要多速度/位置集成的物理引擎时,每帧多次调用UpdateName(特别是以60 fps的速度)才有意义。4)显示游戏表明你计划自己“画”东西,这在精灵工具包中是不必要的。SK自动渲染或“显示”场景的内容。我想不出你们需要在displayGame中做什么,而这在更新中是做不到的。总体看来,你打算实现一个游戏引擎的核心游戏循环,但没有考虑精灵程序包已经封装了这个游戏引擎逻辑。你可以做的是在上面添加一个基于组件的框架,以实现独立于视图的游戏逻辑,仅此而已。嗯,据我所知,视图只能呈现一个场景,但我想我可以有两个不同的视图,一层在另一层上,包含前景场景,另一个包含背景场景。如果不是的话,我会把所有的精灵组合成一个场景吗?就像我的动画云和天空与角色和武器在同一场景中一样。听起来,当我更喜欢将它们分开时,它会变得非常庞大和无组织。2-3)我会修复我的游戏循环谢谢!。4) 好吧,听起来我根本不需要这个,我只需要在我的原创作品中加入一些小的绘画素材