所以我正在编写一个用表面填充屏幕的代码;这是代码:
的main.c
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <SDL/SDL.h>
#include <SDL_image.h>
#include "maploader.h"
#define W 510
#define H 510
#define SIZE 34
void pause();
int main ( int argc, char** argv )
{
SDL_Surface *screen = NULL;
SDL_Surface *surfaces[15][15];
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(W, H, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("demon game", NULL);
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
mapload(screen, surfaces[15][15], NULL);
SDL_Flip(screen);
pause();
SDL_QUIT;
return EXIT_SUCCESS;
}
void pause()
{
int continuer = 1;
SDL_Event event;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}
maploader.c
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <SDL/SDL.h>
#include <SDL_image.h>
#define W 510
#define H 510
#define SIZE 34
SDL_Surface *surfaces[15][15];
void mapload(SDL_Surface *screen, SDL_Surface *surfaces[][15], int lvl)
{
FILE *level = NULL;
char elements[125];
int i, j, k = 0;
SDL_Rect elementposition = {0,0};
level = fopen("level.txt", "r");
if (level == NULL)
{
exit(0);
}
fgets(elements, 125, level);
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
for (i=0; i<15; i++)
{
for (j=0; j<15; j++)
{
if (elements[k] == "0")
{
surfaces[i][j] = IMG_Load("mur.jpg");
}
else if (elements[k] == "1")
{
surfaces[i][j] = IMG_Load("caisse.jpg");
}
else if (elements[k] == "2")
{
surfaces[i][j] = IMG_Load("objectif.png");
}
else
{
surfaces[i][j] = NULL;
}
k++;
}
}
for (i=0; i<15; i++)
{
for (j=0; j<15; j++)
{
SDL_BlitSurface(surfaces[i][j], NULL, screen, &elementposition);
elementposition.x += SIZE;
}
elementposition.y += SIZE;
}
}
我从编译中得到的唯一错误如下:&#34;无法转换&#39; SDL_Surface *&#39;到&#39; SDL_Surface *()[15]&#39;争论&#39; 2&#39; to&#39; void mapload(SDL_Surface ,SDL_Surface *(*)[15],int)&#39; |&#34;
显然,错误是从mapload函数的第二个参数初始化的,但我并不清楚错误到底是什么。有什么想法吗?
答案 0 :(得分:1)
此,
mapload(screen, surfaces[15][15], NULL);
应该是
mapload(screen, surfaces, NULL);
但现在你应该问问自己,如果你当时不知道,
void mapload(SDL_Surface *screen, SDL_Surface *surfaces[][15], int lvl)
的签名完全错误。请注意,surfaces[15][15]
表示第16个指针数组的第16个元素,其中没有一个存在,因为您只分配了15个。因此,您需要了解c中的数组,它们的分配方式以及如何使用动态数组。
另外,你告诉c编译器一个函数期望一个数组的事实在这个函数中并不是很相关,所以语法SDL_Surface *surfaces[][15]
对于c程序员来说似乎很奇怪。
最后,由于surfaces
是一个全局变量,你不需要将它作为参数传递,但是你应该问自己,它应该是一个全局变量 ?