首页 > 其他分享 >0237-RLTK-控制角色移动

0237-RLTK-控制角色移动

时间:2024-08-16 16:27:51浏览次数:19  
标签:RLTK 角色 mut self 0237 pos state world rltk

环境

  • Time 2022-11-29
  • WSL-Ubuntu 22.04
  • RLTK 0.8.7

前言

说明

参考:https://bfnightly.bracketproductions.com/rustbook

目标

使用键盘来控制角色在窗口中进行移动。

Component

#[derive(Component)]
struct Position {
    x: i32,
    y: i32,
}

#[derive(Component)]
struct Renderable {
    glyph: rltk::FontCharType,
    fg: RGB,
    bg: RGB,
}

#[derive(Component)]
struct LeftWalker {}

#[derive(Component, Debug)]
struct Player {}

System


impl<'a> System<'a> for LeftWalker {
    type SystemData = (ReadStorage<'a, LeftWalker>, WriteStorage<'a, Position>);

    fn run(&mut self, (lefty, mut pos): Self::SystemData) {
        for (_lefty, pos) in (&lefty, &mut pos).join() {
            pos.x -= 1;
            if pos.x < 0 {
                pos.x = 79;
            }
        }
    }
}

fn move_player(delta_x: i32, delta_y: i32, world: &mut World) {
    let mut positions = world.write_storage::<Position>();
    let mut players = world.write_storage::<Player>();

    for (_player, pos) in (&mut players, &mut positions).join() {
        pos.x = min(79, max(0, pos.x + delta_x));
        pos.y = min(49, max(0, pos.y + delta_y));
    }
}

fn player_input(state: &mut State, context: &mut Rltk) {
    if let Some(key) = context.key {
        match key {
            VirtualKeyCode::Left => move_player(-1, 0, &mut state.world),
            VirtualKeyCode::Right => move_player(1, 0, &mut state.world),
            VirtualKeyCode::Up => move_player(0, -1, &mut state.world),
            VirtualKeyCode::Down => move_player(0, 1, &mut state.world),
            _ => {}
        }
    }
}

GameState


struct State {
    world: World,
}
impl GameState for State {
    fn tick(&mut self, ctx: &mut Rltk) {
        ctx.cls();

        player_input(self, ctx);
        self.run_systems();
        let positions = self.world.read_storage::<Position>();
        let renderables = self.world.read_storage::<Renderable>();

        for (pos, render) in (&positions, &renderables).join() {
            ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
        }
    }
}

impl State {
    fn run_systems(&mut self) {
        let mut lw = LeftWalker {};
        lw.run_now(&self.world);
        self.world.maintain();
    }
}

main

fn main() -> rltk::BError {
    let context = rltk::RltkBuilder::simple80x50()
        .with_title("冒险游戏")
        .build()?;

    let mut state = State {
        world: World::new(),
    };
    state.world.register::<Position>();
    state.world.register::<Renderable>();
    state.world.register::<LeftWalker>();
    state.world.register::<Player>();

    state
        .world
        .create_entity()
        .with(Position { x: 40, y: 25 })
        .with(Renderable {
            glyph: rltk::to_cp437('@'),
            fg: RGB::named(rltk::YELLOW),
            bg: RGB::named(rltk::BLACK),
        })
        .with(Player {})
        .build();

    for i in 0..10 {
        state
            .world
            .create_entity()
            .with(Position { x: i * 7, y: 20 })
            .with(Renderable {
                glyph: rltk::to_cp437('☺'),
                fg: RGB::named(rltk::RED),
                bg: RGB::named(rltk::BLACK),
            })
            .with(LeftWalker {})
            .build();
    }

    rltk::main_loop(context, state)
}

效果

控制角色移动

总结

使用键盘来控制角色移动。

附录

源码

use rltk::prelude::*;
use specs::prelude::*;
use specs_derive::Component;

struct State {
    world: World,
}
impl GameState for State {
    fn tick(&mut self, ctx: &mut Rltk) {
        ctx.cls();

        self.run_systems();
        let positions = self.world.read_storage::<Position>();
        let renderables = self.world.read_storage::<Renderable>();

        for (pos, render) in (&positions, &renderables).join() {
            ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
        }
    }
}

impl State {
    fn run_systems(&mut self) {
        let mut lw = LeftWalker {};
        lw.run_now(&self.world);
        self.world.maintain();
    }
}

fn main() -> rltk::BError {
    let context = rltk::RltkBuilder::simple80x50()
        .with_title("冒险游戏")
        .build()?;

    let mut state = State {
        world: World::new(),
    };
    state.world.register::<Position>();
    state.world.register::<Renderable>();
    state.world.register::<LeftWalker>();

    state
        .world
        .create_entity()
        .with(Position { x: 40, y: 25 })
        .with(Renderable {
            glyph: rltk::to_cp437('@'),
            fg: RGB::named(rltk::YELLOW),
            bg: RGB::named(rltk::BLACK),
        })
        .build();

    for i in 0..10 {
        state
            .world
            .create_entity()
            .with(Position { x: i * 7, y: 20 })
            .with(Renderable {
                glyph: rltk::to_cp437('☺'),
                fg: RGB::named(rltk::RED),
                bg: RGB::named(rltk::BLACK),
            })
            .with(LeftWalker {})
            .build();
    }

    rltk::main_loop(context, state)
}

#[derive(Component)]
struct Position {
    x: i32,
    y: i32,
}

#[derive(Component)]
struct Renderable {
    glyph: rltk::FontCharType,
    fg: RGB,
    bg: RGB,
}

#[derive(Component)]
struct LeftWalker {}

impl<'a> System<'a> for LeftWalker {
    type SystemData = (ReadStorage<'a, LeftWalker>, WriteStorage<'a, Position>);

    fn run(&mut self, (lefty, mut pos): Self::SystemData) {
        for (_lefty, pos) in (&lefty, &mut pos).join() {
            pos.x -= 1;
            if pos.x < 0 {
                pos.x = 79;
            }
        }
    }
}

标签:RLTK,角色,mut,self,0237,pos,state,world,rltk
From: https://www.cnblogs.com/jiangbo4444/p/18363127

相关文章

  • 0238-RLTK-生成大地图
    环境Time2022-11-29WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook目标基于前一节的内容,生成一张可以让角色移动的大地图。地板和墙#[derive(PartialEq,Copy,Clone)]enumTileType{Wall,Floor}计算坐标pub......
  • 0239-RLTK-分割不同文件
    环境Time2022-11-30WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook目标基于前一节的内容,随着main.rs文件中的内容越来越多,将其进行分割。comp.rsuserltk::RGB;usespecs::prelude::*;usespecs_derive::Component;......
  • 0240-RLTK-生成小房间
    环境Time2022-11-30WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook目标基于前一节的内容,生成两个小房间,只修改map.rs文件。生成房间函数fnapply_room_to_map(room:&Rect,map:&mut[TileType]){foryinroom......
  • .NET辅助角色服务入门简介
    在日常开发中,并不是所有的功能都是用户可见的,还在一些背后默默支持的程序,这些程序通常以服务的形式出现,统称为辅助角色服务。今天以一个简单的小例子,简述基于.NET开发辅助角色服务的相关内容,仅供学习分享使用,如有不足之处,还请指正。 概述 根据项目需求不同,创建长时间运行的......
  • 0234-RLTK-创建主程序窗口
    环境Time2022-11-29WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook/chapter_1.html目标RLTK表示RoguelikeToolkit,随机游戏工具包,使用这个包创建一个主窗口。Cargo.toml[package]edition="2021"name="game"vers......
  • 0235-RLTK-渲染静态字符
    环境Time2022-11-29WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook/目标渲染一个主窗口,并且在窗口上渲染一些静态的字符。Cargo.toml[package]edition="2021"name="game"version="0.1.0"[dependencies]rl......
  • 云台与相机在无人机里面扮演什么的角色?看完这篇文,你就明白了!!!
    一、无人机云台1.定义与功能无人机云台是无人机用于安装、固定摄像机等任务载荷的支撑设备。它的主要功能是稳定相机或传感器,通过精确控制实现稳定拍摄和拓展视角。云台通过内置的电机和传感器,能够在无人机飞行过程中保持相机的稳定,减少因震动或气流扰动造成的画面抖动,从而......
  • 大模型时代下产品经理的角色转变与策略调整
    随着人工智能技术的飞速发展,大模型时代已经悄然来临,对各行各业产生了深远的影响,尤其是对产品经理这一角色提出了前所未有的挑战与机遇。在这个新的时代背景下,产品经理需要深刻理解大模型的价值,调整工作策略,实现从传统产品经理向“问题型”和“发现型”产品经理的转变,以适应......
  • Character Animator 2022软件:让角色动画制作变得轻松愉悦
    在当今这个多媒体内容盛行的时代,动画已经成为了人们获取信息和娱乐的重要途径。为了满足广大用户对高质量角色动画制作的需求,Adobe公司推出了一款备受好评的角色动画软件——CharacterAnimator2022。今天,我们就来详细了解一下这款功能强大、易于使用的角色动画神器。Chara......
  • UE5学习笔记12-为角色添加蹲下的动作
    一、一点说明    1.蹲下使用了ACharacter类中Crouch();函数,函数功能是先检查是否存在运动组件,将bool类型的变量变为true,该变量代表是想要蹲下。      2.通过源码可知存在是否蹲下的bool变量bIsCrouched如图,如果对:1有疑问请搜索C++位域二、代码实现 ......