c语言sdl小游戏,用SDL写游戏

#include"sdl_image.h"/** Return the pixel value at (x, y)

* NOTE: The surface must be locked before calling this!*/Uint32 getpixel(SDL_Surface*surface,intx,inty)

{intbpp=surface->format->BytesPerPixel;/*Here p is the address to the pixel we want to retrieve*/Uint8*p=(Uint8*)surface->pixels+y*surface->pitch+x*bpp;switch(bpp) {case1:return*p;case2:return*(Uint16*)p;case3:if(SDL_BYTEORDER==SDL_BIG_ENDIAN)returnp[0]<<16|p[1]<<8|p[2];elsereturnp[0]|p[1]<<8|p[2]<<16;case4:return*(Uint32*)p;default:return0;/*shouldn't happen, but avoids warnings*/}

}/** Set the pixel at (x, y) to the given value

* NOTE: The surface must be locked before calling this!*/voidputpixel(SDL_Surface*surface,intx,inty, Uint32 pixel)

{intbpp=surface->format->BytesPerPixel;/*Here p is the address to the pixel we want to set*/Uint8*p=(Uint8*)surface->pixels+y*surface->pitch+x*bpp;switch(bpp) {case1:*p=pixel;break;case2:*(Uint16*)p=pixel;break;case3:if(SDL_BYTEORDER==SDL_BIG_ENDIAN) {

p[0]=(pixel>>16)&0xff;

p[1]=(pixel>>8)&0xff;

p[2]=pixel&0xff;

}else{

p[0]=pixel&0xff;

p[1]=(pixel>>8)&0xff;

p[2]=(pixel>>16)&0xff;

}break;case4:*(Uint32*)p=pixel;break;

}

}boolshowpic(SDL_Surface*surface,constchar*filename)

{

SDL_Surface*image;/*Load the BMP file into a surface*/image=IMG_Load(filename);if(image==NULL) {

fprintf(stderr,"Couldn't load %s: %s\n",filename,SDL_GetError());returnfalse;

}/*Blit onto the screen surface*/if(SDL_BlitSurface(image, NULL, surface, NULL)<0)

fprintf(stderr,"BlitSurface error: %s\n", SDL_GetError());

SDL_UpdateRect(surface,0,0, image->w, image->h);/*Free the allocated BMP surface*/SDL_FreeSurface(image);returntrue;

}

SDL_Surface*createsurf(constchar*filename)

{

SDL_Surface*image;/*Load the BMP file into a surface*/image=IMG_Load(filename);if(image==NULL) {

fprintf(stderr,"Couldn't load %s: %s\n",filename,SDL_GetError());return0;

}returnimage;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include //用键盘控制精灵移动 int main(int argc, char ** argv) { SDL_Surface * screen; //主表面 SDL_Surface * image; //用来放MM-----的图片信息(像素) SDL_Surface * PlayerImage; //用来测试的图片 SDL_Event event; Uint32 BeginTicks, EndTicks; SDL_Rect PRect, BRect; //PRect对应精灵的移动的小图位置(实现动画),BRect对应精灵在屏幕的位置。 unsigned char PlayerStarts = 0; unsigned char PlayerIndex = 0; bool bAppRun = true; //初始化SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { fprintf(stderr, "SDL_Init %s\n", SDL_GetError()); return -1; } //初始化成功设置退出要调用的函数SDL_Quit atexit(SDL_Quit); //创建一个640X480 16-bit 模式的主表面 16位可以让MM的效果好看一点 screen = SDL_SetVideoMode(230, 230, 16, SDL_SWSURFACE); if (screen == NULL) { fprintf(stderr, "Couldn't set 640x480x8 video mode %s\n", SDL_GetError()); return -1; } //读取MM图片信息,并创建一个表面,并把数据填入该表面中。 image = SDL_LoadBMP("./mm.bmp"); //请在终端里运行该程序 if (image == NULL) { fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。 return -1; } //读取player.bmp PlayerImage = SDL_LoadBMP("./player.bmp"); //请在终端里运行该程序 if (image == NULL) { fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。 return -1; } //读取第一个像素 Uint8 key = *((Uint8 *)PlayerImage->pixels); //设置色键 SDL_SetColorKey(PlayerImage, SDL_SRCCOLORKEY, key); //有了MM的表面了,就可以显示了。 //将MM的表面画在我们的主表面上,用MM来作为背景 if (SDL_BlitSurface(image, NULL, screen, NULL) < 0) { //解释一下NULL,第一个是按照image的尺寸显示,第二个是默认显示。你也可以指定大小,不过要用到SDL_Rect你可以看一看帮助。 fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧 return -1; } PRect.x = 0; //初始化动画显示的图片。 PRect.y = 0; PRect.w = 32; PRect.h = 48; BRect.x = 0; //初始化精灵的位置。 BRect.y = 0; BRect.w = 32; BRect.h = 48; //贴上测试用的表面 if (SDL_BlitSurface(PlayerImage, &PRect, screen, &BRect) w, image->h); BeginT
### 回答1: 好的,我来给你简单介绍一下如何使用 C 语言和 SDL2 库来创建俄罗斯方块游戏。 首先,你需要安装 SDL2 库并在你的 C 程序中包含头文件 `SDL2/SDL.h`。然后,你可以使用 SDL2 库中的函数来创建窗口、渲染图像、处理用户输入等。 具体来说,你可以使用 `SDL_CreateWindow` 函数来创建窗口,使用 `SDL_CreateRenderer` 函数来创建渲染器,使用 `SDL_RenderClear` 函数来清空渲染器,使用 `SDL_RenderCopy` 函数来渲染图像,使用 `SDL_RenderPresent` 函数来显示渲染的内容,使用 `SDL_PollEvent` 函数来处理用户输入等。 下面是一个简单的例子,展示了如何使用 SDL2 库在窗口中绘制一个红色的正方形: ```c #include <SDL2/SDL.h> int main(int argc, char** argv) { // 初始化 SDL SDL_Init(SDL_INIT_VIDEO); // 创建窗口 SDL_Window* window = SDL_CreateWindow("俄罗斯方块", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); // 创建渲染器 SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); // 设置渲染器的颜色为红色 SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 清空渲染器 SDL_RenderClear(renderer); // 绘制一个红色的 ### 回答2: 俄罗斯方块是经典的益智游戏,可以使用C语言SDL2库进行编,下面是一个简单的实现。 首先,需要使用SDL2库来创建窗口并绘制游戏界面。可以使用SDL的API函数来实现这些功能,如`SDL_Init()`函数来初始化SDL,`SDL_CreateWindow()`函数来创建窗口,`SDL_CreateRenderer()`函数来创建渲染器等。 接下来,我们需要定义俄罗斯方块的各种形状和旋转变换。可以使用二维数组来表示方块的形状,例如一个4x4的数组表示一个方块的形状。通过旋转数组中的元素可以实现方块的旋转效果。 然后,我们需要定义游戏的逻辑。可以使用二维数组来表示游戏界面,其中0表示空格,1表示方块。定义一个当前方块和下一个方块的数组,根据用户输入的操作来移动或旋转当前方块,当方块下落到底部或与其他方块重叠时,将当前方块合并到游戏界面中,并生成一个新的当前方块。 在游戏循环中,不断检查用户输入和方块的状态,更新游戏界面和方块的位置。可以使用SDL提供的函数来绘制游戏界面和方块的形状,如`SDL_RenderClear()`函数来清除渲染器,`SDL_RenderDrawRect()`函数来绘制方块的边框等。 最后,需要实现游戏结束的条件。当方块无法下落时,即方块的初始位置上方已经有其他方块,游戏结束。可以根据这个条件来判断是否退出游戏循环。 综上所述,使用C语言SDL2库可以实现一个简单的俄罗斯方块游戏。通过定义方块的形状和旋转变换,以及实现游戏逻辑和绘制函数,可以实现游戏的功能和界面。 ### 回答3: 俄罗斯方块是一款经典的游戏,可以使用C语言SDL2库来实现。SDL2库是跨平台的多媒体库,可以方便地处理游戏窗口、图像、音频等方面的操作。 首先,我们需要创建一个SDL窗口,设置窗口的大小和标题。然后,我们可以使用SDL_Rect结构体定义一个方块的位置和大小,并使用SDL_RenderFillRect函数绘制方块。通过循环,我们可以不断地更新方块的位置,使其下落。在方块到达底部或者碰到其他方块时,我们更新游戏区域的状态,然后创建一个新的方块。 除了方块的移动,我们还需要处理用户的输入。我们可以使用SDL_PollEvent函数来检测用户的操作,例如按下或释放某个键盘按键。根据用户的输入,我们可以改变方块的位置或者进行旋转。 在游戏过程中,我们需要实时更新游戏区域的状态,以及判断是否有完整的一行方块。如果有完整的一行,我们将删除该行并将上面的方块下移一行。当游戏区域的顶部有方块时,游戏结束。 为了使游戏更加有趣,我们可以设计不同的方块形状,并随机产生下一个方块。我们还可以添加音效和背景音乐,增加游戏的娱乐性。 总结起来,使用C语言SDL2库可以创建一个简单的俄罗斯方块游戏。这个游戏可以包括方块的移动、旋转、消除行以及音效等功能。通过这个练习,可以提高我们对于C语言编程以及游戏开发的理解和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值