我正在构建一个 6502 模拟器,我希望以可视方式表示 cpu 和内存状态。
我正在使用 SDL2 来实现此目的。当 6502 cpu 或内存改变状态时,我必须在 SDL 窗口上渲染文本。
即我希望以文本和数字的形式显示整个内存内容、当前正在执行的指令、先前的CPU状态、当前的CPU状态。
这是我尝试使用 Linux 系统中已有的字体来呈现文本。后来我希望渲染动态文本和数字而不是静态字符串。
#include<SDL2/SDL.h>
#include<SDL2/SDL_ttf.h>
#define SCREEN_HEIGHT 640
#define SCREEN_WIDTH 480
int quit=false;
SDL_Window *window;
SDL_Renderer *renderer;
int initializeDrawing(int argc,char** argv){
if (SDL_Init(SDL_INIT_VIDEO) != 0){
std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
window = SDL_CreateWindow("6502 cpu display!", 100, 100, SCREEN_HEIGHT, SCREEN_WIDTH, SDL_WINDOW_SHOWN);
if (window == nullptr){
std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr){
SDL_DestroyWindow(window);
std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
if (TTF_Init() != 0){
SDL_Quit();
return 1;
}
return 0;
}
void loop(){
TTF_Font* Sans = TTF_OpenFont("./ttf/LH.ttf", 13);
SDL_Color White = {255,255,255};
SDL_Surface* surfaceMessage = TTF_RenderText_Solid(Sans, "0xABCEDFGHIJKLMNOPQRSTUVWXYZ", White);
SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage);
SDL_Rect Message_rect;
Message_rect.x = 0;
Message_rect.y = 0;
Message_rect.w = surfaceMessage->w;
Message_rect.h = surfaceMessage->h;
//loop
SDL_Event e;
while(!quit){
SDL_PollEvent(&e);
//If user closes the window
if (e.type == SDL_QUIT){
quit = true;
}
//First clear the renderer
SDL_RenderClear(renderer);
//Draw the texture
SDL_RenderCopy(renderer, Message, NULL, &Message_rect);
//Update the screen
SDL_RenderPresent(renderer);
//Take a quick break after all that hard work
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
Run Code Online (Sandbox Code Playgroud)
这是输出
SDL2_ttf 有几种不同的文本渲染模式。
您正在使用文档Solid描述为“快速而肮脏”的模式:
渲染模式分为三种:
固体:快速而肮脏
创建 8 位调色板表面并使用给定字体和颜色以快速质量渲染给定文本。像素值 0 是 colorkey,在位块传送时给出透明背景。像素和颜色图值 1 设置为文本前景色。这允许您更改颜色而无需再次渲染文本。当位图传输到另一个表面时,调色板索引 0 当然不会绘制,因为它是色键,因此是透明的,尽管它的实际颜色是 255 减去前景色的每个 RGB 分量。这是所有渲染模式中最快的渲染速度。这会导致文本周围没有框,但文本不那么平滑。生成的表面应该比混合表面更快。使用此模式进行 FPS 和其他快速变化的更新文本显示。
阴影:缓慢而美好,但有一个坚固的盒子
创建 8 位调色板化表面,并使用给定的字体和颜色以高质量渲染给定的文本。0像素值是背景,而其他像素具有不同程度的前景色和背景色。这会在前景色文本周围产生一个背景色框。文本已消除锯齿。这将比实体渲染速度慢,但与混合模式的渲染时间大致相同。一旦制作完成,生成的表面应该与实体一样快。当您需要漂亮的文本并且可以使用盒子时,请使用此功能。
混合:慢慢慢,但在另一张图像上非常好
创建 32 位 ARGB 表面并以高质量渲染给定文本,使用 Alpha 混合以给定颜色抖动字体。这会产生具有 Alpha 透明度的表面,因此文本周围不会有纯色框。文本已消除锯齿。这将比实体渲染速度慢,但与着色模式的渲染时间大致相同。生成的表面将比使用“实体”或“着色”时的位块传送速度慢。当您想要高质量并且文本变化不太快时,请使用此选项。
如果您想要更高质量的渲染,您应该尝试*_Shaded或*_Blended函数。
另请注意,您几乎肯定希望使用TTF_RenderUTF8函数系列来确保正确呈现非拉丁字符。(这可能与您的 6502 模拟器没有直接关系,但它不会造成伤害,并且无论如何都是一个很好的做法。)更多信息:https: //wiki.libsdl.org/SDL_ttf/TTF_RenderUTF8_Blished
| 归档时间: |
|
| 查看次数: |
3617 次 |
| 最近记录: |