Многослойная обработка касания в Cocos2d

Я был занят несколько дней, пытаясь понять, как обрабатывать прикосновения в моем проекте Cocos2d. Ситуация немного иная, чем обычно. У меня есть несколько разных игровых слоев, на которых есть элементы, которыми мне нужно управлять касанием:

  • ControlLayer: удерживает элементы управления игрой. (движение, кнопка действия). Этот слой находится сверху.
  • GameplayLayer: Удерживает игровые объекты. (CCSprites). Этот слой находится непосредственно под ControlLayer.

Теперь мои штрихи отлично работают в 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 v (10) ?

Я вижу, что vector v (10) в локальной функции приводит к если переменные равны 0, но я не уверен, что это только из-за моего компилятора или это фиксированное ожидаемое поведение.

43
задан Community 23 May 2017 в 10:31
поделиться