如何避免在 Allegro 5 中重绘静态背景?
How to avoid to redraw static background in Allegro 5?
当我初始化 Allegro 时,我画了一个 2D table,它的单元格会在程序中改变 white/black
//Global variables
int** board;
//Draw 2D board
for (int i = 0; i < SCREEN_H ; i++) {
for (int j = 0; j < SCREEN_W; j++) {
al_draw_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, BLACK, 1.0);
}
}
al_flip_display();
在 while 循环之前,它初始化 2D 动态指针 board,随机值介于 0 和 1 之间。
在 while 循环中我改变了单元格的颜色
//changes the values of board based on the rules of the Conway's Game of Life
generate();
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j) {
//Redrawing the table
al_draw_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, BLACK, 1.0);
if(board[i][j] == 1){
al_draw_filled_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, BLACK);
}else{
al_draw_filled_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, WHITE);
}
}
}
但在 for 循环中我需要再次重绘 table。
如何避免在绘制单个单元格时Allegro重绘静态背景?
我认为没有简单的方法可以做到这一点,无论如何,在单元格之前重绘背景会更简单,每一帧。
如果你的背景没有太大变化或根本没有变化,你可以将它存储在纹理中并绘制它。这个叫Painter's algorithm,一开始做起来很简单,推理也很简单。
如果你真的不想重绘背景,你可以做的是当你改变隐藏背景的单元格的值时,你应该存储那块背景,当那个单元格"dies",再次退缩。以前的游戏用的很多,今天可能还用很多,我不知道。
如果您的大部分框架变化很大,那么重新绘制所有内容似乎是最简单的事情。 (我的直觉是它是最有效的,但我可能是错的)。
There's a a question over on gamedev network that goes deeper into what you're asking..
当我初始化 Allegro 时,我画了一个 2D table,它的单元格会在程序中改变 white/black
//Global variables
int** board;
//Draw 2D board
for (int i = 0; i < SCREEN_H ; i++) {
for (int j = 0; j < SCREEN_W; j++) {
al_draw_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, BLACK, 1.0);
}
}
al_flip_display();
在 while 循环之前,它初始化 2D 动态指针 board,随机值介于 0 和 1 之间。
在 while 循环中我改变了单元格的颜色
//changes the values of board based on the rules of the Conway's Game of Life
generate();
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j) {
//Redrawing the table
al_draw_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, BLACK, 1.0);
if(board[i][j] == 1){
al_draw_filled_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, BLACK);
}else{
al_draw_filled_rectangle((j) * CELL_SIZE, (i) * CELL_SIZE, (j + 1) * CELL_SIZE, (i + 1) * CELL_SIZE, WHITE);
}
}
}
但在 for 循环中我需要再次重绘 table。
如何避免在绘制单个单元格时Allegro重绘静态背景?
我认为没有简单的方法可以做到这一点,无论如何,在单元格之前重绘背景会更简单,每一帧。
如果你的背景没有太大变化或根本没有变化,你可以将它存储在纹理中并绘制它。这个叫Painter's algorithm,一开始做起来很简单,推理也很简单。
如果你真的不想重绘背景,你可以做的是当你改变隐藏背景的单元格的值时,你应该存储那块背景,当那个单元格"dies",再次退缩。以前的游戏用的很多,今天可能还用很多,我不知道。
如果您的大部分框架变化很大,那么重新绘制所有内容似乎是最简单的事情。 (我的直觉是它是最有效的,但我可能是错的)。
There's a a question over on gamedev network that goes deeper into what you're asking..