我正在try 建立一个美丽的项目,并使用像素.他说: 现在,它使用一个纹理图集从单个图像中加载子画面.

一切正常,但我找不到如何在精灵中使用NearestNeighbor.我的精灵现在是模糊的. 所有相关文档似乎都是0.10之前的版本,而且似乎已经过时了.我似乎也找不到任何有关相关迁徙的信息. 这是一个很大的问题. 有人能帮我在我的项目中实现NearestNeighbor吗?

任何帮助都将不胜感激.

这就是我目前try 的方式:

use bevy::asset::Handle;
use bevy::prelude::*;
use bevy::render::render_resource::{AddressMode, FilterMode, SamplerDescriptor};

pub const BACKGROUND_COL: Color = Color::rgb(0.05, 0.05, 0.05);

fn main() {
    App::new()
        //.add_plugins(DefaultPlugins)
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Option::from(Window {
                title: "Hi".to_string(),

                ..default()
            }),
            ..default()
        }))
        .insert_resource(ClearColor(BACKGROUND_COL))
        .add_startup_system(spawn_camera)
        .add_startup_system(load_spritemap)
        .add_startup_system(spawn_player.in_base_set(StartupSet::PostStartup))
        .add_system(bevy::window::close_on_esc)
        .run();
}

#[derive(Resource)]
struct Spritemap(Handle<TextureAtlas>);

fn spritemap_fix(
    mut ev_asset: EventReader<AssetEvent<TextureAtlas>>,
    mut assets: ResMut<Assets<TextureAtlas>>,
) {
    for ev in ev_asset.iter() {
        match ev {
            AssetEvent::Created { handle } => {
                if let Some(texture) = assets.get_mut(&handle) {
                    texture.sampler = SamplerDescriptor {
                        address_mode_u: AddressMode::ClampToEdge,
                        address_mode_v: AddressMode::ClampToEdge,
                        mag_filter: FilterMode::Nearest,
                        min_filter: FilterMode::Nearest,
                        ..Default::default()
                    };
                }
            }
            AssetEvent::Modified { .. } => {}
            AssetEvent::Removed { .. } => {}
        }
    }
}

fn load_spritemap(
    mut commands: Commands,
    assets: Res<AssetServer>,
    mut texture_atlases: ResMut<Assets<TextureAtlas>>,
) {
    let image = assets.load("Spritemap.png");

    let atlas = TextureAtlas::from_grid(
        image,
        Vec2::splat(8.0),
        16,
        11,
        Some(Vec2::splat(2.0)),
        Some(Vec2::splat(1.0)),
    );

    let atlas_handle = texture_atlases.add(atlas);
    commands.insert_resource(Spritemap(atlas_handle));
}

fn spawn_camera(mut commands: Commands) {
    commands.spawn(Camera2dBundle {
        projection: OrthographicProjection {
            scale: 1.00,
            ..default()
        },
        ..default()
    });
}

fn spawn_player(mut commands: Commands, sprites: Res<Spritemap>) {
    let mut sprite = TextureAtlasSprite::new(0);
    sprite.custom_size = Some(Vec2::splat(1.0));

    commands.spawn(SpriteSheetBundle {
        sprite,
        texture_atlas: sprites.0.clone(),
        transform: Transform {
            translation: Vec3::new(0.0, 0.0, 0.0),
            scale: Vec3::splat(100.0),
            ..default()
        },
        ..default()
    });//.insert(Name::new("Player"))

    commands.spawn(Player {
        name: "Pascal".to_string()
    });
}

#[derive(Component)]
pub struct Player {
    pub name: String,
}

我的Cargo .

[package]
name = "bevy_simplerpg"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[profile.dev.package."*"]
opt-level = 3

[dependencies]
bevy = "0.10.1"

以下是我收到的错误消息:

error[E0609]: no field `sampler` on type `&mut bevy::prelude::TextureAtlas`
  --> src\main.rs:37:29
   |
37 |                     texture.sampler = SamplerDescriptor {
   |                             ^^^^^^^ unknown field
   |
   = note: available fields are: `texture`, `size`, `textures`
 

我试着计算出this需要什么,我接近了,但使用这种方法也总是出错.

image.sampler_descriptor

似乎没有一个

mag_filter

property. I don't know where else to access it.
I also don't know if this even works with TextureAtlas.

推荐答案

您需要访问TextureAtlas上的texture,然后设置Image中的sample_descriptor.

基于您现有的代码,一种可以完成此操作的方法如下:

fn spritemap_fix(
    mut ev_asset: EventReader<AssetEvent<Image>>,
    mut assets: ResMut<Assets<Image>>,
) {
    for ev in ev_asset.iter() {
        match ev {
            AssetEvent::Created { handle } => {
                if let Some(texture) = assets.get_mut(&handle) {
                    texture.sampler_descriptor = ImageSampler::nearest()
                }
            },
            _ => {}
        }
    }
}

然后,不要忘记将系统添加到您的main函数中:

fn main() {
    App::new()
        //.add_plugins(DefaultPlugins)
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Option::from(Window {
                title: "Hi".to_string(),

                ..default()
            }),
            ..default()
        }))
        .insert_resource(ClearColor(BACKGROUND_COL))
        .add_startup_system(spawn_camera)
        .add_startup_system(load_spritemap)
        .add_startup_system(spawn_player.in_base_set(StartupSet::PostStartup))
        .add_system(spritemap_fix)
        .add_system(bevy::window::close_on_esc)
        .run();
}

Rust相关问答推荐

阻止websocket中断的中断中断的终端(操作系统错误4)

如何创建引用构造函数拥有的变量的对象?

当T不执行Copy时,如何返回Arc Mutex T后面的值?

除了调用`waker.wake()`之外,我如何才能确保future 将再次被轮询?

铁 rust ,我的模块介绍突然遇到了一个问题

为什么Option类型try块需要类型注释?

根据填充系数以相对大小在给定空间中布局项目

Rust面向对象设计模式

如何轮询 Pin>?

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

如何执行数组文字的编译时串联?

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

Rust Serde 为 Option:: 创建反序列化器

Rust 将特性传递给依赖项

如何使返回 XMLError 的方法与 anyhow::Error 兼容?

TcpStream::connect - 匹配武器具有不兼容的类型

提取 struct 生成宏中字段出现的索引

如何从 Rust 函数返回数组而不复制它们?