C & SDL

无聊等放假,自娱自乐。复习C,学习使用SDL。eclipse cdt + cygwin + sdl

教程: http://lazyfoo.net/SDL_tutorials/index.php

 

教程很棒,碰到的唯一的问题,不需要加mingw32链接参数

 

 

 

#include <stdio.h>
#include <stdlib.h>

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"

#define MAX 127

const int SCREEN_WIDTH = 320;
const int SCREEN_HEIGHT = 240;
const int SCREEN_BPP = 32;

int init();
SDL_Surface *load_image(char*);
void apply_surface(int, int, SDL_Surface*, SDL_Surface*, SDL_Rect* clip);

int paint();

SDL_Event event;

SDL_Surface *screen = NULL;

int main(void) {
	puts("hi :-]"); /* prints !!!Hello World!!! */

	int result = init();
	if (result != 0) {
		return result;
	}
	result = paint();
	if (result != 0) {
		return result;
	}

	int quit = 1;
	while (quit == 1) {
		while (SDL_PollEvent(&event)) {
			if (event.type == SDL_QUIT) {
				quit = 0;
			}
		}
	}

	return EXIT_SUCCESS;
}

int init() {
	if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
		fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
		return 1;
	}
	atexit(SDL_Quit);

	if (TTF_Init() == -1) {
		return 1;
	}

	screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,
			SDL_SWSURFACE);
	if (screen == NULL) {
		fprintf(stderr, "Couldn't set video mode(%dx%dx%d): %s\n",
				SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_GetError());
		return 1;
	}
	SDL_WM_SetCaption("Hello World", NULL);

	return 0;
}

SDL_Surface *load_image(char* filename) {
	SDL_Surface* _image = NULL;
	SDL_Surface* image = NULL;

	_image = IMG_Load(filename); //SDL_LoadBMP(filename);
	if (_image != NULL) {
		image = SDL_DisplayFormat(_image);
		SDL_FreeSurface(_image);

		Uint32 colorkey = SDL_MapRGB(image->format, 0xFF, 0xFF, 0xFF);
		SDL_SetColorKey(image, SDL_SRCCOLORKEY, colorkey);
	}

	return image;
}

void apply_surface(int x, int y, SDL_Surface* src, SDL_Surface* dest,
		SDL_Rect* clip) {
	SDL_Rect offset;

	offset.x = x;
	offset.y = y;

	SDL_BlitSurface(src, clip, dest, &offset);
}

int paint() {
	SDL_Surface *back = NULL;
	back = load_image("background.png");

	apply_surface(0, 0, back, screen, NULL);
	apply_surface(160, 0, back, screen, NULL);
	apply_surface(0, 120, back, screen, NULL);
	apply_surface(160, 120, back, screen, NULL);

	SDL_Surface *sprite = NULL;
	sprite = load_image("hello.bmp");

	SDL_Rect clip[2];
	clip[0].x = 0;
	clip[0].y = 0;
	clip[0].w = 50;
	clip[0].h = 90;
	clip[1].x = 50;
	clip[1].y = 0;
	clip[1].w = 70;
	clip[1].h = 90;

	apply_surface(220, 130, sprite, screen, &clip[0]);
	apply_surface(240, 150, sprite, screen, &clip[1]);

	TTF_Font *font = NULL;
	SDL_Surface *text = NULL;
	font = TTF_OpenFont("C:\\WINDOWS\\Fonts\\CHILLER.TTF", 24);
	if (font == NULL) {
		return 1;
	}
	SDL_Color textColor = { 255, 255, 255 };
	text = TTF_RenderText_Solid(font, "hi :-]", textColor);

	apply_surface(15, 10, text, screen, NULL);

	if (SDL_Flip(screen) == -1) {
		return 1;
	}

	SDL_FreeSurface(back);
	SDL_FreeSurface(sprite);
	SDL_FreeSurface(text);

	TTF_CloseFont(font);
	TTF_Quit();

	return 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值