【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.rhkb.cn/news/237601.html

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

相关文章

自动驾驶apollo9.0 Dreamview Debug方法

Apollo 9.0 安装&编译方法 # 拉取源码 git clone gitgithub.com:ApolloAuto/apollo.git git checkout v9.0.0# 启动docker bash docker/scripts/dev_start.sh bash docker/scripts/dev_into.sh# 编译project ./apollo.sh build默认启动方式 default mode wget https:…

在海绵城市建设中,低功耗遥测终端有哪些独特的优势?

近年来&#xff0c;随着物联网技术的迅猛发展&#xff0c;数据监测和传输已经成为各行各业不可或缺的环节。在诸多特殊环境中因供电问题、潮湿、不便进入等诸多原因&#xff0c;需要一款功耗低、数据传输稳定&#xff0c;防潮抗锈蚀的低功耗遥测终端。 为满足这一需求&#xf…

统信UOS操作系统上禁用IPv6

原文链接&#xff1a;统信UOS操作系统上禁用IPv6 hello&#xff0c;大家好啊&#xff01;继之前我们讨论了如何在麒麟KYLINOS上禁用IPv6之后&#xff0c;今天我要给大家带来的是在统信UOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议&#xff0c;但在某些特定的网络环境…

计算机三级(网络技术)——综合题(Sniffer抓包分析)

考点内容&#xff1a; DNS域名解析TCP三次握手FTP(文件传输协议)ICMP(Internet控制报文协议)&#xff1a;ping、tracertHTTP(超文本传输协议)&#xff1a;get、post命令 例题一 下图是校园网某台主机在命令行模式下执行某个命令时用sniffer捕获的数据包。 抓包分析 5~8行为…

RibbonGroup 添加QRadioButton

RibbonGroup添加QRadioButton&#xff1a; QRadioButton * pRadio new QRadioButton(tr("Radio")); pRadio->setToolTip(tr("Radio")); groupClipboard->addWidget(pRadio); connect(pRadio, SIGNAL(clicked(…

Redis分布式锁--java实现

文章目录 Redis分布式锁方案&#xff1a;SETNX EXPIRE基本原理比较好的实现会产生四个问题 几种解决原子性的方案方案&#xff1a;SETNX value值是&#xff08;系统时间过期时间&#xff09;方案&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令)方案&#xff1a;SET的扩展…

RSIC-V“一芯”学习笔记(二)——Linux入门教程

文章目录 一、前言二、Busybox套件三、重要的追踪工具——strace四、Shell五、正则表达式六、重定向&#xff08;多次输入测试时&#xff09;七、一些组合命令八、自动化脚本九、学会查阅十、亲&#xff08;yuan&#xff09;近(li) bai du十一、不要逃避困难十二、重视小问题 一…

设计模式之解释器模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

(南京观海微电子)——色温介绍

色温是表示光线中包含颜色成分的一个计量单位。从理论上说&#xff0c;黑体温度指绝对黑体从绝对零度&#xff08;&#xff0d;273℃&#xff09;开始加温后所呈现的颜色。黑体在受热后&#xff0c;逐渐由黑变红&#xff0c;转黄&#xff0c;发白&#xff0c;最后发出蓝色光。当…

经典目标检测YOLO系列(二)YOLOv2算法详解

经典目标检测YOLO系列(二)YOLOv2算法详解 YOLO-V1以完全端到端的模式实现达到实时水平的目标检测。但是&#xff0c;YOLO-V1为追求速度而牺牲了部分检测精度&#xff0c;在检测速度广受赞誉的同时&#xff0c;其检测精度也饱受诟病。正是由于这个原因&#xff0c;YOLO团队在20…

修改SSH默认端口,使SSH连接更安全

以CentOS7.9为例&#xff1a; 1、修改配置文件 vi /etc/ssh/sshd_config 2、远程电脑可连接&#xff0c;暂时将SELinux关闭 # 查询状态 getenforce # 关闭 setenforce 0 # 开启 setenforce 1 3、SELinux设置&#xff08;如果启用&#xff09;&#xff0c;semanage管理工具安…

Python教程(24)——全方位解析Python中的装饰器

Python装饰器是一种特殊的函数&#xff0c;它接收一个函数作为参数&#xff0c;然后返回一个新的函数&#xff0c;用于扩展或修改原始函数的行为。装饰器提供了一种便捷的方式来在不修改被装饰函数源代码的情况下&#xff0c;增加、修改或包装函数的功能。通俗点说就是尽量不修…

12.2内核空间基于SPI总线的OLED驱动

在内核空间编写SPI设备驱动的要点 在SPI总线控制器的设备树节点下增加SPI设备的设备树节点&#xff0c;节点中必须包含 reg 属性、 compatible 属性、 spi-max-frequency 属性&#xff0c; reg 属性用于描述片选索引&#xff0c; compatible属性用于设备和驱动的匹配&#xff…

【MATLAB源码-第111期】基于matlab的SCMA系统误码率仿真,采用polar码编码,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 SCMA&#xff08;Sparse Code Multiple Access&#xff09;系统是一种先进的多用户多输入多输出&#xff08;MU-MIMO&#xff09;通信系统&#xff0c;它采用了一种独特的多址访问技术&#xff0c;旨在提高无线通信网络的效率…

C语言实现快排核心思想(双指针法)

核心代码&#xff1a; 这就是每一趟快排的实现代码&#xff0c;由上面的动图&#xff0c;我们能知道前后指针法的核心是玩好cur和prev这两个指针&#xff0c;具体的逻辑是cur找比key小的值&#xff0c;找到就prev&#xff0c;然后prev和cur的值就进行交换&#xff0c;但是总不能…

通过shell脚本确定当前平台

shell中的变量OSTYPE存储操作系统的名称&#xff0c;也可以使用uname命令来确认当前所在的平台。 shell中的变量HOSTTYPE存储操作系统的架构。 测试代码如下所示&#xff1a; #! /bin/bashecho "use OSTYPE:" if [[ "$OSTYPE" "linux-gnu&quo…

TypeScript类型挑战:实现RequiredByKeys实用类型

​内置的必填泛型不够灵活&#xff0c;RequiredByKeys 泛型来救场。 为了帮助读者更好地巩固 TypeScript 的知识&#xff0c;我从 Github 上的 type-challenges 库中选择了几十个挑战&#xff0c;与您一起完成类型挑战。 挑战 实现一个通用的 RequiredByKeys<T, K> …

四、Qt 的第一个demo

在上一篇章节里《三、Qt Creator 使用》&#xff0c;我们介绍了如何使用Qt Creator创建一个简单的带窗体的demo&#xff0c;在这一章节里&#xff0c;我们详细讲解一下这个demo的文件组成&#xff0c;及主函数&#xff0c;并在UI上加一些控件&#xff0c;实现一些简单的功能。 …

【面试突击】Java面试底层逻辑(HashMap、ConcurrentHashMap面试实战)

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

js封装根据年月日获取星座效果demo(整理)

//根据年月日获取星座 function getZodiacSign(dateString) {// 用法:const dateStr 2024-01-11;// const zodiacSign getZodiacSign(dateStr);const date new Date(dateString);const month date.getMonth() 1;const day date.getDate();if ((month 1 && day &…