Я был занят несколько дней, пытаясь понять, как обрабатывать прикосновения в моем проекте Cocos2d. Ситуация немного иная, чем обычно. У меня есть несколько разных игровых слоев, на которых есть элементы, которыми мне нужно управлять касанием:
Теперь мои штрихи отлично работают в ControlLayer, я могу перемещать своего игрового персонажа, заставлять его прыгать и делать другие глупости. Тем не менее, я не могу понять, как реализовать штрихи к некоторым из моих CCSprites.
Информация, которую я собрал до сих пор, заставляет меня думать, что мне нужно получить весь свой сенсорный ввод с уровня управления. Затем мне нужно каким-то образом «каскадировать» информацию касания в GameplayLayer, чтобы я мог обрабатывать ввод там. Другой вариант - получить информацию CGRect из моих спрайтов, каким-то образом создав массив с указателями на объекты, которые должны быть осязаемы. Я должен иметь возможность использовать эту информацию в ControlLayer для проверки каждого элемента в этом списке, касался ли этот элемент.
Какой вариант лучше всего сделать, и как мне это реализовать? Я как бы новичок в программировании с использованием какао и Objective C, поэтому я не совсем уверен, какой вариант лучше всего подходит для этого языка и как получить доступ к информации CGRect спрайтов ([mySpriteName boundingBox]) в другом классе, а затем в слое. визуализировано в.
На данный момент я уверен, что единственный способ заставить его работать - это создать дубликаты CGRects для каждой позиции CCSprite, чтобы я мог их проверить, но я знаю, что это неправильный способ делать это.
Что у меня есть (для проверки), так это:
internal class InvariantChecker : IDisposable
{
private IContractObject obj;
public InvariantChecker(IContractObject obj)
{
this.obj = obj;
}
public void Dispose()
{
if (!obj.CheckInvariants())
{
throw new ContractViolatedException();
}
}
}
internal class Foo : IContractObject
{
private int DoWork()
{
using (new InvariantChecker(this))
{
// do some stuff
}
// when the Dispose() method is called here, we'll throw if the work we
// did invalidated our state somehow
}
}
Это используется для обеспечения относительно безболезненной проверки согласованности состояния во время выполнения. Я не писал этого, но поначалу это казалось довольно крутой идеей.
Однако проблема возникает, если Foo.DoWork
генерирует исключение. Когда генерируется исключение, вполне вероятно, что мы находимся в несогласованном состоянии, что означает, что InvariantChecker
также вызывает , скрывая исходное исключение. Это может происходить несколько раз, поскольку исключение распространяется вверх по стеку вызовов, с InvariantChecker
в каждом кадре, скрывающим исключение из кадра ниже. Чтобы диагностировать проблему, мне пришлось отключить бросок в InvariantChecker
, и только тогда я смог увидеть исходное исключение.
Это явно ужасно. Однако, Какой конструктор по умолчанию для int ? Что если у меня глобально объявлен vector
?
Я вижу, что vector
в локальной функции приводит к если переменные равны 0, но я не уверен, что это только из-за моего компилятора или это фиксированное ожидаемое поведение.