【rust/bevy】从game template开始

目录

  • 说在前面
  • 步骤
  • 进入3D
  • 控制方块
  • 问题

说在前面

  • 操作系统:win11
  • rust版本:rustc 1.77.0-nightly
  • bevy版本:0.12

步骤

  • rust安装
    这里
    windows下建议使用msvc版本
  • bevy安装
    这里
  • clone代码
    git clone https://github.com/NiklasEi/bevy_game_template.git
    
  • 运行
    cargo run
    
  • 结果
    在这里插入图片描述

进入3D

  • template中的例子是2d的,我们稍微修改下
  • 首先增加一个CameraController,代码在bevy的例程中也可以找到
    //! A freecam-style camera controller plugin.
    //! To use in your own application:
    //! - Copy the code for the [`CameraControllerPlugin`] and add the plugin to your App.
    //! - Attach the [`CameraController`] component to an entity with a [`Camera3dBundle`].use bevy::window::CursorGrabMode;
    use bevy::{input::mouse::MouseMotion, prelude::*};use std::f32::consts::*;
    use std::fmt;/// Based on Valorant's default sensitivity, not entirely sure why it is exactly 1.0 / 180.0,
    /// but I'm guessing it is a misunderstanding between degrees/radians and then sticking with
    /// it because it felt nice.
    pub const RADIANS_PER_DOT: f32 = 1.0 / 180.0;#[derive(Component)]
    pub struct CameraController {pub enabled: bool,pub initialized: bool,pub sensitivity: f32,pub key_forward: KeyCode,pub key_back: KeyCode,pub key_left: KeyCode,pub key_right: KeyCode,pub key_up: KeyCode,pub key_down: KeyCode,pub key_run: KeyCode,pub mouse_key_enable_mouse: MouseButton,pub keyboard_key_enable_mouse: KeyCode,pub walk_speed: f32,pub run_speed: f32,pub friction: f32,pub pitch: f32,pub yaw: f32,pub velocity: Vec3,
    }impl Default for CameraController {fn default() -> Self {Self {enabled: true,initialized: false,sensitivity: 1.0,key_forward: KeyCode::W,key_back: KeyCode::S,key_left: KeyCode::A,key_right: KeyCode::D,key_up: KeyCode::E,key_down: KeyCode::Q,key_run: KeyCode::ShiftLeft,mouse_key_enable_mouse: MouseButton::Left,keyboard_key_enable_mouse: KeyCode::M,walk_speed: 5.0,run_speed: 15.0,friction: 0.5,pitch: 0.0,yaw: 0.0,velocity: Vec3::ZERO,}}
    }impl fmt::Display for CameraController {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {write!(f,"
    Freecam Controls:MOUSE\t- Move camera orientation{:?}/{:?}\t- Enable mouse movement{:?}{:?}\t- forward/backward{:?}{:?}\t- strafe left/right{:?}\t- 'run'{:?}\t- up{:?}\t- down",self.mouse_key_enable_mouse,self.keyboard_key_enable_mouse,self.key_forward,self.key_back,self.key_left,self.key_right,self.key_run,self.key_up,self.key_down)}
    }pub struct CameraControllerPlugin;impl Plugin for CameraControllerPlugin {fn build(&self, app: &mut App) {app.add_systems(Update, camera_controller);}
    }fn camera_controller(time: Res<Time>,mut windows: Query<&mut Window>,mut mouse_events: EventReader<MouseMotion>,mouse_button_input: Res<Input<MouseButton>>,key_input: Res<Input<KeyCode>>,mut move_toggled: Local<bool>,mut query: Query<(&mut Transform, &mut CameraController), With<Camera>>,
    ) {let dt = time.delta_seconds();if let Ok((mut transform, mut options)) = query.get_single_mut() {if !options.initialized {let (yaw, pitch, _roll) = transform.rotation.to_euler(EulerRot::YXZ);options.yaw = yaw;options.pitch = pitch;options.initialized = true;}if !options.enabled {return;}// Handle key inputlet mut axis_input = Vec3::ZERO;if key_input.pressed(options.key_forward) {axis_input.z += 1.0;}if key_input.pressed(options.key_back) {axis_input.z -= 1.0;}if key_input.pressed(options.key_right) {axis_input.x += 1.0;}if key_input.pressed(options.key_left) {axis_input.x -= 1.0;}if key_input.pressed(options.key_up) {axis_input.y += 1.0;}if key_input.pressed(options.key_down) {axis_input.y -= 1.0;}if key_input.just_pressed(options.keyboard_key_enable_mouse) {*move_toggled = !*move_toggled;}// Apply movement updateif axis_input != Vec3::ZERO {let max_speed = if key_input.pressed(options.key_run) {options.run_speed} else {options.walk_speed};options.velocity = axis_input.normalize() * max_speed;} else {let friction = options.friction.clamp(0.0, 1.0);options.velocity *= 1.0 - friction;if options.velocity.length_squared() < 1e-6 {options.velocity = Vec3::ZERO;}}let forward = transform.forward();let right = transform.right();transform.translation += options.velocity.x * dt * right+ options.velocity.y * dt * Vec3::Y+ options.velocity.z * dt * forward;// Handle mouse inputlet mut mouse_delta = Vec2::ZERO;if mouse_button_input.pressed(options.mouse_key_enable_mouse) || *move_toggled {for mut window in &mut windows {if !window.focused {continue;}window.cursor.grab_mode = CursorGrabMode::Locked;window.cursor.visible = false;}for mouse_event in mouse_events.read() {mouse_delta += mouse_event.delta;}}if mouse_button_input.just_released(options.mouse_key_enable_mouse) {for mut window in &mut windows {window.cursor.grab_mode = CursorGrabMode::None;window.cursor.visible = true;}}if mouse_delta != Vec2::ZERO {// Apply look updateoptions.pitch = (options.pitch - mouse_delta.y * RADIANS_PER_DOT * options.sensitivity).clamp(-PI / 2., PI / 2.);options.yaw -= mouse_delta.x * RADIANS_PER_DOT * options.sensitivity;transform.rotation = Quat::from_euler(EulerRot::ZYX, 0.0, options.yaw, options.pitch);}}
    }
    
  • 再添加一个SceneSetup,用于初始化场景和相机
    use bevy::prelude::*;
    use bevy::app::{Plugin, App, Startup};use crate::camera::CameraController;pub struct SceneSetupPlugin;impl Plugin for SceneSetupPlugin {fn build(&self, app: &mut App) {app.add_systems(Startup, setup);}
    }/// set up a simple 3D scene
    fn setup(mut commands: Commands,mut meshes: ResMut<Assets<Mesh>>,mut materials: ResMut<Assets<StandardMaterial>>,
    ) {// circular basecommands.spawn(PbrBundle {mesh: meshes.add(shape::Circle::new(4.0).into()),material: materials.add(Color::WHITE.into()),transform: Transform::from_rotation(Quat::from_rotation_x(-std::f32::consts::FRAC_PI_2)),..default()});// cubecommands.spawn(PbrBundle {mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),material: materials.add(Color::rgb_u8(124, 144, 255).into()),transform: Transform::from_xyz(0.0, 0.5, 0.0),..default()});// lightcommands.spawn(PointLightBundle {point_light: PointLight {intensity: 1500.0,shadows_enabled: true,..default()},transform: Transform::from_xyz(4.0, 8.0, 4.0),..default()});let camera_controller = CameraController::default();// cameracommands.spawn((Camera3dBundle {transform: Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y),..default()},camera_controller));
    }
    
  • 将GamePlugin中的代码修改下进行测试
    impl Plugin for GamePlugin {fn build(&self, app: &mut App) {app.add_state::<GameState>().add_plugins((// LoadingPlugin,// MenuPlugin,SceneSetupPlugin,// ActionsPlugin,// InternalAudioPlugin,// PlayerPlugin,CameraControllerPlugin));#[cfg(debug_assertions)]{app.add_plugins((FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin::default()));}}
    }
    
  • 结果
    在这里插入图片描述

控制方块

  • 上面的测试中我们将游戏流程注释掉了,现在我们尝试加回来,并将方块作为我们的Player
  • 首先将player设置为方块(不要忘记将上面场景中的方块去掉)
    fn spawn_player(mut commands: Commands, mut meshes: ResMut<Assets<Mesh>>,mut materials: ResMut<Assets<StandardMaterial>>) {commands.spawn(PbrBundle {mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),material: materials.add(Color::rgb_u8(124, 144, 255).into()),transform: Transform::from_xyz(0.0, 1., 0.0),..default()}).insert(Player);
    }
    
  • 然后将actions中的相机改为3d
    pub fn set_movement_actions(mut actions: ResMut<Actions>,keyboard_input: Res<Input<KeyCode>>,touch_input: Res<Touches>,player: Query<&Transform, With<Player>>,camera: Query<(&Camera, &GlobalTransform), With<Camera3d>>,
    ) {// ...
    }
    
  • 然后我们先去掉menu中的相机
    fn setup_menu(mut commands: Commands, textures: Res<TextureAssets>) {info!("menu");// commands.spawn(Camera2dBundle::default());// ...
    
  • 结果(将move_player中的速度调低点)
    在这里插入图片描述
  • 不过这里我们的ui和场景显示到一块了,后面再看看怎么处理

问题

  • note: LINK : fatal error LNK1189: 超过 65535 对象的库限制
    参考这个解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chapter 8 怎样使用类和对象(下篇)

⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ 8.2 对象数组 1.对象数组的每一个元素都是同类的对象 2.在建立数组时&#xff0c;同样…

听觉障碍应该找哪些专业人士?如何获得这些职业?

如果您有听觉障碍的困扰可以寻求以下专业人士的帮助。如果你有兴趣从事听力学职业&#xff0c;可以考虑以下 十几个选项&#xff1a; 1. 临床听力学家 临床听力学家检查患者以诊断他们的听力、平衡或耳朵相关问题。他们与所有年龄段的患者一起工作&#xff0c;或专门针对特定群…

Linux - No space left on device

问题描述 No space left on device 原因分析 说明在服务器设备上的存储空间已经满了&#xff0c;不能再上传或者新建文件夹或者文件等。 解决方案 确认查看服务器系统的磁盘使用情况是否是真的已经没有剩余空间&#xff0c;复制下面命令在服务器上运行&#xff0c;然后发现如果…

Edge浏览器入门

关于作者&#xff1a; CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP&#xff0c;带领团队单日营收超千万。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业化变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览…

泊松流生成模型简介

一、说明 泊松流生成模型 (PFGM) 是一种新型的生成深度学习模型&#xff0c;与扩散模型类似&#xff0c;其灵感来自物理学。在这本简单易懂的指南中了解 PFGM 背后的理论以及如何使用它们生成图像。 生成式人工智能模型在过去几年中取得了长足的进步。受物理启发的扩散…

Ubuntu 22.0.4 忘记重置 MySQL 密码

Ubuntu 22.0.4 忘记重置 MySQL 密码 一、问题描述二、解决办法 一、问题描述 Ubuntu 22.0.4 忘记了 MySQL的密码&#xff0c;需要重新设置密码 环境描述&#xff1a; 系统&#xff1a;Ubuntu 22.0.4 MySQL&#xff1a;8.0.35 &#xff08;通过 apt install mysql-sever 安装的…

day18【LeetCode力扣】19.删除链表的倒数第N个结点

day18【LeetCode力扣】19.删除链表的倒数第N个结点 1.题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&a…

What is `addArgumentResolvers` does in `WebMvcConfigurer` ?

addArgumentResolvers 在SpringMVC框架中&#xff0c;主要用于向Spring容器注册自定义的参数解析器。在处理HTTP请求时&#xff0c;SpringMVC会使用这些参数解析器将请求中的数据&#xff08;如查询参数、路径变量、表单数据等&#xff09;转换并注入到控制器方法的参数中。 使…

一、Mindspore 公开课 - Transformer

课程链接&#xff1a;Mindspore 技术公开课 Transformer 论文地址&#xff0c;建议看完课程以后简单看看论文 前言 Transformer是一种神经网络结构&#xff0c;由Vaswani等人在2017年的论文“Attention Is All You Need” 中提出&#xff0c;用于处理机器翻译、语言建模和文…

element表格数据,表头上(下)角标,html字符串渲染

1. 问题描述 在动态渲染的element表格中&#xff0c;表头和表中数据是一个含有html的字符串&#xff0c;需要渲染 2. 效果 3. 代码 const columns ref([{ text: 差值<sub>-3</sub> / 10<sup>-6</sup>℃<sup>-1</sup>, value: aallowEr…

Docker运行RabbitMQ并使用SpringAMQP操作

文章目录 一、RabbitMQ运行二、整合SpringAMQP1. 引入依赖 三、测试1. 消费者2. 生产者3. 运行 一、RabbitMQ运行 拉取docker镜像 docker pull rabbitmq:3-management基础运行命令 docker run \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_PASSrabbitmq \--name…

Velodyne 64E S3 硬件连接和 velodyne_driver ROS驱动安装

在当前的研究工作中&#xff0c;点云语义分割技术的应用显得尤为重要&#xff0c;而我选择了rangenet作为分割算法的核心。尽管课题组拥有一款80线激光雷达&#xff0c;但是在实际测试中&#xff0c;我们发现该算法模型在我们的数据集上的泛化表现并不理想。为了改善这一情况&a…

GRE隧道(初级VPN)配置步骤

一、拓朴图&#xff1a; 二、配置步骤&#xff1a; 1、配置IP 2、R1、R2 配置nat&#xff0c;代理内网地址通过G0/0/0口上外网 acl 2000rule permit source anyquit # int G0/0/0ip addr 100.1.1.1 24nat outbound 2000 # 3、R1、R2 配置默认出口路由G0/0/0&#xff0c;这一…

java+ssm+vue代码视频学习讲解

一、ssm 1.项目文件结构 2.数据库连接信息 3.其他配置信息 4.java代码文件目录介绍 5.entity层代码 6.controller&#xff0c;service&#xff0c;dao&#xff0c;entity层之间的关系 7.controller层代码 8.登陆拦截功能实现 AuthorizationInterceptor.java 9.文件上传功能 …

【笔记------coremark】单片机上的跑分库coremark移植

coremark的官方仓库&#xff1a;https://github.com/eembc/coremark 官方收录了很多单片机的跑分情况&#xff1a;https://www.eembc.org/coremark/scores.php 这个是我建立的一个仓库&#xff0c;用来收集自己用到的一些单片机的跑分情况&#xff1a;https://gitee.com/wild_c…

单容水箱液位定值控制实验

实验1 单容水箱液位定值控制实验 一、实验目的 1、通过实验熟悉单回路反馈控制系统的组成和工作原理。 2、分析分别用P、PI和PID调节时的过程图形曲线。 3、定性地研究P、PI和PID调节器的参数对系统性能的影响。 二、实验设备 A3000现场系统&#xff0c;任何一个控制系统…

[AutoSar]基础部分 RTE 08 runnable mapping

目录 关键词平台说明一、runnable mapping的必要性二、runnable mapping 通用规则三、Task type四、可以不用mapping的runnbale 关键词 嵌入式、C语言、autosar、runnable 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (…

手撕乘积(**Multiplication** **Product**): 穷举和图示(1)

手撕乘积(Multiplication & Product): 穷举和图示(1) 乘积 r ⋅ s ∑ i 1 s r r r ⋯ r ⏟ s times ∑ j 1 r s s s ⋯ s ⏟ r times r\cdot s\sum _{i1}^{s}r\underbrace {rr\cdots r} _{s{\text{ times}}}\sum _{j1}^{r}s\underbrace {ss\cdots s} _{r{\tex…

数据库单表查询

1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表…

线上问题整理

JVM 案例 案例一&#xff1a;服务器内存不足&#xff0c;影响Java应用 问题&#xff1a; 收到报警&#xff0c;某Java应用集群中一台服务器可用内存不足&#xff0c;超过报警阈值。 排查过程&#xff1a; 首先&#xff0c;通过Hickwall查看该应用各项指标&#xff0c;发现无论…