SDL_WM_SetCaption函数怎么用

随笔 - 96&
文章 - 255&
trackbacks - 0
24252627282913456789101112141516171821222327282912345
长期寻找对战略游戏感兴趣的合作伙伴。
留言簿(20)
SDL相关网站
提供了丰富和基础的SDL入门教程
更新消息,相关下载和学习资料
SDL项目扩展库下载
我的个人网页
欢迎大家来论坛讨论问题
“最终的胜利”及其引擎,UVi小游戏下载。
我更新最勤的博客
我的小游戏
爱情小测试
SDL官方推荐教程(英)
彻底解密C++宽字符系列合集,包括介绍libiconv和gettext
积分与排名
阅读排行榜
评论排行榜
作者:龙飞&&&&&&& 最近几篇教程基本上都是参考着Lazy Foo的教程顺序来的。因为我也觉得他的顺序很实用。所不同的是,新的类型我都添加在了之前建立起来的surface类的基础之上。所以,如果你觉得单独看这些教程完全搞不明白,最好从头按照顺序来学习。另外,为了复习C++知识,也为了遵循C++的理念,我有意的将程序风格向C++靠拢。如果你更喜欢C风格,相信你在其他地方可以找到更适合你的教程。1.1:一个小细节,SDL窗口的名称&&&&&&& 因为涉及到文本的显示了,我们提一个一直以来忽略的问题——SDL建立起来的窗口的名字。因为我们所建立起来的Screen Surface是唯一和特殊的。所以窗口名字这个行为是可以绑定在这个唯一的Screen Surface对象上的。SDL中的相关函数是:
void&SDL_WM_SetCaption(const&char&*title,&const&char&*icon);
&&&&&&& 一般icon还暂时用不上,我们设置为空指针。我们修改一下Screen Surface的数据成员与构造函数。在数据成员里面添加一个windowName,并且修改构造函数
class&ScreenSurface{private:&&&&//&&&&char*&windowNpublic:&&&//&&&ScreenSurface(int w, int h, char* window_name = 0, int b = 0, Uint32 f = 0);&};
ScreenSurface::ScreenSurface():width(<span style="COLOR: #0),&height(<span style="COLOR: #0),&bpp(<span style="COLOR: #),&flags(<span style="COLOR: #),&windowName(<span style="COLOR: #){&&&&if&(&screenNum&&&<span style="COLOR: #&)&&&&&&&&throw&ErrorInfo("DONOT&create&more&than&ONE&screen!");&&&&if&(&SDL_Init(SDL_INIT_VIDEO&&&<span style="COLOR: #&)&)&&&&&&&&throw&ErrorInfo(SDL_GetError());&&&&pScreen&=&SDL_SetVideoMode(width,&height,&bpp,&flags);&&&&screenNum++;}ScreenSurface::ScreenSurface(int&w,&int&h,&char*&window_name,&int&b,&Uint32&f):width(w),&height(h),&bpp(b),&flags(f){&&&&if&(&screenNum&&&<span style="COLOR: #&)&&&&&&&&throw&ErrorInfo("DONOT&create&more&than&ONE&screen!");&&&&if&(&SDL_Init(SDL_INIT_VIDEO&&&<span style="COLOR: #&)&)&&&&&&&&throw&ErrorInfo(SDL_GetError());&&&&pScreen&=&SDL_SetVideoMode(width,&height,&bpp,&flags);&&&&screenNum++;&&&&if&(&window_name&!=&<span style="COLOR: #&)&{&&&&&&&&windowName&=&window_&&&&&&&&SDL_WM_SetCaption(windowName,&<span style="COLOR: #);&&&&}&&&&else&&&&&&&&windowName&=&<span style="COLOR: #;}
这样,我们在创建SceenSurface的时候,第三个参数如果指定,则可以用字符串表示窗口名称。1.2:使用*.ttf文件&&&&&&& SDL使用*.ttf文件,仍然需要扩展库的支持。相关的下载和SDL_image的类似,大家可以参考前面的教程。下载地址如下:&&&&&&& 使用ttf扩展库的程序如下:(1)装载扩展库:TTF_Init();(2)打开字库:TTF_OpenFont(const char* ttf_fileName, int ttf_size);(3)构建显示文本的surface:TTF_RenderText_Solid(TTF_Font* pFont, const char* message, SDL_Color textColor);(4)显示(blit)文本(5)关闭字库:TTF_CloseFont();(6)退出扩展库:TTF_Quit();(7)释放显示文本的surface:SDL_FreeSurface();&&&&&&& 我们考虑下这个TextSurface与之前的DisplaySurface之间的关系,希望通过类将二者有所联系。1.3:构建TextSurface类&&&&&&& 我们分析下TextSurface与DisplaySurface的关系:他们都依赖于一个ScreenSurface对象,至少具有两个一样的私有数据成员pSurface和pScreen;他们有一致的行为blit();他们的构造前提条件不同,析构做的&#8220;善后&#8221;也不一样。&&&&&&& 我在水木社区的CPP版请教有这样关系的两个类应该是什么关系。有前辈指教说,一个类,用不同的flag加以区分。而我并不愿意多增加一个构造函数的参数,所以,我用构造函数的重载实现构造的不同;用继承类实现方法代码的重用;用继承类的析构函数为TextSurface类做额外的析构工作。&&&&&&& 考虑到应在第一次建立TextSurface对象的时候装载ttf扩展库,并在最后一个对象使用完毕后关闭ttf扩展库,所以,在基类DisplaySurface中添加静态私有成员作为计数器,并添加相应的方法为派生类使用。这些方法,以及专门为派生类创建的基类构造函数,我们并不希望能被外部使用,所以,使用了关键字proteced。
class&DisplaySurface{private:&&&&//&&&&//for&TextSurafce&&&&static&int&textN&&&&TTF_Font*&pFpublic:&&&&//protected:&&&&//for&TextSurface&&&&DisplaySurface(const&std::string&&msg_name,&const&std::string&&message,&const&ScreenSurface&&screen,&&&&&&&&&&&&&&&&&&&&Uint8&r,&Uint8&g,&Uint8&b,&&&&&&&&&&&&&&&&&&&&&const&std::string&&ttf_fileName,&int&ttf_size);&&&&int&tellTextNum()&const;&&&&void&reduceTextNum();&&&&void&deleteFontPoint();};
pFont是TextSurface会用到的私有数据,构造基类的时候,直接设置成空指针就可以了。保护成员的实现如下:
//for&TextSurfaceDisplaySurface::DisplaySurface(const&std::string&&msg_name,&const&std::string&&message,&const&ScreenSurface&&screen,&&&&&&&&&&&&&&&&&&&&Uint8&r,&Uint8&g&,&Uint8&b,&&&&&&&&&&&&&&&&&&&&&const&std::string&&ttf_fileName,&int&ttf_size):fileName(msg_name){&&&&if&(&textNum&==&<span style="COLOR: #&)&&&&&&&&if&(&TTF_Init()&&&<span style="COLOR: #&)&&&&&&&&&&&&throw&ErrorInfo("TTF_Init()&failed!");&&&&&&&&SDL_Color&textC&&&&textColor.r&=&r;&&&&textColor.g&=&g;&&&&textColor.b&=&b;&&&&pFont&=&TTF_OpenFont(ttf_fileName.c_str(),&ttf_size);&&&&if&(&pFont&==&<span style="COLOR: #&)&&&&&&&&throw&ErrorInfo("TTF_OpenFont()&failed!");&&&&pSurface&=&TTF_RenderText_Solid(pFont,&message.c_str(),&textColor);&&&&if&(&pSurface&==&<span style="COLOR: #&)&&&&&&&&throw&ErrorInfo("TTF_RenderText_solid()&failed!");&&&&pScreen&=&screen.point();&&&&textNum++;}int&DisplaySurface::tellTextNum()&const{&&&&return&textN}void&DisplaySurface::reduceTextNum(){&&&&textNum--;}void&DisplaySurface::deleteFontPoint(){&&&&TTF_CloseFont(pFont);}
有了这些数据成员和方法,我们可以构建TextSurface类了。
class&TextSurface:&public&DisplaySurface{public:&&&&TextSurface(const&std::string&&msg_name,&const&std::string&&message,&const&ScreenSurface&&screen,&&&&&&&&&&&&&&&&&&&&Uint8&r&=&<span style="COLOR: #xFF,&Uint8&g&=&<span style="COLOR: #xFF,&Uint8&b&=&<span style="COLOR: #xFF,&&&&&&&&&&&&&&&&&&&&&const&std::string&&ttf_fileName&=&"lazy.ttf",&int&ttf_size&=&<span style="COLOR: #);&&&&~TextSurface();};
可以看到,我们仅仅增添了派生类的构造函数和析构函数,实现如下:
//class&TextSurfaceTextSurface::TextSurface(const&std::string&&msg_name,&const&std::string&&message,&const&ScreenSurface&&screen,&&&&&&&&&&&&&&&&&&&&Uint8&r,&Uint8&g,&Uint8&b,&&&&&&&&&&&&&&&&&&&&&const&std::string&&ttf_fileName,&int&ttf_size):DisplaySurface(msg_name,&message,&screen,&r,&g,&b,&ttf_fileName,&ttf_size){}TextSurface::~TextSurface(){&&&&deleteFontPoint();&&&&reduceTextNum();&&&&if&(&tellTextNum()&==&<span style="COLOR: #&)&&&&&&&&TTF_Quit();}
我们在下节给出完整的代码以及一个用于演示的例子。
阅读(3217)用dev c++配置SDL时的问题_百度知道
用dev c++配置SDL时的问题
& & &( SDL_WM_SetCaption& 运行这个程序&nbsp.type)& & & &nbsp.h&&; &&main(&nbsp,& & && & &&nbsp. & &nbsp.jpg" esrc=" &&& MessageBox&& return& & & &SDL_KEYDOWN; &得到系统消息&SDL_SetVideoMode&&/zhidao/wh%3D600%2C800/sign=eae30e924b899a901ab5c58e71d950a7b,& &&& && & &nbsp.h& && }&480; & &nbsp:& case&char*& & done&SDL_GetError&nbsp:& {& &#include& &nbsp,&&不能初始化&)& && & &==&nbsp.h&//屏幕接口&; }& &640x480& & exit&&nbsp,& & & exit&=& & & SDL_Quit(); & & &(2);#include& & &nbsp. &nbsp,& case& &&%sn&#include&&& &; &nbsp. & & & & &&(1). & &nbsp,& &图象模式; & &*/& & &;()); &=& &SDL_Surface&(& & & & &*/& & }&nbsp.h&SDL/SDL;&int& &Error& &nbsp://h;world&done=1时退出;& sprintf& &nbsp.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src=" SDL_GetError& &&&args[]&nbsp:& &&nbsp:& &event.h&quot:& & SDL_Event&stdio,done=0时继续&/*设置SDL窗口标题& &&&(; &(event://h;&640x480x16& && &0)& &*/& & && & &SDL; & &nbsp,&#include&nbsp,& &有错误#include& & & {&nbsp,&nbsp.& & & & atexit& & &<a href="NULL)&SDL_SWSURFACE& &SDL_QUIT; &(0; & &NULL); & & & &图象模式&设置&1;& /*& while& & & & && & & &&MB_ICONHAND);char& & &nbsp://h;& & }&&& &//主程序{& & & & &SDL_DOUBLEBUF);&nbsp,&&msg[500],& &*screen& &(0;events& & & {& screen& &nbsp,& & sprintf& &=& & MessageBox&NULL;//游戏循环& & & &/*& }& && &(&不能设置成&&(SDL_Init&(SDL_Quit);for& {& & &done& &int& &int& &16-bits&(screen& {& /*& & & &(SDL_PollEvent&&& while& & & &nbsp,&(0; &&初始化SDL&//& & &=& & & &Check& & &()); &16; & & &if&Error& &done,& &event))& && }& &(SDL_INIT_VIDEO)& &0; &nbsp,&/zhidao/pic/item/1e30e924b899a901ab5c58e71d950a7b;*/&(640; &; & & &nbsp,the& &|& & &%/zhidao/wh%3D450%2C600/sign=43fbf2c579ae2/1e30e924b899a901ab5c58e71d950a7b; &&MB_ICONHAND); &nbsp!done)& switch& & &nbsp配置好了&if& & & &nbsp. & &nbsp
a所在的路径工程属性-&gt,添加参数 -lmingw32 -lSDLmain -lSDL -mwindows拷贝SDL; 参数 -&gt工程属性-&目录 -& 文件/ 库目录.dll到项目生成的exe路径下,添加 libSDL; 链接器
其他类似问题
为您推荐:
sdl的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁SDL学习(六)&Key&Presses(键盘按键事件)
(翻译的)这个教程囊括了如何检测键盘事件的发生,代码是一个简单的演示哪个箭头键被按下,你现在已经用SDL_QUIT等一些事件句柄做了退出处理,现在要学习的是如何检测键盘按键按下,并且检测键标。
代码和注释:
&#include"SDL.h"
#include &string&
const& int SCREEN_WIDTH=640;
const& int SCREEN_HEIGHT=480;
const int SCREEN_BPP=32;
SDL_Surface *screen=NULL;
SDL_Surface *background=NULL;
SDL_Surface *message=NULL;
SDL_Surface *upM
SDL_Surface *downM
SDL_Surface *leftM
SDL_Surface *rightM
//定义显示字体的颜色SDL_Color
textColor={100,100,0};
//定义字体指针TTF_Font
*font=NULL;
//定义事件结构SDL_E
SDL_Surface *load_image(std::string filename)
{//装载图片&SDL_Surface
*loadedImage=NULL;
&SDL_Surface *optimizedImage=NULL;
&loadedImage=IMG_Load(filename.c_str());
&if(loadedImage!=NULL)
optimizedImage=SDL_DisplayFormat(loadedImage);
SDL_FreeSurface(loadedImage);
&& if(optimizedImage!=NULL)
SDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY,SDL_MapRGB(optimizedImage-&format,0,0,0));
&return optimizedI
void apply_surface(int x,int y,SDL_Surface *source,SDL_Surface
*destination,SDL_Rect *clip=NULL)
{//stick表面&&
&& offset.x=x;
&& offset.y=y;
SDL_BlitSurface(source,clip,destination,&offset);
bool init()
{ //初始化,设置窗口&if(SDL_Init(SDL_INIT_EVERYTHING)==-1)
&screen=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
&if(screen==NULL)
&if(TTF_Init()==-1)
&& SDL_WM_SetCaption( "Press an
Arrow Key", NULL );
&&& return
bool load_files()
{& //装载背景和字体&background=load_image("D:/Users/lucy/Documents/Visual
Studio 2008/Projects/SDLtest/background.png");
&font=TTF_OpenFont("D:/Users/lucy/Documents/Visual
Studio 2008/Projects/SDLtest/lazy.ttf",70);
&if(background==NULL)
&if(font==NULL)
void clean_up()
&//清理工作,注意字体也要清理&SDL_FreeSurface(background);
&SDL_FreeSurface(upMessage);
&SDL_FreeSurface(downMessage);
&SDL_FreeSurface(rightMessage);
&TTF_CloseFont(font);
&TTF_Quit();
&SDL_Quit();
int main(int argc,char *argv[])
&bool quit=
&if(init()==false)
&&& return
&if(load_files()==false)
&&return 1;
&&& //定义消息显示的表面&upMessage=TTF_RenderText_Solid(font,"Up
was pressed",textColor);
&downMessage=TTF_RenderText_Solid(font,"Down was
pressed",textColor);
&leftMessage=TTF_RenderText_Solid(font,"Left was
pressed",textColor);
&rightMessage=TTF_RenderText_Solid(font,"Right was
pressed",textColor);
&apply_surface(0,0,background,screen);
&while(quit==false)
&&if(SDL_PollEvent(&event))
&&&//在消息循环队列中判断键盘按键事件&&&if(event.type==SDL_KEYDOWN)
&&&&//通过不同的键标检测来选择表面
&&&&switch(event.key.keysym.sym)
&&&&&message=upM
SDLK_DOWN:
&&&&&message=downM
SDLK_LEFT:
&&&&&message=leftM
SDLK_RIGHT:
&&&&&message=rightM
if(event.type==SDL_QUIT)
&&&&//退出消息队列&&&&quit=
&&//显示按键事件的判断&&if(message!=NULL)
&&{//如果有事件要予以显示就blit&&&apply_surface(0,0,background,screen);
//保证字体在屏幕中间显示,注意计算的公式要剪掉消息本身的高和宽&&&apply_surface((SCREEN_WIDTH-message-&w)/2,(SCREEN_HEIGHT-message-&h)/2,message,screen);
&&&message=NULL;
&&//更新屏幕&&if(SDL_Flip(screen)==-1)
&clean_up();
效果:(按键的时候屏幕就会显示你按下的是哪个键)
什么键都没有按下的时候
分别按下上、右、下、左键的时候屏幕显示的情况
总的来说,所有键盘事件的处理貌似都是利用了事件或者消息的方式,然后不断的循环,更新当前屏幕,从而得到实时响应的效果,在SDL中也是如此,其标志键盘按下的事件是SDL_KEYDOWN,而存储键标的结构是event.key.keysym.sym,键标的命名格式是SDLK_XX,一般也是像消息处理机制一样使用switch语句,这个程序中用ttf文字生成surface的事件循环来响应按键事件,相信只要掌握了surface的基本使用和ttf,再了解event的结构是很简单了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。SDL入门教程九_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
SDL入门教程九
上传于||文档简介
&&S&#8203;D&#8203;L&#8203;入&#8203;门&#8203;教&#8203;程
大小:8.81KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢如何获取sdl窗口title高度_百度知道
如何获取sdl窗口title高度
提问者采纳
创建一个窗口 要用SDL创建一个窗口,设计到以下步骤:◆初始化SDL视频库◆创建窗口◆设置窗口标题◆关闭SDL 1.初始化SDL视频库我们用SDL_Init()来初始化SDL视频库,并传入一个参数 SDL_INIT_VIDEO. 2.创建一个窗口我们用SDL_SetVideoMode()来创建一个窗口,这个函数包含四个参数,依次是窗口的宽度、高度、单个像素占用位数和一个标记变量。其中第三个参数最为简单的方法是设置为0,这样它就为当前默认的显示设置)。最后一个参数这里我们用SDL_HWSURFACE和SDL_DOUBLEBUF.联起来使用要用或操作符: SDL_HWSURFACE | SDL_DOUBLEBUF。SDL_SetVideoMode()函数不仅仅是创建了一个窗口,它还创建了一块内存区域叫&screen buffer&,用来显示图像。这块区域负责显示画面到屏幕,标记变量SDL_HWSURFACE表示在显存里头创建缓存;SDL_DOUBLEBUF表示我要创建穿常扁端壮得憋全铂户两个缓存区域,一个用作前端缓存,这里存放的就是我们正在显示到屏幕的内容;另一个用作后端缓存,这里存放的是我们将要显示到屏幕上的内容。当我们显示将要显示的内容时候,只需要交换前端缓存和后端缓存,这样后端缓存的内容就被显示出来。(译者注:也就是说前端缓存又变成了后端缓存,可以用来存放下一幅要显示的画面)这项技术叫做双缓存,用来加速图像的渲染过程。 SDL_SetVideoMode()函数会返回一个指向SDL_Surface类型的screen buffer。SDL_Surface结构代表了一块内存区域,在那里存放了图像的信息。当我们画图时,只需要将图像数据信息放到这个结构里面。 3.设置窗口标题我们可以用SDL_WM_SetCaption()来设置窗口的标题,它有两个参数,第一个参数就是标题的内容,第二个参数用来指定一个自定义的图标,设置为0表示使用默认的图标。 4.关闭SDL我们呼叫SDL_Quit()函数来关闭SDL。它会释放前面通过SDL_SetVideoMode()返回的SDL_Surface类型的screen buffer。下面的代码创建了一个窗口,当你运行的时候,会发现显示片刻之后,它会关闭。因为我们在创建该窗口之后,紧接着调用了SDL_Quit()。下一阶段,我们会用到一个循环,让窗口停在那里,知道你点击关闭。
来自团队:
其他类似问题
为您推荐:
词语的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 setcaption 的文章

 

随机推荐