Какой лучший дизайн для графического приложения для iphone? - PullRequest
2 голосов
/ 20 января 2011

Буду признателен за советы по дизайну игр для iphone. Я хочу отобразить фоновое изображение и другие изображения поверх него (здания, персонажи и т. Д.). Фон будет большим (до 10 раз больше размера экрана), поэтому одновременно будет отображаться только часть фонового файла. Идея состоит в том, чтобы заменить эту часть, когда персонаж приближается к границам экрана. Мне нужно сделать этот фоновый переход как плавную анимацию. Кроме того, мне нужно иметь функцию увеличения / уменьшения масштаба, желательно анимированную. Некоторые изображения на экране будут статичными (здания), а некоторые потребуют анимации (ходьба персонажа).

Какой дизайн самый лучший:

  1. Использование Базовая графика в сочетании с классы "спрайт" - отображение UIImage спрайта с CGContextDrawImage
  2. Использование UIKit - создать UIImageview для хранения каждого изображение и добавить их в качестве подпредставлений в приложение одного вида
  3. Использование OpenGL Проект ES

Вариант 1) оказался очень медленным. Кажется, что CoreGraphics не предназначен для отображения изображений в игровом цикле. Но, может быть, есть способ сделать это эффективным? Может, как-нибудь совместить это с Core Animation?

Вариант 2) - мой текущий выбор. Я надеюсь, что представление кеширует изображение, которое оно содержит, и, таким образом, будет более эффективным, чем CG. Но будет ли анимация, предоставляемая UIImageview, удовлетворительной? Я думаю, что представления не должны быть добавлены все сразу, а скорее созданы и добавлены (удалены?) Динамически, когда фон перемещается. Это хорошая идея?

Вариант 3) , вероятно, даст наилучший контроль над изображениями, но это выглядит довольно затратно Мне нужно только отображать изображения, а не векторную графику. Кроме того, я новичок в программировании на Mac и не хочу зацикливаться на какой-то сложной технологии.

Я ценю любые советы, спасибо:)

Ответы [ 3 ]

5 голосов
/ 20 января 2011

Я настоятельно рекомендую Cocos2D , так как я сделал свою собственную разработку здесь, в моем блоге. Это было действительно легко сделать.Я следую учебникам Рэя Вендерлиха , и он предоставляет отличные инструменты для выполнения всего, что вы описываете.

2 голосов
/ 20 января 2011

Вы спросили: «Фон будет большим (до 10 раз больше размера экрана), поэтому одновременно будет отображаться только часть фонового файла».

Система мозаичных изображений очень мощная и быстрая. Если вы используете карты Google, вы увидите и пример мозаичного изображения. Прокрутите страницу до нового объекта и появятся блоки. В локальном приложении вы можете взять ваше изображение, которое в 10 раз больше размера экрана, и обрезать его до фрагментов, скажем, 100 на 100 пикселей, и каждый экран будет загружать только отображаемые плитки. Когда пользователь перемещается, загружаются только нужные плитки. Это экономит память и резко повышает скорость. Это основная причина, по которой таблицы могут летать, загружаются только ячейки на один экран, так как они прокручиваются с экрана, память используется для следующей ячейки.

1 голос
/ 20 января 2011

Если вариант 2 достаточно эффективен для ваших нужд, я бы придерживался этого - это такая же простая система, как вы получите на iPhone, и отлично подходит для очень простой графики. Связанная опция, которая может принести вам немного скорости, использует CALayers для реализации графики. CALayers почти так же просты в использовании, но немного более легки, чем UIViews (в некотором смысле вы можете рассматривать UIViews как просто оболочки для CALayers с дополнительными издержками для управления такими вещами, как сенсорные события и т. Д.)

Если вам интересно, я бы прочитал Руководство по программированию Core Animation (я бы предоставил ссылку, но я думаю, что моя репутация слишком низкая, но Google должен отследить ее для вас). Базовая анимация - это большая тема, и она может быть довольно сложной, но если вы просто используете слои (то есть не анимационные части), это не так уж плохо. Вот быстрый пример, чтобы дать вам представление о том, как выглядит использование слоев:

// 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];

Так что в основном это похоже на работу с представлениями, но с некоторой добавленной производительностью (и иногда головной болью).

P.S. - Следует помнить одну вещь: если вы вносите изменения в свойство слоя, которое является анимируемым (например, положение, непрозрачность и т. Д.), Core Animation будет неявно анимировать его (например, если вы напишите imageLayer.position = somePoint; слой анимируется в эта позиция, а не ее установка сразу. Есть простые способы обойти это, но это тема для другого вопроса / ответа.

...