在 SpriteKit 中移动相机

2023-11-26

//UPDATE已添加更新的代码,其工作原理符合我的预期。请参阅下面更新的代码中的 didSimulatePhysics 方法。就我而言,我只关心在 x 轴上向左或向右移动字符,其中 x 轴上的 0 是绝对左侧,x 轴上的右侧是可配置值。苹果的冒险游戏也确实帮了很大的忙。

//原帖如下

我正在使用 Apple SpriteKit,并且正在努力实现我希望的相机行为。我在代码中所做的就是加载一个精灵角色、两个按钮和一个在开始时位于视图右侧的红色框。我想要做的是用按钮移动角色,一旦玩家到达屏幕的中间或末端,相机就会重新调整以发现视图中看不到的东西。因此,向右移动最终应该会显示玩家到达那里后最初在视图之外的红色框。但是,使用下面使用的代码,我根本无法让相机跟随并调整主角的坐标。我看过苹果的高级场景处理文档以及其他一些堆栈溢出帖子,但似乎无法正确理解。如果有人可以提供一些建议,我们将不胜感激。

enter image description here

#define cameraEdge 150

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        /* Setup your scene here */
        //320 568
        
    
        self.backgroundColor = [SKColor whiteColor];
        
        myWorld = [[SKNode alloc] init];
        [self addChild:myWorld];
        
        mainCharacter = [SKSpriteNode spriteNodeWithImageNamed:@"0"];
        mainCharacter.physicsBody.dynamic = YES;
        mainCharacter.name = @"player";
       
        mainCharacter.position = CGPointMake(20, 20);
        
        CGRect totalScreenSize = CGRectMake(0, 0, 800, 320);
        
        SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(60, 60)];
        
          SKSpriteNode *boxTwo = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(60, 60)];
           SKSpriteNode *boxThree = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(60, 60)];
        boxThree.position = CGPointMake(40, 50);
        
        [myWorld addChild:boxThree];
        
        boxTwo.position = CGPointMake(1100, 50);
        
        box.position = CGPointMake(650, 50);
        
        [myWorld addChild:box];
        [myWorld addChild:boxTwo];
        
       
       self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:totalScreenSize];
        
        self.physicsWorld.gravity = CGVectorMake(0, -5);
        mainCharacter.name = @"mainCharacter";
  
   
        mainCharacter.physicsBody.linearDamping = 0;
        mainCharacter.physicsBody.friction = 0;
        mainCharacter.physicsBody.restitution = 0;
        mainCharacter.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:mainCharacter.size];
        
       [myWorld addChild:mainCharacter];
      
        [self addChild:[self buildLeftButton]];
        [self addChild:[self buildRightButton]];

    }
    
    return self;
}

- (void)didSimulatePhysics
{
    SKSpriteNode *hero = mainCharacter;
    
    if(hero)
    {
        CGPoint heroPosition = hero.position;
        CGPoint worldPosition = myWorld.position;
        
        NSLog(@"%f", heroPosition.x);
        
        CGFloat xCoordinate = worldPosition.x + heroPosition.x;
        
        if(xCoordinate < cameraEdge && heroPosition.x > 0)
        {
            worldPosition.x = worldPosition.x - xCoordinate + cameraEdge;
            self.worldMovedForUpdate = YES;
        }
        
        else if(xCoordinate > (self.frame.size.width - cameraEdge) && heroPosition.x < 2000)
        {
            worldPosition.x = worldPosition.x + (self.frame.size.width - xCoordinate) - cameraEdge;
            self.worldMovedForUpdate = YES;
        }
        
        myWorld.position = worldPosition;
    }
}

-(SKSpriteNode *)buildLeftButton
{
    SKSpriteNode *leftButton = [SKSpriteNode spriteNodeWithImageNamed:@"left"];
    leftButton.position = CGPointMake(20, 20);
    leftButton.name = @"leftButton";
    leftButton.zPosition = 1.0;
    return leftButton;
}

-(SKSpriteNode *)buildRightButton
{
    SKSpriteNode *leftButton = [SKSpriteNode spriteNodeWithImageNamed:@"right"];
    leftButton.position = CGPointMake(60, 20);
    leftButton.name = @"rightButton";
    leftButton.zPosition = 1.0;
    return leftButton;
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];
    
    if([node.name isEqualToString:@"leftButton"])
    {
             [mainCharacter.physicsBody applyImpulse:CGVectorMake(-120, 0)];
    }
    
    else if([node.name isEqualToString:@"rightButton"])
    {
       [mainCharacter.physicsBody applyImpulse:CGVectorMake(120, 10)];
    }
}

如果您希望视图始终以玩家位置为中心,请根据以下几点修改代码:

1) 创建一个 SKNode 并将其命名为 myWorld、worldNode 或任何其他类似名称。

2)添加世界节点[self addChild:worldNode];

3) 将所有其他节点添加到 worldNode,包括您的玩家。

4)在didSimulatePhysics方法,添加这段代码:

worldNode.position = CGPointMake(-(player.position.x-(self.size.width/2)), -(player.position.y-(self.size.height/2)));

现在,您的视野将始终以玩家的位置为中心。

2015 年 5 月更新:

如果您使用的是通过平铺地图编辑器创建的地图,则可以使用免费的SKAToolKit框架。功能包括玩家相机自动跟随、测试玩家、测试 HUD 和精灵按钮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SpriteKit 中移动相机 的相关文章

  • 迁移到 ARC 时如何解决“选择器'performSelector:withObject:afterDelay:'没有已知的实例方法”?

    ARC 迁移工具在开始迁移之前拒绝接受此代码 self delegate performSelector selector overlayDismissed withObject self afterDelay 0 委托被迫使用协议来实现此
  • 多次添加同一个子视图来查看

    我不知道这是否可行 但我想做的是将子视图多次添加到视图中 我尝试过这样的事情 self view addSubview newView newView center CGPointMake 160 100 self view addSubv
  • 无法将“SDWebImageActivityIndi​​cator”类型的值分配给“ST_SDWebImageIndicator”类型?

    I have multiple flavours targets in my Xcode project I am also using SDWebImage in my app Everything was working fine un
  • 尝试复制文件时出错

    我正在尝试使用 NSFileManager 将临时文件复制到另一个位置 但是它失败并抱怨其中一个文件不存在 Copy temp file NSError error BOOL exists fileManager fileExistsAtP
  • iOS Storyboards 我应该使用它们吗? [复制]

    这个问题在这里已经有答案了 我是 iOS 开发新手 尚未创建应用程序 但我向我的朋友寻求建议 他在市场上拥有非常高评价的应用程序 他说不要使用故事板 尽管我很想听取他的建议 但它们似乎确实很有帮助 这是否会在将来给我的应用程序带来问题 我有
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • Swift 3:如何去除UITableView屏幕截图的灰色区域

    我在从桌面视图的屏幕截图中删除灰色区域时遇到了问题 这是我尝试截图时的输出UITableView 实际上我隐藏了一些tableViewCell这是不需要的 可能这就是区域显示灰色的原因 任何帮助表示赞赏 非常感谢 Answer 我通过使用
  • UITextFieldDelegate 与 UITextField 控件事件

    如果我想处理 UITextField 的更改 例如用户在其中键入 看起来这可以通过将委托分配给该文本字段 然后让委托实现 shouldChangeCharactersInRange 来完成 或者通过将目标添加到文本字段并处理 UIContr
  • iOS 8 中的 UISplitViewController 状态恢复

    在 iOS 8 上 UISplitViewController 似乎可以保存和恢复其子视图的状态 例如 主视图是否隐藏 这是不可取的 因为我的应用程序应该始终以横向方式显示主视图 并始终以纵向方式隐藏它 如果用户以横向模式关闭应用程序 保存
  • 如何从代码隐藏中设置 CarouselView 的项目?

    我有一个 CarouselView 它绑定到图像的 ItemsSource 但我想通过更改 CarouselView 的索引来更改当前显示的图像 我尝试使用 CarouselView Position 作为必须选择的元素的索引 但不幸的是这
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • 为什么我的 tableView 函数运行了 3 次?

    我有一个 UITableView 并且有执行它所需的方法之一 func tableView tableView UITableView numberOfRowsInSection section Int gt Int println sec
  • SpriteKitPhysicsBody非矩形碰撞

    pipeUp physicsBody SKPhysicsBody rectangleOfSize pipeUp size 在此编码中我使用了rectangleOfSize对于碰撞物理体 但如果我想按像素仅使用图像的形状 我应该使用什么而不是
  • PrepareForSegue之谜

    我在两个不同的 VC 中有一个prepareForSegue 方法 一个使用一个if声明 而另一个旨在使用switch 除了名称之外 代码几乎相同 这个效果很好 void prepareForSegue UIStoryboardSegue
  • 对使用phonegap和钛的质疑[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我听说了 PhoneGap 和 Titanium 移动网络应用程序的开发 我分析了这两个 Web 应用程序 并了解了如何使用它们以
  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • 将 iPhone 上的 stderr 写入文件和控制台

    我正在遵循答案中的建议here https stackoverflow com questions 5179108 iphone how to read application logs from device用于将 iOS 设备上的 NS
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 如何使用 lambda 实现计数器?

    我可以使用一个计数器来实现lambdapython 中的函数或一些更Pythonic 的表达式 这是我的代码 counter 0 if 0 lt arrival time counter 1 else pass 这是我尝试过的 count
  • 具有布尔返回值的 jQuery UI 对话框 - true 或 false

    我正在尝试替代javascript确认 我找到了可以完全自定义的 jquerydialog 函数 问题是我无法让它返回true or false 这是我的代码 delBox dialog autoOpen false resizable f
  • Android Studio 3.1.3 存在约束布局问题

    我试图在这里开始一个新项目 但出现了这个问题 我可以运行该项目并将其部署在模拟器中 但是这个渲染问题和使用私有资源让我很恼火 我已经尝试了互联网上找到的所有可能的解决方案 但它无法解决问题
  • 两个指针变量之间的差异[重复]

    这个问题在这里已经有答案了 我在笔试中问过这个问题 在我的 lapi 上运行以下代码时 我得到 10 作为输出 include
  • 如何按降序对 Plotly 条形图进行排序

    I have created a basic bar chart in plotly that I would like to sort by descending order 我找不到在绘图语法中指定这一点的简单方法 因此我尝试使用 Pa
  • 按钮点击返回值

    当我单击 PyQt 中的按钮时 我很难从调用的函数返回一个值 这就是我想为变量赋值的方式 file path self Button open clicked connect self OpenTextFile 整个函数如下所示 def O
  • Android SimpleDateFormat,如何使用?

    我正在尝试使用AndroidSimpleDateFormat像这样 String Date 2010 09 29 08 45 22 SimpleDateFormat fmt new SimpleDateFormat yyyy MM dd t
  • 是否可以以无点形式编写模式匹配函数?

    考虑以下 Haskell 代码 data Keypress Keypress Int Char getSeq Keypress gt Char getSeq Keypress i c replicate i c 有什么办法可以写getSeq
  • 关于用友元函数查找名字的问题

    我已阅读 basic lookup unqual 的标准部分 对此我感到困惑 typedef int f namespace N struct A friend void f A operator int void g A a int i
  • 如何将 GIF 图像添加到 Assets 文件夹并以编程方式将它们加载到 UIImageView 中

    我正在尝试将 2x 和 3x GIF 图像放入 Xcode 中的 Assets 文件夹中 我已经尝试过以下链接 但它对我不起作用 Link 1 and Link 2 我目前正在加载 GIF 文件 方法是将它们添加到我的项目包中并使用此访问它
  • PHP函数未定义变量问题

    我是 PHP 新手 所以我的函数有一个小问题 我有这行代码
  • 确保 .NET 中的 json 键为小写

    是否有在 NET 中使用 JSON 的简单方法来确保密钥以小写形式发送 目前我正在使用 newtonsoft 的 Json NET 库并简单地使用 string loginRequest JsonConvert SerializeObjec
  • 反应本机获取cookie

    我已经使用 fetch 登录了我的服务器 我想知道如何获取 cookie 我知道我可以使用 文档 cookie在浏览器开发中获取cookies 但是在React Native中如何开发 非常感谢 我刚刚遇到了同样的问题 我的第一个方法是手动
  • C++11 中的向量 VS 矢量 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我们为什么要使用vector
  • 在 WAMP 上安装 IMAGEMAGICK 的分步说明?

    似乎没有任何简明的教程 演练在 WAMP 上安装 ImageMagick 以与 PHP 一起使用 我已经尝试了数十种二进制版本与不同 php 扩展 dll 文件的组合 我可以从命令行让 imagemagick 正常工作 并且可以让它在 WA
  • 缺少 Google 日历结束时间

    这是我的谷歌日历请求 在响应中 错误代码是 缺少结束时间 我正在尝试使其动态化 因此我最终将删除硬编码的开始和结束日期时间 var object end dateTime 2014 07 28T23 00 00 end timeZone t
  • 根据选项组和选项计算产品变体

    我正在编写一个电子商务网站 需要一种好方法来计算产品变化 网站有产品 产品可以有很多选项组 选项组可以有很多选项 因此 T 恤产品有 3 个选项组和选项 Size 小的 中等的 大的 Color 红色的 蓝色的 黄色的 黑色的 Materi
  • python 修改函数中列表的切片

    考虑下面的代码 def func1 a a x 2 for x in a a range 10 print a prints 0 1 2 3 4 5 6 7 8 9 func1 a 5 print a also prints 0 1 2 3
  • 如何在SVN中找到两个分支的共同祖先?

    想象一下 您有一棵巨大的 SVN 树 树枝遍布各处 有树干 有树枝 这些树枝有树枝 等等 那么 给定树中的两个树枝 如何找到共同的祖先 我知道你可以简单地获取完整的日志并进行比较 但是如果你的主干有 75 000 个修订 并且大多数时候你确
  • 在 SpriteKit 中移动相机

    UPDATE已添加更新的代码 其工作原理符合我的预期 请参阅下面更新的代码中的 didSimulatePhysics 方法 就我而言 我只关心在 x 轴上向左或向右移动字符 其中 x 轴上的 0 是绝对左侧 x 轴上的右侧是可配置值 苹果的