首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个跨平台的c++触摸管理器。在c++中传递objects对象涉及代码。

创建一个跨平台的c++触摸管理器。在c++中传递objects对象涉及代码。
EN

Stack Overflow用户
提问于 2018-09-09 19:51:27
回答 1查看 341关注 0票数 2

因此,我正在尝试创建一个可以跨平台使用的多点触摸类(iOS、Android等)。目标是引擎不需要知道平台来获得更新的触摸数据。

现在,我正在进行一般设计,并且正在专门实现iOS端。Android等方面将在很晚的时候到来。

为了做到这一点,我尝试使用委托模式。实际上只有两个接口项。

在每个新帧上都要调用一个方法更新(Float),然后这个方法将返回一个关于所有触点的c++结构,或者设置一个可以访问的属性。我不确定。

在iOS方面,需要从外部调用的唯一其他函数是touchesDown,它传入UITouches的NSSet*和它们所在的UIView。

这是我目前正在进行的设计。

代码语言:javascript
复制
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

代码语言:javascript
复制
#define MAX_TOUCHES 5
#define PLATFORM_iOS
//#define PLATFORM_ANDROID

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

当然还有多重触控

代码语言:javascript
复制
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

代码语言:javascript
复制
#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++)和目标-c++的原生视图代码包含的。

因此,跨平台引擎创建了一个多点触摸对象,保存了一个引用,并更新了每个帧调用。

我想象着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对象的强烈引用,直到框架释放之后。

如何实现此强制转换?有什么不同的方法,我应该设计我的课程,使这更容易吗?

对于那些想知道这些错误的人来说,如果您从iOSMultiTouch.hpp导入uikit,就会出现这些错误。

代码语言:javascript
复制
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:
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 07:14:26

问题

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

解决方案

对于需要导入iOS框架的实现文件,您必须使用.mm而不是.cpp扩展。.cpp是C++扩展,而不是目标-C++扩展.

在这种情况下,需要将iOSMultiTouch.cpp重命名为iOSMultiTouch.mm。用Objective指针替换void *,它将按预期工作。

Utils.h将保留与目标C无关的内容,并且可以在任何地方使用.Utils.mm用于与Objective部件一起工作.

Utils.h

代码语言:javascript
复制
PlatformTouchManager* GetIOSTouchManager();

Utils.mm

代码语言:javascript
复制
#include "Utils.h"
#include "iOSMultiTouch.hpp"

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

Multitouch.h

代码语言:javascript
复制
#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;
  }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52248165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档