小编koo*_*mes的帖子

使用 mod 关键字访问 Rust 中的子目录

我有文件结构: engine 和 utils 文件夹在同一级别。引擎包含世界文件夹(其中包含 mod.rs 和 map.rs)和 mod.rs。Utils 包含 mod.rs 和 reader.rs。

我正在尝试从阅读器访问地图,但无法使“使用”语句起作用。

实用程序/mod.rs

pub mod reader;
Run Code Online (Sandbox Code Playgroud)

引擎/mod.rs

pub mod world;
Run Code Online (Sandbox Code Playgroud)

世界/mod.rs

pub mod map;

pub struct World;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

pub mod reader;
Run Code Online (Sandbox Code Playgroud)

你不能在子目录中声明模块,还是我错过了一些愚蠢的东西?我一直在搞乱 use 语句大约半个小时,但无法让它工作。

rust

8
推荐指数
0
解决办法
4367
查看次数

落沙模拟中的水

奇异水物理演示

我目前正在使用 C++ 和 SDL2 开发一个非常简单的“落沙”模拟游戏,并且在让水以更逼真的方式流动方面遇到了问题。我基本上有一个单元格网格,我从下到上,从左到右迭代,如果我找到一个水单元格,我只需检查下面,从下到左,下到右,左然后右的空单元格它移动到它找到的第一个(如果两个对角线单元格或两个水平单元格都是空闲的,它会随机选择)。然后我将它移动到的单元格标记为已处理,以便在该循环的其余部分不会再次检查它。

我的问题是粒子如何移动的一种“左偏”;如果我在屏障上方生成一个正方形的水细胞,一旦粒子开始到达屏障,它们基本上都会向左移动而不移动,而右侧的细胞将以正确的方式向下运行。所以不是形成一个漂亮的三角形,均匀地流向两边,整个形状只会向左移动。每当我从左到右迭代时,这种效果就会逆转,所以我知道这与此有关,但到目前为止我一直在努力修复它。我最初认为这是我如何将单元格标记为已处理的问题,但在数小时的测试中我没有发现该系统有明显的错误。有没有人在开发这样的模拟时遇到过任何类似的挑战,或者知道一些我' 我失踪了?任何帮助将不胜感激。

编辑: 好的,所以我取得了一些进展,但是我遇到了另一个似乎与迭代无关的错误,因为现在我保存了旧单元格的副本并从中读取以决定更新,然后更新原始单元格并显示它。这已经使沙子更好地工作,但是水平检查游离细胞的水现在在水平移动时“消失”。我整个上午都在测试它,但还没有找到解决方案,我认为这可能与我复制数组的方式有关,但据我所知,它似乎有效。

新片段:

模拟.cpp

void Simulation::update()
{
    copyStates(m_cells, m_oldCells); // so now oldcells is the last new state

    for(int y = m_height - 1; y>= 0; y--)
    for(int x = 0; x < m_width; x++)
        {
            Cell* c = getOldCell(x, y); // check in the old state for possible updates
            switch(c->m_type)
            {
                case EMPTY:
                    break;
                case SAND:
                    if(c->m_visited == false) update_sand(x, y);
                    break;
                case WATER:
                    if(c->m_visited == false) update_water(x, y);
                    break;
                default:
                    break; …
Run Code Online (Sandbox Code Playgroud)

c++ simulation cellular-automata game-physics particle-system

6
推荐指数
1
解决办法
269
查看次数

迭代对象向量

我试图迭代一个对象向量并执行一个简单的更新函数,该函数每次将对象向右移动 1 个像素。但是,当我运行代码时,x 值仅更改一次。

在 source.cpp 中:

 for (int i = 0; i < Screen::SCREEN_WIDTH * Screen::SCREEN_HEIGHT; i++) {
    people.push_back(Person());
}

for (int i = 0; i < 1; i++) {
    people[i].isAlive = true;
}

while(true) {

 for (Person p : people) {
        if (p.isAlive == true) {
            p.Update(p);
            cout << p.x << endl;
            screen.setPixel(p.x, p.y, 255, 0, 0);
        }
        else {
            screen.setPixel(p.x, p.y, 0, 0, 0);
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

亲自.cpp

 void Person::Update(Person &person) {
      person.x += 1;
Run Code Online (Sandbox Code Playgroud)

}

如您所见,我从数组中选择一个人并将其设置为活着的,因此被绘制。它们每帧都被绘制,但不会更新。谁能帮我解决这个问题?

c++ vector

3
推荐指数
1
解决办法
6525
查看次数

如何检查for循环是否在迭代器的最后一个元素上?

我试图找到一种方法来检查我是否在 for 循环中的迭代器的最后一个元素上,而不使用 .clone(); 目前我正在这样做:

let sentence = "The quick brown fox.";
let words = sentence.split(' ');
let last = words.clone().last().unwrap();
 
for word in words {
    if word == last {
        print!("{}", word);
    }
} 
Run Code Online (Sandbox Code Playgroud)

我也试过在迭代器上使用 .collect() ,但这要求我使用 .iter().enumerate() 来检查最后一个索引,这对我来说似乎不必要地复杂:

let sentence = "The quick brown fox.";
let words: Vec<&str> = sentence.split(' ').collect();
 
for (i, word) in words.iter().enumerate() {
    if i == words.len() - 1 {
        print!("{}", word);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法以更简洁的方式做到这一点,也许只是使用原始迭代器?

rust

2
推荐指数
2
解决办法
138
查看次数

HTTP 响应的正文存储在哪里?(使用 Rust + reqwest)

在过去的几天里,我通过使用 reqwest crate 在 Rust 中构建一个简单的 CL 下载管理器来处理 HTTP 的东西,一直在搞乱 HTTP。我对协议的工作原理有了基本的了解 - 下载文件时要查找哪些标头,如何验证请求是否有效等 - 但我无法找到有关实际字节在何处的答案存储 HTTP 响应的主体。

例如,使用 reqwest 发送请求并获得响应所需的时间很少,因此我认为在此阶段无法进行下载。实际上需要时间的是从正文中读取字节。但是这个身体肯定不能存储在 RAM 中,因为下载一个大文件会使内存使用量猛增。我意识到这些数据的存储位置在不同的 HTTP 框架中可能会有所不同,但我想我所追求的是对不使用浏览器下载文件时大型 HTTP 响应主体的存储位置的更一般性解释。

http rust reqwest

2
推荐指数
1
解决办法
56
查看次数