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

现在,我正在做一般设计,并专门实现iOS方面。 Android等方面将在以后推出。

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

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

在iOS端,唯一需要从外部调用的其他函数是touchesDown,该函数传入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++)和我的本机 View 代码(目标为c++)中。

跨平台引擎因此会创建一个Multitouch对象,保持一个引用,并且每个框架调用都会更新。

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

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

如果我尝试在iOSMUltiTouch.hpp中导入UIKit,则会导致构建困惑,因此看来我只能将其导入源文件中。因此,我的触地方法必须为空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对象保持强烈的引用,直到释放框架之后。

如何执行此强制转换?我应该以其他方式设计类(class)以使其变得更容易吗?

对于那些想知道这些是弹出错误的人,应该从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:

最佳答案

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

对于需要导入iOS框架的实现文件,您必须使用.mm而不是.cpp扩展名。 .cpp是C++扩展,不是Objective-C++扩展。
在这种情况下,您需要将iOSMultiTouch.cpp重命名为iOSMultiTouch.mm。用Objective-C指针替换void *,它将按预期工作。
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;
  }
};

08-27 21:36