如何避免在Allegro 5中重绘静态背景?

问题描述 投票:0回答:1

初始化Allegro时,我绘制了一个二维表,程序中其单元将变为白色/黑色

//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循环中,我需要再次重绘表。

如何在绘制单个单元格时避免Allegro重绘静态背景?

c++ allegro allegro5
1个回答
0
投票

我不相信有一个简单的方法可以做到这一点,在任何情况下,只需在每个单元格之前在单元格之前重新绘制背景,就会更简单。

如果您的背景变化不大或根本没有变化,则可以将其存储在纹理中并进行绘制。这就是Painter's algorithm,它很容易做,并且一开始就推理。

[如果您真的不想重绘背景,您可以做的是,当您更改隐藏背景的单元格的值时,应存储该背景,而当该单元格“消失”时,请重新绘制再次。我不知道较早的游戏已经习惯了很多,但今天可能仍然使用了很多。

如果您的大多数框架变化很大,则重新绘制所有内容似乎只是最简单的操作。 (我的直觉是这将是最有效的,但我可能是错的)。

There's a a question over on gamedev network that goes deeper into what you're asking.

© www.soinside.com 2019 - 2024. All rights reserved.