我一直在尝试运行这个最小的示例,以使Rapier的物理原理与Bevy一起工作:
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugin(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(100.0))
.run();
}
Run Code Online (Sandbox Code Playgroud)
它失败了:
error[E0277]: the trait bound `bevy_rapier2d::plugin::RapierPhysicsPlugin: Plugin` is not satisfied
--> src/main.rs:8:21
|
8 | .add_plugin(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(100.0))
| ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Plugin` is not implemented for `bevy_rapier2d::plugin::RapierPhysicsPlugin`
| |
| required by a bound introduced by this call
|
= help: the following other types implement trait `Plugin`:
AnimationPlugin
AssetCountDiagnosticsPlugin<T>
AssetPlugin
AudioPlugin
BloomPlugin
CameraPlugin
CameraProjectionPlugin<T>
ColorMaterialPlugin
and 44 others
note: required by a …
Run Code Online (Sandbox Code Playgroud) 我试图根据玩家是在屏幕上向左还是向右移动来翻转精灵。我目前修改 SpriteSheetComponents 变换的方法如下,似乎根本没有改变精灵:
fn player_direction_system(
velocity: &Velocity,
_: &FaceMovementDirection,
mut transform: Mut<Transform>,
) {
let flip = velocity.horizontal.signum();
transform.value = transform.value * Mat4::from_scale(Vec3::unit_y() * flip);
}
Run Code Online (Sandbox Code Playgroud)
我应该修改精灵的不同组件以翻转它吗?
在尝试 Bevy 时,我需要拖放精灵。不幸的是,这似乎不是现成的,或者我没有在文档中找到它。
实现这一目标最惯用的方法是什么?
到目前为止我所尝试的都在我的答案中,但我很乐意接受另一个更好/更快/更惯用的解决方案。
我正在学习 Rust 和 Bevy 引擎,我希望Font
在整个应用程序生命周期中保持加载某些资产(例如 s)。
// Resource for fonts:
#[derive(Default, Clone)]
pub struct ResFont {
pub ui: Handle<Font>, // The font that will be used in this example.
pub dialog: Handle<Font>,
...
}
// Insert resource in main() during App building:
{
.insert_resource(ResFont::default())
}
// Load resource during startup:
pub fn startup(asset_server: Res<AssetServer>, mut res_font: ResMut<ResFont>)
{
res_font.ui = asset_server.load("font/Default.ttf");
}
// Use the font resource in a different place:
pub fn setup_ui(res_font: ResMut<ResFont>)
{
...
TextStyle …
Run Code Online (Sandbox Code Playgroud) 在许多示例中,突破仅使用矩形,有加载精灵的示例,有加载 3D 网格的示例。在二维中,我想绘制一个三角形(或其他多边形),但我无法通过文档弄清楚它。
这是一个非常简单的问题。我已经重写了我的代码以处理新版本 bevy 附带的语法和其他更改。
编译时似乎一切正常,除了实体的消失。
我在上述实体中生成,例如:
commands.spawn_bundle(PbrBundle {
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
material: builder_texture.clone(),
transform: Transform::from_matrix(Mat4::from_scale_rotation_translation(
Vec3::splat(0.75),
Quat::from_rotation_x(0.0),
Vec3::new(0.0, 0.0, 0.0),
)),
..Default::default()
})
.insert(controll::BuilderIndicator);
Run Code Online (Sandbox Code Playgroud)
但我无法像这样让它消失:
fn despawn(
mut entity: Query<(Entity, controll::BuilderIndicator), With<controll::BuilderIndicator>>,
mut commands: Commands,
) {
for (entity, example) in entity.iter_mut() {
commands.despawn(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
它返回:
error[E0599]: no method named `despawn` found for struct `bevy::prelude::Commands<'_>` in the current scope
--> src/controll.rs:120:26
|
120 | commands.despawn(entity);
| ^^^^^^^ help: there is an associated function with a similar name: …
Run Code Online (Sandbox Code Playgroud) 我正在与 Bevy 一起制作一个简单的自上而下的“弹幕地狱”游戏。我尝试创建一个系统来照顾玩家的冲刺,如下所示:
fn player_dashing_system(
kb: Res<Input<KeyCode>>,
query: Query<&mut Player>
) {
if let Ok(&mut player) = query.get_single() {
if kb.just_pressed(KeyCode::Space) {
player.speed = BASE_PLAYER_DASH_SPEED;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
fn player_dashing_system(
kb: Res<Input<KeyCode>>,
query: Query<&mut Player>
) {
if let Ok(&mut player) = query.get_single() {
if kb.just_pressed(KeyCode::Space) {
player.speed = BASE_PLAYER_DASH_SPEED;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过摆弄变量的可变性,但没有任何效果。
是否可以创建直接按组件中字段的值进行过滤的复杂查询?
例如,假设 - 我有一个 2D 棋盘游戏(比如国际象棋或其他游戏),我想弄清楚特定坐标上是否有一个棋子。我的组件如下所示:
#[derive(Component)]
struct BoardPosition {
x: usize,
y: usize,
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找位置(4,5)的那块。然后,我的查询将如下所示 - 迭代整个板:
fn some_system(pieces: Query<&BoardPosition>) {
for piece in pieces.iter() {
if piece.x == 4 && piece.y == 5 {
// This is my piece, now I can do whatever I want with it
}
}
}
Run Code Online (Sandbox Code Playgroud)
但显然,找到一个简单的片段需要 O(n) 的时间。如果我将板存储为双列表(即[[T; N]; N]
),那么通过简单地执行 来找到这块将需要 O(1) board[4][5]
,但由于 bevy 拥有组件,所以我不能简单地访问该实体(或其其他组件)以此类推。
是否有更智能的方法来执行此操作,这将允许快速查询并允许我获取(或更改)所查询实体的其他组件?
我开始遵循这个关于如何在 bevy 中制作游戏的教程。代码编译得很好,但仍然很慢(老实说,我不确定这是否正常,大约需要 8 秒),但是当我启动游戏时,窗口会变白 ( )Not Responding
几秒钟(大约相同的时间)正确加载之前的时间(作为编译时间,可能稍微少一点)。
这是我的Cargo.toml
:
[package]
name = "rustship"
version = "0.1.0"
edition = "2021"
[dependencies]
bevy = "0.8.1"
# Enable a small amount of optimization in debug mode
[profile.dev]
opt-level = 1
# Enable high optimizations for dependencies (incl. Bevy), but not for our code:
[profile.dev.package."*"]
opt-level = 3
[workspace]
resolver = "2"
Run Code Online (Sandbox Code Playgroud)
我尝试了使用和不使用工作区解析器的情况。我的 rustup 工具链是nightly-x86_64-pc-windows-gnu
,我用它rust-lld
来链接程序:
[target.nightly-x86_64-pc-windows-gnu]
linker = "rust-lld.exe"
rustflags = ["-Zshare-generics=n"]
Run Code Online (Sandbox Code Playgroud)
根据官方的 …
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(WindowDescriptor{
width: 140.0,
height:140.0,
title: "Game of Life".to_string(),
..Default::default()
})
.run();
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这不起作用并且显示以下编译错误
error[E0277]: the trait bound `bevy::prelude::WindowDescriptor: Resource` is not satisfied
--> src\main.rs:7:26
|
7 | .insert_resource(WindowDescriptor{
| __________---------------_^
| | |
| | required by a bound introduced by this call
8 | | width: 140.0,
9 | | height:140.0,
10 | | title: "Game of Life".to_string(),
11 | | ..Default::default()
12 | | })
| |_________^ the trait `Resource` is …
Run Code Online (Sandbox Code Playgroud) 当使用组件的变异扩展基本示例时,我尝试添加&mut
到系统中的组件参数。但是,这触发了no method "system" found
错误。
我的代码在这里:
use bevy::prelude::*;
fn setup(
mut commands: Commands,
asset_server: Res<AssetServer>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
let texture_handle = asset_server.load("icon.png").unwrap();
commands
.spawn(Camera2dComponents::default())
.spawn(SpriteComponents {
material: materials.add(texture_handle.into()),
rotation: Rotation::from_rotation_z(0.0),
..Default::default()
})
.with(Player(0.0))
.with(());
}
struct Player(f32);
fn control_system(keyboard_input: Res<Input<KeyCode>>, player: &mut Player) { // <- mut added here
let mut r = player.0;
println!("hello");
/*
if keyboard_input.pressed(KeyCode::Left) {
player.0 += 0.1;
}
if keyboard_input.pressed(KeyCode::Right) {
player.0 -= 0.1;
}
*/
}
fn main() { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Bevy 在 Rust 中创建游戏,但在尝试编译我的项目时遇到错误。我收到的错误消息是:
error[E0658]: `let...else` statements are unstable
--> C:\Users\drew0\.cargo\registry\src\github.com-1ecc6299db9ec823\bevy_render_macros-0.9.0\src\as_bind_group.rs:119:13
Run Code Online (Sandbox Code Playgroud)
我尝试按照 Bevy 网站上的教程进行操作,并尝试删除分号,但错误仍然存在。如何解决此问题并使用 Bevy 成功编译我的项目?