c++ - 创建跨平台 C++ 触摸管理器。在c++中传递Objective-c对象涉及代码

标签 c++ objective-c xcode uikit

所以我试图创建一个可以跨平台(iOS、Android 等)使用的多点触控类。目标是引擎不需要了解平台即可获取更新的触摸数据。

现在我正在做总体设计,并具体实现iOS端。 Android 等方面将会晚得多。

为了做到这一点,我尝试使用委托(delegate)模式。实际上只有两个界面项。

有一个方法 update(float dt) 将在带有 dt 的每个新帧上调用。然后,此方法将返回有关所有触摸的信息的 C++ 结构,或者可能设置一个可以访问的属性。我不确定。

在 iOS 端,唯一需要从外部调用的其他函数是 TouchDown,它传入 UITouches 及其所在 UIView 的 NSSet*。

这是我迄今为止正在使用的设计

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++) 和我的 native View 代码(objective-c++)中。

跨平台引擎因此创建一个多点触控对象,保留引用并且每个帧都调用更新。

我想象iOS UIView将从跨平台引擎获取Multitouch*。将其转换为 iOSMultiTouch* 对象并在委托(delegate)上调用 touchesDown:(NSSet *)touches withEvent:(IUView *)view

我在执行此操作时遇到了严重问题。

如果我尝试在 iOSMUltiTouch.hpp 中导入 UIKit,则会导致构建困惑,因此我只能将其导入源文件中。因此,我的着陆方法需要为 void touchesDown(void* attempts, void* view);。

问题在于实现这一点,因为当我尝试将这些 void* 指针转换为正确的类型时,我收到警告Cast of C point type void* to Objective-c point type id 需要桥接转换

我知道这里存在一些 ARC 问题,因为当转换为原始指针时 ARC 无法跟踪此类内容,但我如何解决这个问题?

iOSTouchManager 确实需要保留对 UITouch 对象的强引用,直到触摸释放的帧之后。

我如何实现这个转换?我是否应该采用不同的方式来设计我的类以使这变得更容易?

对于那些想知道如果从 iOSMultiTouch.hpp 导入 uikit 时会弹出的错误的人

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:

最佳答案

问题

由于您在 C++ 文件 (iOSMultiTouch.cpp) 中导入了 iOS 框架 (UIKit),因此出现了大量错误。

解决方案

对于需要导入 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;
  }
};

关于c++ - 创建跨平台 C++ 触摸管理器。在c++中传递Objective-c对象涉及代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52248165/

相关文章:

c++ - const 和非 const getter : C2248: cannot access private member declared in class

C++/CX : Converting from IVector<T>^ to Vector<T>^

c++ - 如何禁用QTableView的整列选择?

ios - 使用 NSValue 包装一个 C 指针

ios - 无法子类化 UILabel : Unrecognized selector sent to UILabel

c++ - 所有者绘制的复选框

ios - iOS 9.1 中的希伯来语文本没有从右到左显示?

objective-c - 在 iOS 5 中获取最后一个重定向的 url?

iphone - SQLite 文件未添加到 bundle 资源中

ios - 如何在 Xcode 中删除空白并将背景扩展到全屏?