簡體   English   中英

如何將 2D 結構 arrays 傳遞給不同的函數 [SDL2/OpenGL Breakout 項目]

[英]How do I pass 2D struct arrays to different functions [SDL2/OpenGL Breakout project]

我正在使用 C 和 SDL2 開展一個突破項目。 我需要像這樣創建磚牆。 主要問題是我對如何通過不同的函數傳遞結構數組缺乏了解,因為它在渲染時會導致分段錯誤。

首先,我創建了一個結構:

typedef struct bricks
{
double x;
double y;
double x0;
double y0;
double width;
double height;
double spacing;
double columns;
double rows;
char display; //1 if shown, 0 if it was hit (so its 
hidden)
double power;
} bricks;

在 main 中,我使用它創建了一個 2D 數組:

int rows = 5,  columns = 10, x, y;
bricks bricks[columns][rows];
for (int j = 0; j <= rows - 1; j++)
{
    for (int i = 0; i <= columns - 1; i++)
    {
        initializeBricks(&bricks[i][j], 15, 10, columns, rows, 0, 0, i, j);
        printf("%f\n", bricks[i][j]);
    }
}

InitializeBricks function:

void initializeBricks(bricks *br, double h, double s, double col, double row, char dis, char p, int i, int j)
{
    br->spacing = s;
    br->columns = col;
    int totalSpace = s * (col + 1);
    br->width = (winWidth - totalSpace) / col;
    br->x0 = (-winWidth/2) + s + (br->width/2);
    br->y0 = (winHeight/2) - s - (h/2);
    br->display = dis;
    br->power = p;
    br->x = br->x0 + (i * (s + br->width));
    br->y = br->y0 - (j * (s + h));
    printf("%f\n", br->x);
}

initializeBricks printf 驗證計算是否在程序運行時正常工作,它會輸出所有正確的 x 值。 但是主循環中的printf每次輸出0.000000。

我也想可視化積木,但我的渲染方法不起作用。

主要:

render(&ball, &paddle, &bricks, winWidth, winHeight);

渲染功能:

void render(ball *b, paddle *p, bricks *br[][], int winWidth, int winHeight)
{
    //draw the objects
    for (int j = 0; j <= br[0][0].rows - 1; j++)
    {
        for (int i = 0; i <= br[0][0].columns - 1; i++)
        {
            drawBricks(&br[][], i, j);
        }
    }
}


void drawBricks(bricks *br, int i, int j)
{
    glBegin(GL_QUADS);
        glColor3f((double)j/3, (double)j/3 + 0.2, (double)j/6);
        glVertex3d((br->x - (br->width/2)), (br->y + (br->height/2)), 0);
        glVertex3d((br->x + (br->width/2)), (br->y + (br->height/2)), 0);
        glVertex3d((br->x + (br->width/2)), (br->y - (br->height/2)), 0);
        glVertex3d((br->x - (br->width/2)), (br->y - (br->height/2)), 0);
        printf("hey");
    glEnd();
    glFlush();   
}

我還應該提到我在之前的測試中生成了磚塊,在這里,但我認為我需要使用結構,因為我想添加具有不同屬性的碰撞和加電磚塊。

簡而言之,在這種情況下,我真的需要幫助理解結構、arrays 和指針,因為其他帖子對我沒有太大幫助。

如果有人能指出我遇到的問題,我將不勝感激,歡呼。

bricks *br[][]相當於bricks ***br ,我認為您沒有以正確的方式訪問它。

在渲染 function 中,當您編寫br[0][0].rows時它不正確,br 是指向bricks[][]的指針,用於訪問您想要的內容我認為您應該嘗試以下操作: (*br)[0][0]

您想將bricks *發送到drawBricks function,因此您應該訪問磚塊參數,然后發送他的地址:

(*br)[j][i] - 是磚的參數,並得到他的地址 - &((*br)[j][i])

對於您的代碼,請嘗試以下操作:

void render(ball *b, paddle *p, bricks *br[][], int winWidth, int winHeight)
{
    //draw the objects
    for (int j = 0; j <= (*br)[0][0].rows - 1; j++)
    {
        for (int i = 0; i <= (*br)[0][0].columns - 1; i++)
        {
            drawBricks(&((*br)[j][i]), i, j); // do you want to send the pointer of (*br)[j][i] to 'drawBricks' func ? tell me if i didn't get it right pls.
        }
    }
}

如果我沒有正確理解您,請告訴我,希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM