如何在供过于求中一个字母一个字母地绘制文本
How to draw text letter by letter in glut?
我无法使GLUT程序正常工作。我想以毫秒为间隔逐个字母地绘制文本(一个字符数组)。我的程序:
#include <string.h>
#include <windows.h>
#include <glut.h>
#include<iostream>
int hei = glutGet(GLUT_SCREEN_HEIGHT)/2;
int wid = glutGet(GLUT_SCREEN_WIDTH)/2;
void *font = GLUT_BITMAP_TIMES_ROMAN_24;
void *fonts[] =
{
GLUT_BITMAP_9_BY_15,
GLUT_BITMAP_TIMES_ROMAN_10,
GLUT_BITMAP_TIMES_ROMAN_24
};
void selectFont(int newfont)
{
font = fonts[newfont];
glutPostRedisplay();
}
void selectColor(float r, float g, float b)
{
glColor3f(r, g, b);
glutPostRedisplay();
}
char *msg;
void tick(void)
{
glutPostRedisplay();
}
void timer(int value) {
}
int element=0;
void output(int x, int y, char *string, bool center=true) {
int len;
len = strlen(string);
if(center){
glRasterPos2f((wid-len), y);
}
else {
glRasterPos2f(x, y);
}
for(int i=0;i<len;i++) {
glutBitmapCharacter(font, string[i]);
glPopMatrix();
glutSwapBuffers();
Sleep(500);
}
}
void outputmsg(int x, int y, bool center=true) {
int len;
len = strlen(msg);
if(center){
glRasterPos2f((wid-len), y);
}
else {
glRasterPos2f(x, y);
}
for(int i=0;i<len;i++) {
glutBitmapCharacter(font, msg[i]);
}
}
void updatemsg() {
msg="test msg letter by letter";
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
msg="|";
updatemsg();
if(msg!="|")
output(wid, hei, msg, true);
else
output(wid,hei,msg,true);
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
glMatrixMode(GL_MODELVIEW);
}
void keyboard(unsigned char key, int x, int y) {
switch(key){
case 27:
exit(1);
break;
}
}
int main(int argc, char **argv)
{
int i, msg_submenu, color_submenu;
glutInit(&argc, argv);
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-mono")) {
font = GLUT_BITMAP_9_BY_15;
}
}
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(wid*2, hei*2);
glutCreateWindow("CHAT");
glutFullScreen();
glClearColor(0.0, 0.0, 0.0, 1.0);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutIdleFunc(tick);
selectFont(0);
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
它会做一些非常奇怪的事情,比如擦除前一个字符,然后打印下一个字符和擦除的字符。我在论坛上尝试了我能找到的关于这个话题的一切。我该怎么修?
您应该做的是保持要显示的字符串的长度,并每隔几毫秒递增一次:
int len;
char *msg;
void incrementLength(int value){
if(msg[len]==0)return; //end of string stop the callback
len++;
glutTimerFunc(100, incrementLength, 0);
glutPostRedisplay();
}
void updatemsg() {
msg="test msg letter by letter";
len=0;
glutTimerFunc(100, incrementLength, 0);
}
然后在outputmsg(如果你真的调用它)中,你只循环到len:
void outputmsg(int x, int y, bool center=true) {
if(center){
glRasterPos2f((wid-len), y);
}
else {
glRasterPos2f(x, y);
}
for(int i=0;i<len;i++) {
glutBitmapCharacter(font, msg[i]);
}
}
此代码有几个问题:
for(int i=0;i<len;i++) {
glutBitmapCharacter(font, string[i]);
glPopMatrix();
glutSwapBuffers();
Sleep(500);
}
你弹出了一个从未被推到任何地方的矩阵,你正在做
len
——很多次。您正在交换缓冲区,而没有清除其间的屏幕。。。这将导致未定义的结果(通常是前一帧中混乱的字符)。
你真的需要重新思考你是如何实现这一点的。
我建议您在display (...)
函数中实现一些运行时间检查,以确定要打印哪个字符,而不是在调用Sleep (...)
的循环中执行此操作。
相关文章:
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 绘制一个对象,比较模具缓冲区的两个不同值
- 使用 glDrawElements 绘制一个 std::vector
- 我正在尝试创建一个 C++ 贪吃蛇游戏,但我似乎无法绘制第二个高度边框,我该如何解决这个问题?
- 如何在openGL C++中绘制一个空心圆
- 尝试绘制存储在数组中的矩形,但只出现一个矩形?
- Opencv,在图像中的对象周围绘制一个框
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 图层不会绘制另一个图层
- 绘制椭圆延迟并绘制另一个椭圆延迟
- OPENCV C .在for循环中在不同的图像像素上绘制一个圆圈(应在每个循环运行时将图像打开)
- 直接X 11:在屏幕上绘制一个简单的彩色矩形
- 使用 C++ 库 GLEW 在 openGl 中绘制一个红色三角形
- 在另一个线程中绘制 OpenGL
- 如何在 MFC 中围绕当前光标的位置绘制一个矩形
- SFML在另一个对象上方绘制对象
- 创建一个包含要绘制的项的类(seg-fault)
- 为什么我的 OpenGL 对象相对于最后一个绘制的对象绘制
- 如何保持一个绘制矩形在相同的地方,因为相机周围移动
- 是否有可能保存当前的视口,然后在OpenGL和c++中在下一个绘制周期中重新绘制保存的视口?