- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一段时间以来,我一直在尝试阅读此文件,并尝试了所有我能想到的方法。我将文件放在我的 Products 文件夹和我的资源文件夹中并包含 (ResourcePath + "File.cfg.txt"),但都没有用。如果有人能告诉我我遗漏了什么以及将此文件放在哪里以读取它,我将不胜感激。我再次使用 Xcode 和 SFML 库。
key .cfg.txt
窗口关闭 0:0
全屏切换 5:89
移动 9:0 24:38
/////////////////////////////////////
.CPP
#include "EventManager.h"
using namespace std;
EventManager::EventManager(): m_hasFocus(true){ LoadBindings(); }
EventManager::~EventManager(){
for (auto &itr : m_bindings){
delete itr.second;
itr.second = nullptr;
}
}
bool EventManager::AddBinding(Binding *l_binding){
if (m_bindings.find(l_binding->m_name) != m_bindings.end())
return false;
return m_bindings.emplace(l_binding->m_name, l_binding).second;
}
bool EventManager::RemoveBinding(std::string l_name){
auto itr = m_bindings.find(l_name);
if (itr == m_bindings.end()){ return false; }
delete itr->second;
m_bindings.erase(itr);
return true;
}
void EventManager::SetFocus(const bool& l_focus){ m_hasFocus = l_focus; }
void EventManager::HandleEvent(sf::Event& l_event){
// Handling SFML events.
for (auto &b_itr : m_bindings){
Binding* bind = b_itr.second;
for (auto &e_itr : bind->m_events){
EventType sfmlEvent = (EventType)l_event.type;
if (e_itr.first != sfmlEvent){ continue; }
if (sfmlEvent == EventType::KeyDown || sfmlEvent == EventType::KeyUp){
if (e_itr.second.m_code == l_event.key.code){
// Matching event/keystroke.
// Increase count.
if (bind->m_details.m_keyCode != -1){
bind->m_details.m_keyCode = e_itr.second.m_code;
}
++(bind->c);
break;
}
} else if (sfmlEvent == EventType::MButtonDown || sfmlEvent == EventType::MButtonUp){
if (e_itr.second.m_code == l_event.mouseButton.button){
// Matching event/keystroke.
// Increase count.
bind->m_details.m_mouse.x = l_event.mouseButton.x;
bind->m_details.m_mouse.y = l_event.mouseButton.y;
if (bind->m_details.m_keyCode != -1){
bind->m_details.m_keyCode = e_itr.second.m_code;
}
++(bind->c);
break;
}
} else {
// No need for additional checking.
if (sfmlEvent == EventType::MouseWheel){
bind->m_details.m_mouseWheelDelta = l_event.mouseWheel.delta;
} else if (sfmlEvent == EventType::WindowResized){
bind->m_details.m_size.x = l_event.size.width;
bind->m_details.m_size.y = l_event.size.height;
} else if (sfmlEvent == EventType::TextEntered){
bind->m_details.m_textEntered = l_event.text.unicode;
}
++(bind->c);
}
}
}
}
void EventManager::Update(){
if (!m_hasFocus){ return; }
for (auto &b_itr : m_bindings){
Binding* bind = b_itr.second;
for (auto &e_itr : bind->m_events){
switch (e_itr.first){
case(EventType::Keyboard) :
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key(e_itr.second.m_code))){
if (bind->m_details.m_keyCode != -1){
bind->m_details.m_keyCode = e_itr.second.m_code;
}
++(bind->c);
}
break;
case(EventType::Mouse) :
if (sf::Mouse::isButtonPressed(sf::Mouse::Button(e_itr.second.m_code))){
if (bind->m_details.m_keyCode != -1){
bind->m_details.m_keyCode = e_itr.second.m_code;
}
++(bind->c);
}
break;
case(EventType::Joystick) :
// Up for expansion.
break;
default:
break;
}
}
if (bind->m_events.size() == bind->c){
auto callItr = m_callbacks.find(bind->m_name);
if(callItr != m_callbacks.end()){
callItr->second(&bind->m_details);
}
}
bind->c = 0;
bind->m_details.Clear();
}
}
void EventManager::LoadBindings(){
std::string delimiter = ":";
std::ifstream bindings;
bindings.open("keys.cfg");
if (!bindings.is_open()){ std::cout << "! Failed loading keys.cfg." << std::endl; return; }
std::string line;
while (std::getline(bindings, line)){
std::stringstream keystream(line);
std::string callbackName;
keystream >> callbackName;
Binding* bind = new Binding(callbackName);
while (!keystream.eof()){
std::string keyval;
keystream >> keyval;
int start = 0;
int end = keyval.find(delimiter);
if (end == std::string::npos){ delete bind; bind = nullptr; break; }
EventType type = EventType(stoi(keyval.substr(start, end - start)));
int code = stoi(keyval.substr(end + delimiter.length(),
keyval.find(delimiter, end + delimiter.length())));
EventInfo eventInfo;
eventInfo.m_code = code;
bind->BindEvent(type, eventInfo);
}
if (!AddBinding(bind)){ delete bind; }
bind = nullptr;
}
bindings.close();
}
最佳答案
问题是您必须复制 bundle 中的各个文件,并且只有 objective-c 可以为您提供目标设备上文件的全名。
为了克服这个问题,制作一个 .mm
文件并在其中放置一个 c++ trampoline 函数,它会为您提供完整路径(请参见下面的代码)。
一个陷阱可能是您必须确保像 "keys.cfg"
这样的配置文件和文本文件实际上被复制到包中。选择项目中的相应文件并打开属性检查器;确保 - 已选中“目标成员资格”中的相应目标。
// File: myFileNameProvider.mm
#import <Foundation/Foundation.h>
#include <iostream>
std::string GetTextureFilename(const char *name)
{
NSString *nameAsNSString = [NSString stringWithUTF8String:name];
NSString *fullName = [[NSBundle mainBundle]
pathForResource:nameAsNSString ofType: nil];
if (fullName)
return std::string([fullName UTF8String]);
else
return "";
}
然后,在您的 CPP 代码中,声明 std::string GetTextureFilename(const char *name)
的签名,并在打开文件之前调用它获取完整路径:
// MyCPPFile.cpp
#include <iostream>
#include <fstream>
// declaration:
std::string GetTextureFilename(const char *name);
void myC_Func {
std::string fullPath = GetTextureFilename("keys.cfg");
std::ifstream bindings;
bindings.open(fullPath.c_str());
if (!bindings.is_open()) {
std::cout << "! Failed loading keys.cfg." << std::endl;
}
...
}
关于c++ - 如何读入 .cfg.txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41656269/
我有一个Java项目,正在使用hibernate。这里的事情是我想将hibernate.cfg.xml文件放在“src”文件夹之外,但是当我配置该文件时,它显示FileNotFoundExceptio
我想了解 #[cfg(test)] 和 #[cfg(feature = "test")] 之间的区别,最好通过示例进行演示。 最佳答案 #[cfg(test)] 标记仅当启用 test 配置选项时才编
如果我启动 cppcheck,我会收到以下错误: cppcheckListLib.c(信息)无法加载 std.cfg。您的 Cppcheck 安装已损坏,请重新安装。 Cppcheck 二进制文件是在
我想了解 #[cfg(test)] 和 #[cfg(feature = "test")] 之间的区别,最好通过示例进行演示。 最佳答案 #[cfg(test)] 标记仅当启用 test 配置选项时才编
当我来的时候,我正在寻找一个很好的解决方法来保持我的 .tmux.conf 文件在系统之间保持一致(我有 OS X 和 Ubuntu,它们有不同的复制/粘贴支持技术)在这条提供解决方案的评论中:htt
所以我有这个主 package Hibernate; import java.util.List; import org.hibernate.Session; import org.hibernate
我的项目根文件夹中有hibernate.cfg.xml文件。 如果我运行的应用程序包含: SessionFactory sessionFactory = new Configuration().con
我收到上述错误。我的 Web 应用程序中已有 xml 文件 hibernate.cfg.xml。除此之外,我在 WebINF lib 文件夹下有 hibernate 所需的完整 jar 文件。 这是完
我在 IntelliJ IDE 中的 hibernate.cfg.xml 有问题。 这是我的 hibernate 配置文件: org.postgresql
我正在尝试使用 pgadmin3 连接到 ubuntu 中的 Postgresql9.1。我的 Pgadmin3 GUI 工具没有提供任何通过右键单击数据库来创建表的选项,但它在我看到的一些视频中可用
您好,我的项目 CFG 文件中的路径列表太长,我如何定义像 $(BDS) 这样的路径快捷方式谢谢 最佳答案 “选项”对话框 ->“环境选项”->“环境变量”。该页面有一个“用户覆盖”部分。这就是您定义
对于 LR 解析器,FIRST 集定义如下 ( source ): FIRST(A) is the set of terminals which can appear as the first ele
我有一种用 CFG 表示的相当简单的语言。 S → A z A → A y A | A x A | A w | v 因为有左递归,递归下降解析器不会削减它。但是,我还需要找到所有可能的解释
Hibernate 的常用配置文件主要分为 2 种:核心配置文件(hibernate.cfg.xml)和映射文件(Xxx.hbm.xml),它们主要用于配置数据库连接、事务管理、Hibernate 本
出于测试目的,我需要 cfg 始终为真/假。对于 true 我使用 #[ cfg( target_pointer_width = "64") ] ... 但显然不够通用。表达 cfg 以获得必要值(v
我有以下常量: const IS_WSL: bool = is_wsl!(); 我希望能够将它与 cfg 属性一起使用来执行条件编译。像这样的东西: #[cfg(const = "IS_WSL")]
我知道给定一个特定的上下文无关语法,要检查它是否有歧义,需要检查是否存在任何可以以不止一种方式派生的字符串。这是不可判定的。 但是,我有一个更简单的问题。给定一个特定的上下文无关文法和一个特定的字符串
以下文法有左递归: T -> Tx | TYx | YX | x X -> xx Y -> Yy | Yx | y 你如何去除左递归。我阅读了维基百科的解释,但我对 CFG 还很陌生,所以它没有多大意
我想将 $cfg['RowActionLinksWithoutUnique'] 设置为 TRUE 以便我可以在 phpMyAdmin 中编辑数据而无需任何主键,但在检查 config.inc.php
考虑以下上下文无关文法的扩展,它允许规则在左侧有一个(或多个)终结符在非终结符的右侧。即形式规则: A b -> ... 右手边可以是任何东西,就像在上下文无关文法中一样。特别是不是 要求,右侧将在末
我是一名优秀的程序员,十分优秀!