- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 cocos2d-x 3.71 跨平台应用程序(ios、android、windows10),我在实现触摸和按住检测时遇到了问题仅在 Android 上(ios 和 windows 工作正好)。我已将其原因归结为这样一个事实,即当按住触摸而不移动时,onTouchMoved() 会不断触发。我已经合并了一个解决方法,但这似乎是一个错误,我想知道是否有人有任何想法。
我在基于 cocos2d-x HelloWorld 示例的最小应用程序中重现了该问题。我只是从 cocos2d::Node (testNode) 派生了一个类并创建了它,并将其作为子级添加到 HelloWorldScene。在 testNode 中,我覆盖了更新函数并使用 onTouchBegan() 中的 scheduleUpdate() 对其进行调度。在 update() 函数中,我简单地计算时间直到达到 0.25 秒,然后使用 unscheduleUpdate() 禁用更新。我在 onTouchMoved() 中调用了另一个 unscheduleUpdate() 来停止计算保持时间,以防触摸移动。问题是,在 Android 上,onTouchMoved() 在触摸静止不动时开始不断触发。
testNode.h:
#pragma once
#include "cocos2d.h"
class testNode : public cocos2d::Node
{
public:
testNode() {}
~testNode() {}
CREATE_FUNC(testNode);
virtual bool init();
virtual void update(float dt);
bool onTouchBegan(cocos2d::Touch*, cocos2d::Event*);
void onTouchMoved(cocos2d::Touch*, cocos2d::Event*);
void onTouchEnded(cocos2d::Touch*, cocos2d::Event*);
void onTouchCancelled(cocos2d::Touch*, cocos2d::Event*);
private:
cocos2d::DrawNode* d;
int id;
bool touchIsDown;
float touchTime;
cocos2d::Label *messageLabel;
cocos2d::Vec2 center;
};
测试节点.cpp:
#include "testNode.h"
USING_NS_CC;
bool testNode::init()
{
if (!Node::init())
{
return false;
}
setContentSize(Size(50, 50));
Size size = Director::getInstance()->getWinSize();
Size visibleSize = Director::getInstance()->getVisibleSize();
setPosition(Vec2(size.width / 2.0f, size.height / 2.0f));
center.x = size.width / 2.0f;
center.y = size.height / 2.0f;
d = DrawNode::create();
addChild(d, 10);
d->drawCircle(Vec2(0, 0), 50, (float)M_PI * 2, 50, false, Color4F::RED);
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->setSwallowTouches(true);
touchListener->onTouchBegan = CC_CALLBACK_2(testNode::onTouchBegan, this);
touchListener->onTouchEnded = CC_CALLBACK_2(testNode::onTouchEnded, this);
touchListener->onTouchMoved = CC_CALLBACK_2(testNode::onTouchMoved, this);
touchListener->onTouchCancelled = CC_CALLBACK_2(testNode::onTouchCancelled, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
messageLabel = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 18);
Vec2 origin = Director::getInstance()->getVisibleOrigin();
messageLabel->setPosition(Vec2(0,0));
addChild(messageLabel, 1);
return true;
}
void testNode::update(float deltaTime)
{
// When update is scheduled with scheduleUpdate(), this will increment the touchtimer
// used for differenciating different touch actions.
if (touchIsDown)
{
touchTime += deltaTime;
if (touchTime > 0.25)
{
unscheduleUpdate();
}
}
}
bool testNode::onTouchBegan(Touch* touch, Event* event)
{
Vec2 touchPoint = touch->getLocation();
float startDistFromCenter = center.getDistance(touchPoint);
touchTime = 0.0f;
// Handle touch only if inside the radius of the circle
if (startDistFromCenter <= 50)
{
// Track how long the touch is held without moving or releasing
touchIsDown = true;
scheduleUpdate();
return true;
}
else
return false;
}
void testNode::onTouchMoved(Touch* touch, Event* event)
{
Vec2 pos = touch->getLocation();
log("moving...pos = %f , %f", pos.x, pos.y);
touchIsDown = false;
unscheduleUpdate();
}
void testNode::onTouchEnded(Touch* touch, Event* event)
{
touchIsDown = false;
unscheduleUpdate();
log("Hold Time: %f", touchTime);
}
void testNode::onTouchCancelled(Touch* touch, Event* event)
{
}
触摸/按住事件的典型输出:
09-23 23:42:39.852: D/cocos2d-x debug info(32508): startDistFromCenter: 33.753014 09-23 23:42:39.902: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.902: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.920: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.935: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.969: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.969: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.989: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:39.999: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:40.027: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:40.043: D/cocos2d-x debug info(32508): moving...pos = 246.732849 , 126.925316 09-23 23:42:40.043: D/cocos2d-x debug info(32508): Hold Time: 0.042597
如您所见,该位置实际上没有在移动....这是怎么回事?
作为引用,我在 Windows 10、Visual Studio 2015、cocos2d-x 3.71 上开发,并在 Android 5.1.1(OnePlusOne 手机)上进行测试
最佳答案
我测试了你的代码,这个问题与 android lollipop 有关。在 kitkat 上一切正常(测试设备 Huawei Ascend P7 android 4.4.2):
09-24 11:51:25.351: D/cocos2d-x debug info(1058): Hold Time: 0.252129
09-24 11:51:27.361: D/cocos2d-x debug info(1058): Hold Time: 0.251298
09-24 11:51:28.711: D/cocos2d-x debug info(1058): Hold Time: 0.252115
09-24 11:51:30.101: D/cocos2d-x debug info(1058): Hold Time: 0.251961
我也在 Lollipop 设备(LG,但我不记得具体型号)上试过了,就像你说的那样。 spam of touch 以相同的位置移动。
作为一种变通方法,您可以像 Alex G 所说的那样做,或者记住最后一个位置(在触摸开始时记住它)并忽略具有完全相同位置的事件。
顺便说一句,我正在使用 Mac OS X Yosemite 和 Cocos2d-x 3.8。
你应该在 cocos2d-x github 页面上发起一个问题。
关于android - Cocos2d-x onTouchMoved 在没有移动发生时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32753149/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!