You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从已构造的VertexArray中绘制自定义图元?

嘿,我来帮你解决这个SFML动态追加顶点绘制线段的问题!

解决SFML动态顶点绘制线段的问题

首先,你遇到的问题根源在于普通数组没办法动态扩容追加元素,而且手动管理的sf::Vertex数组很容易出现内存越界或者指针失效的情况,导致draw函数调用出错。推荐你改用std::vector<sf::Vertex>来存储顶点——它天然支持动态添加元素,而且SFML的draw函数完全兼容这种容器。

具体实现方案

  • 替换普通数组为std::vector<sf::Vertex>类型,利用容器的动态扩容特性管理顶点
  • 用push_back()或emplace_back()方法动态追加顶点
  • 绘制时直接传递容器的底层数据指针+元素数量,或者直接传入容器本身(SFML对std容器有重载支持)

示例代码

#include <SFML/Graphics.hpp>
#include <vector>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Dynamic Line Demo");
    
    // 用vector存储顶点,支持动态追加
    std::vector<sf::Vertex> vertices;
    
    // 动态添加第一条线段的两个顶点
    vertices.emplace_back(sf::Vector2f(100, 100), sf::Color::Red);
    vertices.emplace_back(sf::Vector2f(200, 200), sf::Color::Red);
    
    // 后续还可以随时追加更多顶点(比如再画一条蓝色线段)
    vertices.emplace_back(sf::Vector2f(300, 100), sf::Color::Blue);
    vertices.emplace_back(sf::Vector2f(400, 200), sf::Color::Blue);
    
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        
        window.clear();
        // 两种绘制方式任选其一:
        // 方式1:传递底层数据指针+元素数量
        window.draw(vertices.data(), vertices.size(), sf::Lines);
        // 方式2:直接传入vector(SFML原生支持)
        // window.draw(vertices, sf::Lines);
        window.display();
    }
    
    return 0;
}

为什么原来的方法会出错?

如果用普通数组(比如sf::Vertex vertices[]或手动分配的指针),数组的大小是固定的,无法自动扩容。当你试图“追加”顶点时,本质上是在访问数组的越界内存,这会导致未定义行为(比如程序崩溃、绘制异常)。而std::vector会自动管理内存:当元素数量超过当前容量时,它会自动重新分配更大的内存空间,保证所有顶点数据的有效性。

另外,调用window.draw时,第二个参数是要绘制的顶点总数,用普通数组时你必须手动确保数组内的顶点数和传入的数量匹配,否则也会触发非法内存访问错误。

内容的提问来源于stack exchange,提问作者Yajirobe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:39