首页 > 其他分享 >0235-RLTK-渲染静态字符

0235-RLTK-渲染静态字符

时间:2024-08-15 11:27:41浏览次数:8  
标签:RLTK bg rltk 渲染 RGB 0235 state world glyph

环境

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

前言

说明

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

目标

渲染一个主窗口,并且在窗口上渲染一些静态的字符。

Cargo.toml

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

[dependencies]
rltk = "0.8.7"
specs = "0.18.0"
specs-derive = "0.4.1"

ECS

ECS 是一种游戏开发模式,将其分为了三种 E(Entity),C(Component)和 S(System)。
可以通过其它资料了解这种模式,specs 就是使用 ECS 的一个框架。

Component

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

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

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
        .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),
            })
            .build();
    }

    rltk::main_loop(context, state)
}

GameState

struct State {
    world: World,
}
impl GameState for State {
    fn tick(&mut self, ctx: &mut Rltk) {
        ctx.cls();
        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);
        }
    }
}

效果

渲染字符

总结

创建了游戏的主窗口,并且在窗口内渲染了几个字符。

附录

源码

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();
        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);
        }
    }
}

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
        .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),
            })
            .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,
}

标签:RLTK,bg,rltk,渲染,RGB,0235,state,world,glyph
From: https://www.cnblogs.com/jiangbo4444/p/18360567

相关文章

  • Manim的一个用于数学动画的 Python 库中渲染代码的功能。
       Code 函数是Manim(一个强大的数学动画库)中的一个重要工具,旨在将代码片段以视觉化的方式呈现。在教育和演示场合中,向观众展示算法或代码逻辑时,清晰的视觉效果是必不可少的。通过 Code 函数,用户可以轻松地将特定编程语言的代码导入,并且自定义其外观,包括字体、颜色、背景......
  • nuke渲染如何使cpu全力渲染?
    ​在视觉特效的世界里,每一帧的渲染都是对计算资源的极致挑战。Nuke,作为业界领先的节点式合成软件,提供了无与伦比的图像处理能力。但是,要想在Nuke中实现CPU的全力渲染,就需要深入了解其渲染设置和系统优化策略。本文将探讨如何通过调整Nuke的渲染参数和系统配置,来最大限度地提高CPU......
  • unity2022.3.9+Pico更换渲染管线后打包,人物材质不可显示问题
    为了解决字体和场景闪烁问题吗,更换渲染管线旧项目管线是URP 新的项目管线是内置管线buildin()  内置管线需要设置两个地方,可以解决人物材质不显示问题1.PICO-StereoRenderingMode选择 MultiPass模式 2,Player-OtherSetting-AutoGraphicsAPI勾选(注:项目中有......
  • Maya 2025.2版本新特性:携手云渲染,释放创作潜能
    Autodesk近期推出了Maya2025.2,这一重大更新为视觉特效、动画制作和游戏开发领域的专业创作者带来了一系列创新功能。同时,MayaCreative2025.2以其用户友好的设计,为小型工作室的艺术家们提供了更轻松的入门体验。现在,结合云渲染技术,Maya2025.2版本不仅带来了技术上的突破,更......
  • Vue 3 SSR的革新之旅:服务器端渲染的改进与实践
    服务器端渲染(SSR)是一种将Web应用的UI渲染过程放在服务器端进行的技术。Vue3对SSR的支持进行了全面改进,提升了性能和开发体验。本文将探讨Vue3中SSR的改进点,并提供实践指南。一、SSR的概念与优势SSR允许服务器直接发送完整的HTML文档给客户端,这有助于提高首屏加载速度,改......
  • 使用 Nuxt 3 的 defineRouteRules 进行页面级别的混合渲染
    title:使用Nuxt3的defineRouteRules进行页面级别的混合渲染date:2024/8/12updated:2024/8/12author:cmdragonexcerpt:摘要:本文介绍了Nuxt3中的defineRouteRules功能,用于实现页面级别的混合渲染配置。通过启用实验性选项inlineRouteRules,开发者能够在nuxt.config......
  • 虚拟DOM如何被渲染产生的?(虚拟DOM和diff算法(上))
    虚拟DOM如何被渲染产生的?答:h函数h函数的使用:1.产生虚拟节点(vnode)2.h函数可以嵌套,从而得到虚拟DOM树1.产生虚拟节点import{init,classModule,propsModule,styleModule,eventListenersModule,h}from"snabbdom";//创建出patch......
  • 007.Vue3入门,进行列表渲染来输出循环的内容
    1、代码如下:<template><h3>列表渲染</h3><pv-for="(item,index)ofnames">序号:{{index}},内容:{{item}}</p><divv-for="itemofresult"><p>ID:{{item.id}},PKID:{{item.pkid}}</p>......
  • React性能之--如何避免组件重复渲染?
         在react中,我们会发现存在组件会重复渲染,虽然说如果项目不大的话,这点影响不大,但是我们还是尽量避免组件渲染比较好,养成好习惯,尽可能让不管是大小项目,都让性能尽可能优化。那我们如何避免组件重复渲染呢?  一、在React中,可以通过以下几种方法来避免组件重复......
  • antd-tabs切换数据重复渲染
    两个tabs来回切换的时候,发现一直重复渲染数据,在两个tabs的展示上加一个flag标识,然后用v-if,判断,点击到tab1的时候,flag等于tab1,然后渲染tab1,点击到tab2的时候,flag等于tab2,然后渲染tab2,这样可以避免重复渲染 如下:在handleChangeActivekey方法里设置,点击tab1的时候,让tab1等于tr......