c++ - 尝试获取用户输入以在 Cocos2D-X 中移动精灵
问题描述
我试图让 WASD 的用户输入在 Cocos2D-X 中移动精灵。我很确定我做的一切都是正确的,但它给了我这个错误: 表达式必须是一个可修改的左值。
这是我的代码(注意:我是 Cocos2D-X 的新手,所以可能有点乱)
float playerX = visibleSize.width / 2 + origin.x;
float playerY = visibleSize.height / 2 + origin.y;
auto player = Sprite::create("sprites/player.png");
if (player == nullptr)
{
problemLoading("'sprites/player.png'");
}
else
{
// position the sprite on the center of the screen
player->setPosition(Vec2(playerX, playerY));
// add the sprite as a child to this layer
this->addChild(player, 0);
}
// Keyboard events
auto keyboardListener = EventListenerKeyboard::create();
keyboardListener->onKeyPressed = [playerX, playerY](EventKeyboard::KeyCode keyCode, Event* event)
{
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_W:
playerY += 5.0f;
break;
case EventKeyboard::KeyCode::KEY_A:
playerX -= 5.0f;
break;
case EventKeyboard::KeyCode::KEY_S:
playerY -= 5.0f;
break;
case EventKeyboard::KeyCode::KEY_D:
playerX += 5.0f;
break;
case EventKeyboard::KeyCode::KEY_ESCAPE:
Director::getInstance()->end();
break;
}
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardListener, this);
有四个错误,它们都指向不同的玩家X/Y +=/-= 5.0f
解决方案
尝试使用mutable
说明符(它允许 lambdas 主体修改通过复制捕获的对象,并调用它们的非常量成员函数):
float playerX = visibleSize.width / 2 + origin.x;
float playerY = visibleSize.height / 2 + origin.y;
auto player = Sprite::create("sprites/player.png");
if (player == nullptr)
{
problemLoading("'sprites/player.png'");
}
else
{
// position the sprite on the center of the screen
player->setPosition(Vec2(playerX, playerY));
// add the sprite as a child to this layer
this->addChild(player, 0);
}
// Keyboard events
auto keyboardListener = EventListenerKeyboard::create();
// add mutable specifier
keyboardListener->onKeyPressed = [playerX, playerY, player](EventKeyboard::KeyCode keyCode, Event* event) mutable
{
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_W:
playerY += 5.0f;
break;
case EventKeyboard::KeyCode::KEY_A:
playerX -= 5.0f;
break;
case EventKeyboard::KeyCode::KEY_S:
playerY -= 5.0f;
break;
case EventKeyboard::KeyCode::KEY_D:
playerX += 5.0f;
break;
case EventKeyboard::KeyCode::KEY_ESCAPE:
Director::getInstance()->end();
break;
}
player->setPosition(playerX, playerY);
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardListener, this);
推荐阅读
- mysql - Yii2 gridview搜索表单过滤器来自另一个表结果
- java - 如何修复 JSONException:索引 0 超出范围 [0..0)?
- php - php codeigniter中会话数据的未定义索引
- c# - 对齐 RichTextBox 中的单行
- php - 如果使用 PHPUnit 测试执行的 Controller 中有设置 Session 的进程,会报错,会失败
- python - 从用户获取浮点输入,直到输入负数,然后计算总和、平均值、最大值和最小值,不包括负数
- html - 有没有办法不直接在 HTML 中包含结构化标记?
- c - 我有一个关于打印的问题。“EXC_BAD_ACCESS”
- sql - 在 SQL 中,如何检查超过 1 个值的结果的空条件?
- cassandra - 无法从 ResultSet 中获取 Row