Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Lua中绘制sf::Text对象时发生的分割错误

在Lua中绘制sf::Text对象时发生的分割错误
EN

Stack Overflow用户
提问于 2015-07-25 09:42:53
回答 1查看 327关注 0票数 1

我用LuaBridge向Lua公开了许多SFML类,并且测试了大多数类,它们工作得很好(sf::RectangleShapesf::Texture等)。但是,我对sf::Fontsf::Text有意见。首先,我的C++代码公开了sf::Fontsf::Text

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <string>

#include <SFML/Graphics.hpp>

#include <lua.hpp>
#include <LuaBridge.h>

//Wrapper for sf::Text:
class TextWrap
{
    private:
        sf::Text member;

    public:
        void setCharacterSize(const int& newSize) {member.setCharacterSize(newSize);}
        int getCharacterSize() {return member.getCharacterSize();}

        void setColor(const sf::Color& newColor) {member.setColor(newColor);}
        sf::Color getColor() {return member.getColor();}

        void setFont(const sf::Font& newFont) {member.setFont(newFont);}
        const sf::Font* getFont() {return member.getFont();}

        void setPosition(const sf::Vector2f& newPosition) {member.setPosition(newPosition);}
        sf::Vector2f getPosition() {return member.getPosition();}

        void setRotation(const float& rotation) {member.setRotation(rotation);}
        float getRotation() {return member.getRotation();}

        void setScale(const sf::Vector2f& newScale) {member.setScale(newScale);}
        sf::Vector2f getScale() {return member.getScale();}

        void setString(const std::string& text) {member.setString(text);}
        std::string getString() {return member.getString();}

        void move(const sf::Vector2f& movePos) {member.move(movePos);}
        void rotate(const float& rotation) {member.rotate(rotation);}
        void scale(const sf::Vector2f& scaleAmount) {member.scale(scaleAmount);}

        sf::Text getMember() {return member;}
};

class WindowWrap
{
    private:
        sf::RenderWindow member;

    public:
        void createWindowed(const unsigned int width, const unsigned int height, const std::string& title) {member.create(sf::VideoMode(width, height), title);}
        void createFullscreen(const unsigned int width, const unsigned int height, const std::string& title) {member.create(sf::VideoMode(width, height), title, sf::Style::Fullscreen);}
        void createSplash(const unsigned int width, const unsigned int height) {member.create(sf::VideoMode(width, height), "Splash");}
        void close() {member.close();}

        void clear(const sf::Color& clearColour) {member.clear(clearColour);}
        void display() {member.display();}
        void drawText(TextWrap& text) {member.draw(text.getMember());}

        void setPosition(const sf::Vector2i& newPosition) {member.setPosition(newPosition);}
        sf::Vector2i getPosition() {return member.getPosition();}
        void setSize(const sf::Vector2u& newSize) {member.setSize(newSize);}
        sf::Vector2u getSize() {return member.getSize();}

        bool isOpen() {return member.isOpen();}

        sf::Vector2i mapCoordsToPixel(const sf::Vector2f& point) {return member.mapCoordsToPixel(point);}
        sf::Vector2f mapPixelToCoords(const sf::Vector2i& point) {return member.mapPixelToCoords(point);}

        bool setActive() {return member.setActive();}

        void setFramerateLimit(const unsigned int& limit) {member.setFramerateLimit(limit);}

        void setJoystickThreshold(const float& threshold) {member.setJoystickThreshold(threshold);}
        void setKeyRepeatEnabled(bool enabled) {member.setKeyRepeatEnabled(enabled);}
        void setVerticalSyncEnabled(bool enabled) {member.setVerticalSyncEnabled(enabled);}
        void setMouseCursorVisible(bool enabled) {member.setMouseCursorVisible(enabled);}

        void setTitle(const std::string& title) {member.setTitle(title);}

        void setVisible(const bool& enabled) {member.setVisible(enabled);}
};

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luabridge::getGlobalNamespace(L)
    .beginClass<sf::Vector2f>("Vector2f")
        .addConstructor<void(*)(float, float)>()
        .addData("x", &sf::Vector2f::x)
        .addData("y", &sf::Vector2f::y)
    .endClass()
    .beginClass<sf::Vector2i>("Vector2i")
        .addConstructor<void(*)(int, int)>()
        .addData("x", &sf::Vector2i::x)
        .addData("y", &sf::Vector2i::y)
    .endClass()
    .beginClass<sf::Vector2u>("Vector2u")
        .addConstructor<void(*)(unsigned int, unsigned int)>()
        .addData("x", &sf::Vector2u::x)
        .addData("y", &sf::Vector2u::y)
    .endClass()

    .beginClass<sf::IntRect>("IntRect")
        .addConstructor<void(*)(int, int, int, int)>()
        .addData("top", &sf::IntRect::top)
        .addData("left", &sf::IntRect::left)
        .addData("height", &sf::IntRect::height)
        .addData("width", &sf::IntRect::width)
    .endClass()
    .beginClass<sf::FloatRect>("FloatRect")
        .addConstructor<void(*)(float, float, float, float)>()
        .addData("top", &sf::FloatRect::top)
        .addData("left", &sf::FloatRect::left)
        .addData("height", &sf::FloatRect::height)
        .addData("width", &sf::FloatRect::width)
    .endClass()

    .beginClass<sf::Color>("Color")
        .addConstructor<void(*)(unsigned int, unsigned int, unsigned int, unsigned int)>()
        .addData("r", &sf::Color::r)
        .addData("g", &sf::Color::g)
        .addData("b", &sf::Color::b)
        .addData("a", &sf::Color::a)
    .endClass()

    .beginClass<sf::Font>("Font")
        .addConstructor<void(*)(void)>()
        .addFunction("loadFromFile", &sf::Font::loadFromFile)
    .endClass()
    .beginClass<TextWrap>("Text")
        .addConstructor<void(*)(void)>()
        .addFunction("setCharacterSize", &TextWrap::setCharacterSize)
        .addFunction("getCharacterSize", &TextWrap::getCharacterSize)
        .addFunction("setColor", &TextWrap::setColor)
        .addFunction("getColor", &TextWrap::getColor)
        .addFunction("setFont", &TextWrap::setFont)
        .addFunction("getFont", &TextWrap::getFont)
        .addFunction("setPosition", &TextWrap::setPosition)
        .addFunction("getPosition", &TextWrap::getPosition)
        .addFunction("setRotation", &TextWrap::setRotation)
        .addFunction("getRotation", &TextWrap::getRotation)
        .addFunction("setScale", &TextWrap::setScale)
        .addFunction("getScale", &TextWrap::getScale)
        .addFunction("setString", &TextWrap::setString)
        .addFunction("getString", &TextWrap::getString)
        .addFunction("move", &TextWrap::move)
        .addFunction("rotate", &TextWrap::rotate)
        .addFunction("scale", &TextWrap::scale)
    .endClass()

    .beginClass<WindowWrap>("Window")
        .addConstructor<void(*)(void)>()
        .addFunction("createWindowed", &WindowWrap::createWindowed)
        .addFunction("createFullscreen", &WindowWrap::createFullscreen)
        .addFunction("createSplash", &WindowWrap::createSplash)
        .addFunction("close", &WindowWrap::close)
        .addFunction("clear", &WindowWrap::clear)
        .addFunction("display", &WindowWrap::display)
        .addFunction("drawText", &WindowWrap::drawText)
        .addFunction("setPosition", &WindowWrap::setPosition)
        .addFunction("getPosition", &WindowWrap::getPosition)
        .addFunction("setSize", &WindowWrap::setSize)
        .addFunction("getSize", &WindowWrap::getSize)
        .addFunction("isOpen", &WindowWrap::isOpen)
        .addFunction("mapCoordsToPixel", &WindowWrap::mapCoordsToPixel)
        .addFunction("mapPixelToCoords", &WindowWrap::mapPixelToCoords)
        .addFunction("setActive", &WindowWrap::setActive)
        .addFunction("setFramerateLimit", &WindowWrap::setFramerateLimit)
        .addFunction("setKeyRepeatEnabled", &WindowWrap::setKeyRepeatEnabled)
        .addFunction("setVerticalSyncEnabled", &WindowWrap::setVerticalSyncEnabled)
        .addFunction("setMouseCursorVisible", &WindowWrap::setMouseCursorVisible)
        .addFunction("setTitle", &WindowWrap::setTitle)
        .addFunction("setVisible", &WindowWrap::setVisible)
    .endClass();

    WindowWrap mainWindow; //This is defined here so C++ knows if the main application is open
    mainWindow.createWindowed(800, 600, "Lua Test");
    luabridge::push(L, &mainWindow);
    lua_setglobal(L, "mainWindow");

    luaL_dofile(L, "./script.lua");
}

如果我创建一个使用TextFont的lua脚本,我有时会得到一个分段错误。我的意思是,只有当我绘制文本对象时,如果我设置字体,我才会得到错误。

剧本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text = Text();
text:setCharacterSize(16);
text:setPosition(Vector2f(100, 100));
text:setColor(Color(255,255,255,255));
text:setString("Hello World");
font = Font();
font:loadFromFile("./font.ttf");
text:setFont(font); --If I remove this I don't get a Segmentation Fault
mainWindow:drawText(text); --But the Segmentation Fault happens here

更新:

在使用其他SFML类进行测试之后,这似乎不是sf::Texturesf::Texture等方面的问题。这告诉我,这是一个sf::Font问题,而不是被删除的引用。

关于LuaBridge和SFML的相关问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-08 01:57:04

我发现修复这个问题的方法(感谢SFML论坛提供了答案)是在TextWrap中修改这一行代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void setFont(const sf::Font& newFont) {member.setFont(newFont);}

对此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void setFont(const sf::Font* newFont) {member.setFont(*newFont);}

根据论坛的说法,这是一个问题,因为Lua是基于C而不是C++的,所以不知道指针。因此,通过使参数成为指针,然后取消对指针的引用,我有效地解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31629342

复制
相关文章
在 R 中使用 sf 和 ggplot2 绘制河流地图
今年的3月22日是“世界水日”,它关注淡水的重要性,并引起人们对无法获得安全用水的22亿人的关注。今年的重点是地下水,这是为我们的泉水、河流、湖泊和湿地提供食物的宝贵来源。
气象学家
2022/04/18
2.7K0
在 R 中使用 sf 和 ggplot2 绘制河流地图
DW 在onload运行recordset find.html时 发生了以下javascript错误
这两天打开Dreamweaver CS5,总是弹出一个错误,写着:   在onLoad运行RecordsetFind.htm时,发生了以下JavaScript错误:   在文件“RecordsetFind”中:   findRsisnotdefined   在关闭Dreamweaver的时候也会弹出一个类似的错误, 原因:DW 的配置信息出错了,可能是上次使用非法关闭造成的。   在网上查了一下,找到了解决方法。   方法如下: 删除该目录中对应的Dreamweaver版本文件夹。 xp系统,目录 C:/
deepcc
2018/05/16
1.6K0
Lua组件在Redis中的作用
这种功能允许用户在Redis服务器上执行原子性的操作,从而避免了多次网络往返的开销。
一凡sir
2023/10/03
2790
Lua组件在Redis中的作用
【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
  Lua是一门非常强大、非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言。但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便。不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类、继承和多态等面向对象编程具有的特性。
马三小伙儿
2018/09/12
3.1K0
Flash在DirectX中的绘制
这里使用的是之前我说过的OLE控件在Direct3D中的渲染方法, 自己不进行swf的解析, 这不现实. 前提条件: COM编程, OLE编程, DirectX编程, ActionScript/Flash(可选). 创建一个ShockwaveFlashObjects::IShockwaveFlash的对象 实现一个IOleClientSite来做为IShockwaveFlash的容器 绘制 通过OleDraw来把GDI的像素数据绘制到DC上(IShockwaveFlash是一个IViewObjec
逍遥剑客
2018/05/23
1.8K0
在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
        在《在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统》一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序。这是个非常令我们这些C程序员激动的事。但是我们使用ffi库写出来的程序往往比较大,因为我们可能要声明一些API的原型和结构体。比如我们看luajit的wiki中关于使用ffi调用kernel32的一个例子。(转载请指明出于breaksoftware的csdn博客)如果我们要使用
方亮
2019/02/28
2.2K0
在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
Java中String转换为JSONArray发生错误[通俗易懂]
第一种解析的字符串结构 keywords:[{keyword=关键字,matchType=1},{keyword=关键字,matchType=1}]
全栈程序员站长
2022/08/31
5.8K0
Maven 编译时发生错误说XX是专有API,可能会在未来的版本中删除
解决办法也很简单就是,设置编译插件的时候增加一个依赖 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configur
前Thoughtworks-杨焱
2021/12/08
1.4K0
vsCode 打开界面报错,尝试在目标目录创建文件时发生一个错误
目录 一、报错提示: 二、解决方案:  ---- 一、报错提示: 尝试在目标目录创建文件时发生一个错误:拒绝访问 二、解决方案:  拒绝访问的原因就是权限不足导致。 1、找到上图报错提示的 VS Code 安装目录右键点击属性设置权限。 2、添加一个用户 Everyone  3、赋予 Everyone 用户完全控制权限。 
跟着飞哥学编程
2022/12/02
2.5K0
Java中net.sf.json包关于JSON与对象互转的坑
  在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递。数据的格式通常有2种:1、xml;2、JSON。通常来说都是使用JSON来传递数据。本文正是介绍在Java中JSON与对象之间互相转换时遇到的几个问题以及相关的建议。 首先明确对于JSON有两个概念: JSON对象(JavaScript Object Notation,JavaScript对象表示法)。这看似只存是位JavaScript所定制的,但它作为一种语法是独立于语言以及平台的。只是说通常情
用户1148394
2018/01/09
3.3K0
Java中net.sf.json包关于JSON与对象互转的坑
R语言在RCT中调整基线时对错误指定的稳健性
众所周知,调整一个或多个基线协变量可以增加随机对照试验中的统计功效。调整分析未被更广泛使用的一个原因可能是因为研究人员可能担心如果基线协变量的影响在结果的回归模型中没有正确建模,结果可能会有偏差。
拓端
2020/07/16
1.7K0
在sublime text 3中配置go
1.下载Sublime Text http://www.sublimetext.com/
py3study
2020/01/09
2.3K0
在vscode中go编码发生的问题整理
使用VsCode进行Go程序开发,我们肯定会碰到一些问题,这些问题有些是IDE的配置问题,有些是下载包的版本不一致问题,本文主要针对在开发过程中碰到的问题做一个简单的回顾和整理。
happlyfox
2021/03/19
1.6K0
在vscode中go编码发生的问题整理
使用VsCode进行Go程序开发,我们肯定会碰到一些问题,这些问题有些是IDE的配置问题,有些是下载包的版本不一致问题,本文主要针对在开发过程中碰到的问题做一个简单的回顾和整理。
happlyfox
2021/03/17
2.4K0
redis中的lua
前言 最近在看redis的lua,看了官网资料和网上一些文章,整理了lua的相关内容,希望对大家有帮助。 目录 0. redis中运行lua的流程的正常流程 1.redis中的lua概要信息     1.1 lua中调用redis命令     1.2 redis数据结构与lua数据结构对应关系     1.3 EVAL和EVALSHA     1.4 脚本缓存     1.5 脚本命令     1.6 其他约定         1.6.1 全局变量保护         1.6.2 Sele
温安适
2018/05/17
1.8K0
LUA面向对象编程技巧
详文请见 http://ffown.sinaapp.com/?p=11 1. LUA中的对象 我们知道,对象由属性和方法组成。LUA中最基本的结构是table,So 必须用table描述对象的属性。l
知然
2018/03/09
1.6K0
SLua-在Lua中实现Unity中的生命周期
Enumerable.Cast(IEnumerable) Method : Casts the elements of an IEnumerable to the specified type. 将一个IEnumerable的元素转换为一个具体的类型。
祝你万事顺利
2019/07/26
1.5K0
点击加载更多

相似问题

当我试图绘制sf::Text对象时SFML中的分割错误

20

SFML2.4.2在绘制sf::Text对象之前获取localBounds

14

绘制sf对象时出错--错误:找不到函数"geom_sf“

12

是否在绘制前查找sf::Text宽度?

11

试图破坏sf::字体时的分割错误

115
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文