sdl2源码放进项目的简单介绍

hacker|
97

文章目录:

如何在MFC对话框中使用SDL2

方法/步骤

新建MFC应用程序,工程名称为MFCSDL

本例使用基于对话框的程序,注意勾选“基于对话框”

在MFCSDLDlg.h中添加SDL library 头文件和库文件应用,并定义所需变量。

#include "../SDL2-2.0.3/include/sdl.h"

#pragma comment(lib, "../SDL2-2.0.3/lib/x86/SDL2.lib")

#define WINDOW_W 640

#define WINDOW_H 480

#define NUM_SPRITES 100

#define MAX_SPEED 1

static SDL_Window* window;

static SDL_Renderer *renderer;

static SDL_Texture * sprite;

static int window_w, window_h;

static int sprite_w, sprite_h;

static SDL_Rect *positions, *velocities;

添加WM_KICKIDLE消息,该消息为微软保留消息,不公开,用它可以避免自己再重载实现消息循环。

具体过程如下:

1. 在 MFCSDLdlg.h文件加入

afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);

2. 在MFCSDLDlg.cpp中加入消息映射

BEGIN_MESSAGE_MAP(CMFCSDLDlg, CDialogEx)

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_MESSAGE(WM_KICKIDLE,OnKickIdle)

ON_WM_CLOSE()

END_MESSAGE_MAP()

3.添加OnKickIdle消息实现。

LRESULT CMFCSDLDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)

{

SDL_Event event;

int done = 0;

while (!done)

{

/* Check for events */

while (SDL_PollEvent(event)) {

switch (event.type) {

case SDL_WINDOWEVENT:

switch (event.window.event) {

case SDL_WINDOWEVENT_EXPOSED:

SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);

SDL_RenderClear(renderer);

break;

}

break;

case SDL_QUIT:

done = 1;

break;

default:

break;

}

}

MoveSprites(renderer, sprite);

}

return 0; //一定要返回0

}

在OnInitDialog函数中加入初始化代码。

BOOL CMFCSDLDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

// 设定此对话方块的图示。当应用程式的主视窗不是对话方块时,

// 框架会自动从事此作业

SetIcon(m_hIcon, TRUE); // 设定大图示

SetIcon(m_hIcon, FALSE); // 设定小图示

// TODO: 在此加入额外的初始设定

window = SDL_CreateWindowFrom(m_hWnd);

SDL_SetWindowTitle(window, "SDL Native Window Test");

renderer = SDL_CreateRenderer(window, -1, 0);

SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);

SDL_RenderClear(renderer);

sprite = LoadSprite(renderer, "icon.bmp");

SDL_GetWindowSize(window, window_w, window_h);

SDL_QueryTexture(sprite, NULL, NULL, sprite_w, sprite_h);

positions = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));

velocities = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));

if (!positions || !velocities) {

SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n");

// quit(2);

}

srand(time(NULL));

for (int i = 0; i NUM_SPRITES; ++i) {

positions[i].x = rand() % (window_w - sprite_w);

positions[i].y = rand() % (window_h - sprite_h);

positions[i].w = sprite_w;

positions[i].h = sprite_h;

velocities[i].x = 0;

velocities[i].y = 0;

while (!velocities[i].x !velocities[i].y) {

velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;

velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;

}

}

return TRUE; // 传回 TRUE,除非您对控制项设定焦点

}

在MFCSDLDlg.cpp中,添加LoadSprite函数,注意是static 全局函数,放在所有函数最上方。其作用是加载一个图片精灵,本例使用一个笑脸图片。

static SDL_Texture *

LoadSprite(SDL_Renderer *renderer, char *file)

{

SDL_Surface *temp;

SDL_Texture *sprite;

/* Load the sprite image */

temp = SDL_LoadBMP(file);

if (temp == NULL) {

SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file, SDL_GetError());

return 0;

}

/* Set transparent pixel as the pixel at (0,0) */

if (temp-format-palette) {

SDL_SetColorKey(temp, 1, *(Uint8 *) temp-pixels);

}

/* Create textures from the image */

sprite = SDL_CreateTextureFromSurface(renderer, temp);

if (!sprite) {

SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());

SDL_FreeSurface(temp);

return 0;

}

SDL_FreeSurface(temp);

/* We're ready to roll. :) */

return sprite;

}

在LoadSprite后添加MoveSprites函数,其作用是将精灵循环移动,实现动态效果。

static void

MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)

{

if(renderer==NULL||sprite==NULL)

return;

int sprite_w, sprite_h;

int i;

SDL_Rect viewport;

SDL_Rect *position, *velocity;

/* Query the sizes */

SDL_RenderGetViewport(renderer, viewport);

SDL_QueryTexture(sprite, NULL, NULL, sprite_w, sprite_h);

/* Draw a gray background */

SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);

SDL_RenderClear(renderer);

/* Move the sprite, bounce at the wall, and draw */

for (i = 0; i NUM_SPRITES; ++i) {

position = positions[i];

velocity = velocities[i];

position-x += velocity-x;

if ((position-x 0) || (position-x = (viewport.w - sprite_w))) {

velocity-x = -velocity-x;

position-x += velocity-x;

}

position-y += velocity-y;

if ((position-y 0) || (position-y = (viewport.h - sprite_h))) {

velocity-y = -velocity-y;

position-y += velocity-y;

}

/* Blit the sprite onto the screen */

SDL_RenderCopy(renderer, sprite, NULL, position);

}

/* Update the screen! */

SDL_RenderPresent(renderer);

}

8

以上完成,按F7编译,将icon.bmp文件拷贝到程序执行文件加下,运行程序,可看到如图效果。

求SDL2打地鼠游戏的源代码 急求,求好心人

恰巧我找到一个,没法发链接,你在图片上的网站搜“打地鼠游戏机,自己动手(附电路图,源代码,元件清单,视频)”应该就可以搜到了,内容很详细,希望可以帮到你~~

SDL2.0在code blocks下的配置问题

ld是链接程序,链接程序错误一般是没有加入需要的.a库文件,要么手写 -L xxx.a编译选项,要么在CodeBlock编译环境设置里面添加需要的库,就是下面这个,把sdl2的lib库放进去就行

devcpp怎么安装SDL2。。?

电脑是win7 64位, Dev-Cpp安装路径是C:\Dev-Cpp,此目录下有 MinGW64,即windows版GCC的根目录。

下载SDL

打开

找到开发库Windows下 SDL2-2.0.3-mingw.tar.gz 点击下载。

也可以直接点击

因为前面Dev-Cpp中装是MinGW64,所以解压后进入SDL开发库中的 x86_64-w64-mingw32目录

将 F:\Downloads\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 下所有头文件复制到 C:\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include;

再将 F:\Downloads\SDL2-2.0.3\x86_64-w64-mingw32\lib 所有 lib* 文件复制到 C:\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib

==========================================================================================

接下来创建一个测试程序。

在Dev-Cpp中创建一个C项目, 添加main.c

[cpp] view plaincopy

#include stdio.h

#include stdlib.h

#include SDL.h

int main(int argc, char * argv[])

{

if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)

{

fprintf(stderr, "SDL_Init() failed");

exit(-1);

}

printf("SDL_init() success");

SDL_Quit();

return 0;

}

配置项目需要链接的库 -lmingw32 -lSDL2main -lSDL2

完了可以正常编译,但是运行失败,这是由于运行时找不SDL2.dll。

把 F:\Downloads\SDL2-2.0.3\x86_64-w64-mingw32\bin\SDL2.dll 复制到 C:\Windows\System32\目录下,或者是把这个SDL2.dll复制到 编译生成的exe文件所在目录。

如何安装/编译在Linux / Ubuntu的SDL2 C C 05

1.使用apt-get 安装开发包

sudo apt-get install libsdl2-dev

2.编辑源文件, hello.c

#include SDL2/SDL.hint main(){ SDL_Window* window =0; SDL_Renderer* render=0; SDL_Init(SDL_INIT_EVERYTHING); window=SDL_CreateWindow("hello",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640,480,SDL_WINDOW_SHOWN); render=SDL_CreateRenderer(window,-1,0); SDL_SetRenderDrawColor(render,0,255,0,255); SDL_RenderClear(render); SDL_RenderPresent(render); SDL_Delay(3000); SDL_DestroyWindow(window); SDL_DestroyRenderer(render); SDL_Quit(); return 0;}

3.编译

gcc hello.c -lSDL2

如果编译成功,会生成a.out可执行文件

4.运行

./a.out

sdl2/sdl.h头文件有什么用

stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C、C++语言的最常用的系统函数 该文件包含了的C语言标准库函数的定义 stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。

4条大神的评论

  • avatar
    访客 2022-07-08 下午 04:35:42

    = rand() % (window_w - sprite_w); positions[i].y = rand() % (window_h - sprite_h); positions[i].w = sprite_w; positi

  • avatar
    访客 2022-07-08 下午 08:52:29

    WINDOW_W 640#define WINDOW_H 480#define NUM_SPRITES 100#define MAX_SPEED 1static SDL_Window* window;static SDL

  • avatar
    访客 2022-07-08 下午 07:15:16

    片上的网站搜“打地鼠游戏机,自己动手(附电路图,源代码,元件清单,视频)”应该就可以搜到了,内容很详细,希望可以帮到你~~SDL2.0在code blocks下的配置问题ld是链接程序

  • avatar
    访客 2022-07-08 下午 02:53:48

    0; i NUM_SPRITES; ++i) { position = positions[i]; velocity = velocities[i]; position-x += veloci

发表评论