Создание кроссплатформенного сенсорного менеджера c ++. Передача объектов Objective-C в c ++ задействованный код - PullRequest
0 голосов
/ 09 сентября 2018

Поэтому я пытаюсь создать класс мультитач, который можно использовать кроссплатформенно (iOS, Android и т. Д.). Цель состоит в том, что движку не нужно знать платформу для получения обновленных данных касания.

Сейчас я занимаюсь общим дизайном и специально внедряю сторону iOS. Сторона Android и т. Д. Появится намного позже.

Для этого я пытаюсь использовать шаблон делегирования. На самом деле есть только два элемента интерфейса.

Существует метод обновления (float dt), который будет вызываться в каждом новом кадре с помощью dt. Затем этот метод вернет структуру информации о всех касаниях в формате c ++ или, возможно, установит свойство, к которому можно получить доступ. Я не уверен.

На стороне iOS единственной другой функцией, которую необходимо вызывать извне, является touchchesDown, который передает NSSet * UITouches и UIView, в котором они находятся.

Вот дизайн, с которым я работаю до сих пор

Multitouch\
    PlatformTouchManager.h (C++ Abstract Class with Update)
    iOS\
        iOSMultiTouch.cpp (Objective-c++)
        iOSMultiTouch.hpp (Objective-c++ Class inheriting PlatformTouchManager)
    MultTouch.cpp (C++)
    MultiTouch.h (C++ class)

Вот PlatformTouchManager.h

#define MAX_TOUCHES 5
#define PLATFORM_iOS
//#define PLATFORM_ANDROID

class PlatformTouchManager {
public:
    // Update All The Events
    virtual void update(float time) = 0;
};

И, конечно, Multitouch.h

class Multitouch {
private:
    PlatformTouchManager* manager;
public:
    Multitouch() {
#ifdef PLATFORM_iOS
        manager = new iOSMultiTouch();
#endif
    }
    ~Multitouch() {
        delete manager;
    }

    Multitouch(const Multitouch&) = delete;

    void update(float dt);

    void* getManager() {
        return manager;
    }
};

И, наконец, iOSMultiTouch.hpp

#include <stdio.h>
#include "../PlatformTouchManager.h"
#include <set>
#import <UIKit/UIKit.h>

class iOSMultiTouch: public PlatformTouchManager {
public:
    // Initializer
    iOSMultiTouch();

    // Destructor
    ~iOSMultiTouch();

    // Update All The Events
    void update(float time);

    // Touch Down Set
    void touchesDown(id<NSSet> set, id<UIView> view);
};

Может быть, стоит отметить, что этот код включен в MultiTouch.h (c ++) и в мой собственный код представления, который является target-c ++.

Таким образом, кроссплатформенный движок создает объект Multitouch, сохраняет ссылку и каждый кадр вызывает обновление.

Я предполагаю, что тогда iOS UIView получит Multitouch* от кроссплатформенного движка. Приведите его к объекту iOSMultiTouch* и вызовите touchesDown:(NSSet *)touches withEvent:(IUView *)view для делегата.

У меня серьезные проблемы с этим.

Если я пытаюсь импортировать UIKit внутри iOSMUltiTouch.hpp, это вызывает хаос сборки, поэтому может показаться, что я могу импортировать его только внутри исходного файла. Поэтому мой метод приземления должен быть недействительным touchesDown(void* touches, void* view);.

Затем проблема заключается в том, чтобы реализовать это, так как когда я пытаюсь привести эти void* указатели в их соответствующие типы, я получаю предупреждение Cast of C pointer type void* to objective-c pointer type id requires a bridged cast.

Я понимаю, что здесь есть некоторые проблемы с ARC, так как ARC не может отслеживать такие вещи при преобразовании в примитивный указатель, но как мне обойти это?

iOSTouchManager действительно должен сохранять четкую ссылку на объекты UITouch вплоть до того момента, когда после касания отпущено касание.

Как мне реализовать это приведение? Есть ли другой способ, которым я должен проектировать свои классы, чтобы сделать это легче?

Для тех из вас, кому было интересно, это ошибки, которые появляются, если вы импортируете uikit из iOSMultiTouch.hpp

Parse Issue

Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:512:1: Expected unqualified-id
../Multitouch/MultiTouch.cpp:9:10: In file included from ../Multitouch/MultiTouch.cpp:9:
../Multitouch/MultiTouch.h:15:10: In file included from ../Multitouch/MultiTouch.h:15:
../Multitouch/iOS/iOSMultiTouch.hpp:15:9: In file included from ../Multitouch/iOS/iOSMultiTouch.hpp:15:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:

Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSZone.h:9:1: Expected unqualified-id
../Multitouch/MultiTouch.cpp:9:10: In file included from ../Multitouch/MultiTouch.cpp:9:
../Multitouch/MultiTouch.h:15:10: In file included from ../Multitouch/MultiTouch.h:15:
../Multitouch/iOS/iOSMultiTouch.hpp:15:9: In file included from ../Multitouch/iOS/iOSMultiTouch.hpp:15:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:10:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:10:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSArray.h:5:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSArray.h:5:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObject.h:8:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObject.h:8:

Semantic Issues

Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:514:9: Unknown type name 'NSString'
../Multitouch/MultiTouch.cpp:9:10: In file included from ../Multitouch/MultiTouch.cpp:9:
../Multitouch/MultiTouch.h:15:10: In file included from ../Multitouch/MultiTouch.h:15:
../Multitouch/iOS/iOSMultiTouch.hpp:15:9: In file included from ../Multitouch/iOS/iOSMultiTouch.hpp:15:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:
Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:9: In file included from Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:

1 Ответ

0 голосов
/ 12 сентября 2018

Задача

Вы получили тонну ошибок, потому что вы импортировали платформу iOS (UIKit) в файл C ++ (iOSMultiTouch.cpp).

Решение

Для файлов реализации, в которые необходимо импортировать платформы iOS, вы должны использовать .mm вместо .cpp расширения. .cpp является расширением C ++, а не расширением Objective-C ++.

В этом случае вам необходимо переименовать iOSMultiTouch.cpp в iOSMultiTouch.mm. Замените void * на указатели Objective-C, и он будет работать как положено.


Utils.h не будет ничего связывать с Objective-C и может использоваться где угодно. Utils.mm используется для работы с деталями Objective-C.

Utils.h

PlatformTouchManager* GetIOSTouchManager();

Utils.mm

#include "Utils.h"
#include "iOSMultiTouch.hpp"

PlatformTouchManager* GetIOSTouchManager() {
  return new iOSMultiTouch();
};

Multitouch.h

#include "Utils.h"
// Other include

class Multitouch {
  private:
  PlatformTouchManager* manager;
  public:
  Multitouch() {
#ifdef PLATFORM_iOS
    manager = GetIOSTouchManager();
#endif
  }
  ~Multitouch() {
    delete manager;
  }

  Multitouch(const Multitouch&) = delete;

  void update(float dt);

  PlatformTouchManager* getManager() {
    return manager;
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...