【问题标题】:What's the best design for image-based iphone app?基于图像的 iPhone 应用程序的最佳设计是什么?
【发布时间】:2011-01-20 10:40:51
【问题描述】:

我希望能提供一些关于 iphone 游戏设计的建议。我想在它上面显示一些背景图像和其他图像(建筑物、人物等)。背景将很大(最多为屏幕大小的 10 倍),因此一次只会显示一部分背景文件。这个想法是当角色接近屏幕边界时替换这块。我需要将此背景转换为平滑动画。另外,我需要一个放大/缩小功能,最好是动画。屏幕上的某些图像将是静态的(建筑物),而有些则需要一些动画(角色行走)。

什么是最好的设计:

  1. 结合使用 Core Graphics “精灵”类 - 显示 精灵的 UIImage 与 CGContextDrawImage
  2. 使用 UIKit - 创建 UIImageview 来保存每个 图像并将它们作为子视图添加到 单视图应用程序
  3. 使用 OpenGL ES 项目

选项 1) 结果非常缓慢。似乎 CoreGraphics 并不意味着在游戏循环中显示图像。但也许有办法让它有效?也许以某种方式将它与核心动画结合起来?

选项 2) 是我目前的选择。我希望视图能够缓存它所持有的图像,从而比 CG 更有效。但是 UIImageview 提供的动画会令人满意吗?我认为不应一次添加所有视图,而应在背景移动时动态创建和添加(删除?)。这是个好主意吗?

选项 3) 可能会提供对图像的最佳控制,但这似乎是一个相当大的开销。我只需要显示图像,而不是矢量图形。另外,我是 Mac 编程的新手,我不想陷入一些复杂的技术。

感谢任何建议,谢谢:)

【问题讨论】:

  • 仅供参考,StackOverflow 是一个问答网站。您应该接受对您的问题的回答(因为它会提高有人回答您更多问题的几率)。不是说你需要接受我的。
  • 我之前尝试为您的答案投票,但我的代表没有运气。现在我知道如何接受答案了,耶 :) 顺便说一句,cocos2d 正是我所需要的,再次感谢 ;-)

标签: iphone image opengl-es core-graphics


【解决方案1】:

我强烈推荐Cocos2D,因为我已经完成了自己的development here on my blog. 这真的很容易做到。我关注Ray Wenderlich's tutorials,他提供了很好的工具来完成你所描述的一切。

【讨论】:

  • 如果你发现 UIKit 和 Core Animation 不能提供你需要的性能,我也会推荐这个方法,并且绝对走这条路而不是滚动你自己的 OpenGL 绘图系统(除非你想用低级图形编程弄脏你的手 - 这有它的回报,但生产力不是其中之一)
  • @Mattia,Cocos2D 的好处在于,如果您真的需要使用 OpenGL ES,我相信您可以。只需打开他们的一门课程并为自己的目的复制它!
  • 感谢您的建议,我会先从 UIKit 开始学习 Cocos2d。该框架最终可能会获胜 :) 您可以推荐哪本书:Pablo Ruiz 的“Cocos2d for iPhone 0.99 Beginner's Guide”或 Steffen Itterheim 的“Learn iPhone and iPad cocos2d Game Development”?
  • 只是为了增加额外的 0.02 美元...我有一段时间没看过 Cocos2D 所以这可能已经改变了,但我过去避免它的一个原因是它没有与 UIKit 很好地集成,因此您无法访问 Cocoa 提供的所有 UI 控件,并且您不能使用 Interface Builder 来布局您的 UI。如果您的游戏的 UI 复杂性较低,这不是问题,但在我处理 UI 的每款游戏中,都需要 50% 以上的项目时间,而且我不想重新发明比按钮更复杂的东西(例如tableview) 除非我有一个该死的好理由。
  • @Mattia,Cocos2D 现在有 CCTable 和 CCMenu 用于控件。它的功能相当丰富。
【解决方案2】:

您问“背景将很大(最多为屏幕大小的 10 倍),因此一次只会显示一部分背景文件。”

平铺图像系统非常强大且性能快速。如果您使用谷歌地图,您将看到平铺图像的示例。滚动到一个新的区域并出现块。在本地应用程序中,您可以将 10 倍于屏幕大小的图像切割成 100 像素 x 100 像素的图块,每个屏幕只会加载显示的图块。当用户移动时,仅加载所需的图块。这可以节省内存并显着提高速度。这是表格可以飞行的基本原因,仅加载一个屏幕的单元格,因为滚动离开屏幕,它的内存被重用于下一个单元格。

【讨论】:

  • 我发现 Cocos2d 支持在 Tiled 地图编辑器中编辑的地图。这似乎是我要走的路,谢谢你的好建议:)
【解决方案3】:

如果选项 2 的性能足以满足您的需求,我会坚持使用它 - 它与您在 iPhone 上使用的系统一样简单,并且适用于非常简单的图形。可能会为您带来一点速度的相关选项是使用 CALayers 来实现图形。 CALayers 几乎同样易于使用,但比 UIViews 更轻量级(在某些方面,您可以将 UIViews 视为 CALayers 的包装器,并增加了管理触摸事件等事情的开销)

如果您有兴趣,我会阅读 Core Animation Programming Guide(我会提供链接,但我认为我的声誉太低,但 Google 应该会为您追踪)。 Core Animation 是一个很大的主题,可能非常令人生畏,但如果你只使用图层(即不是它的动画部分),它还不错。下面是一个简单的示例,可让您了解使用层的情况:

// NOTE: I haven't compiled this code so it may have typos/errors I haven't noticed

UIView* canvasView; // the view that will be the "canvas" for your game
... // initialize the canvas, etc.

CALayer* imageLayer = [CALayer layer];
UIImage* image = [UIImage imageNamed: @"MyImage.png"];
imageLayer.content = (id)image.CGImage;
imageLayer.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
imageLayer.position = CGPointMake(100, 100); // NOTE: Unlike UIViews CALayers have their origin at the center
[canvasView.layer addSublayer:imageLayer];

所以基本上它看起来很像处理视图,但增加了一些性能(偶尔会让人头疼)。

附: - 要记住的一件事是,如果您对可动画的图层属性(例如位置、不透明度等)进行更改,Core Animation 将隐式为其设置动画(例如,如果您编写 imageLayer.position = somePoint; 图层动画为这个位置而不是立即设置它的位置。有一些简单的方法可以解决这个问题,但这是另一个问题/答案的主题。

【讨论】:

  • 感谢您提供有用的提示,我一定会使用它。 CALayer 无法处理触摸事件,我理解了吗?
  • CALayer 不能直接处理触摸事件,但“画布”视图可以处理触摸,然后将其传递给可以使用 hitTest: 方法确定它们是否被触摸的层。跨度>
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多