sdl实现texture拖动
来源:互联网 发布:思科网络会议系统 编辑:程序博客网 时间:2024/06/07 03:19
这里利用SDL_FINGERMOTION的event.tfinger.dx和event.tfinger.dy对texture的显示坐标进行更改以达到拖动。
如果闪退,尝试更换自己的字体路径。
效果图:
代码:
#include <SDL2/SDL.h>#include <SDL2/SDL_ttf.h>//显示的texture的数量const int TexNum =1;SDL_Window*window=NULL;SDL_Renderer*renderer=NULL;//窗口类class Window{ public: //记录是否加载成功 bool load; //构造函数 Window(char title[20], Uint32 w=720, Uint32 h=1280, int flag=0) { load=false; if (!SDL_Init(SDL_INIT_VIDEO)) if (window=SDL_CreateWindow(title, 0, 0, w, h, flag)) if (renderer=SDL_CreateRenderer(window, -1, 0)) { //加载窗口成功 load=true; } } //析构函数 ~Window() {SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit(); } //填充窗口:白色 void fullWindow() {SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);SDL_RenderFillRect(renderer, NULL); } //刷新窗口 void reflush() {SDL_RenderPresent(renderer);SDL_RenderClear(renderer); }};//文字类class Font{ public: TTF_Font*font; //构造函数:size为字体大小 Font(int size=80) { TTF_Init();font=TTF_OpenFont("./resource/DroidSansFallback.ttf", size); } //析构函数 ~Font() { TTF_CloseFont(font); font=0; TTF_Quit(); } //把文字加载成textureSDL_Texture*loadTex(char*str, int type=4) { switch (type) { case 0:TTF_SetFontStyle(font,TTF_STYLE_BOLD);break; //粗体 case 1:TTF_SetFontStyle(font,TTF_STYLE_ITALIC);break; //斜体 case 2:TTF_SetFontStyle(font,TTF_STYLE_UNDERLINE);break; //下划线 case 3:TTF_SetFontStyle(font,TTF_STYLE_STRIKETHROUGH);break; //删除线 case 4:TTF_SetFontStyle(font,TTF_STYLE_NORMAL);break; //正常 } //文字颜色:黑色 SDL_Color color={0, 0, 0, 255}; SDL_Surface*surface=TTF_RenderUTF8_Blended(font, str, color);SDL_Texture*texture=SDL_CreateTextureFromSurface(renderer, surface);SDL_FreeSurface(surface); return texture; }};//纹理类class Tex{ public: SDL_Texture*tex[TexNum]; SDL_Rect box[TexNum]; Font font; //特效texture SDL_Texture*texture; SDL_Rect TexBox={100, 200, 0, 0}; //构造函数 Tex() { char *str[TexNum]={ "退出"}; for (int i=0; i<TexNum; i++) {tex[i]=font.loadTex(str[i]); int w,h;//获取纹理大小 SDL_QueryTexture(tex[i], NULL, NULL, &w, &h);//设置纹理的大小 box[i].w=w; box[i].h=h; }//设置纹理的坐标 box[0].x=0; box[0].y=0;//设置特效textureFont BigFont(100);texture=BigFont.loadTex("texture"); int w,h;//获取纹理大小 SDL_QueryTexture(texture, NULL, NULL, &w, &h);TexBox.w=w;TexBox.h=h; } //析构函数 ~Tex() { for (int i=0; i<TexNum; i++) { if (tex[i]!=NULL) SDL_DestroyTexture(tex[i]); }SDL_DestroyTexture(texture); } //显示tex void showTex(int n) {SDL_RenderCopy(renderer, tex[n], NULL, &box[n]); }//显示特效texturevoid showTexture(int dx, int dy){TexBox.x+=dx;TexBox.y+=dy;SDL_RenderCopy(renderer, texture, NULL, &TexBox);}};//按钮类class Button{ SDL_Event event; SDL_Rect box[TexNum]; //屏幕分辨率 int win_w,win_h;public ://滑动距离SDL_Point point={0, 0};Tex tex;int m=-1; //按下和移动时按钮索引int n=-1; //抬起时按钮索引//构造函数Button(){//获取屏幕分辨率SDL_GetWindowSize(window, &win_w, &win_h);//获取tex文字大小和坐标for (int i=0; i<TexNum; i++){box[i].x=tex.box[i].x;box[i].y=tex.box[i].y;box[i].w=tex.box[i].w;box[i].h=tex.box[i].h;}}void touch(){while (SDL_PollEvent(&event)){switch (event.type){//手指按下case SDL_FINGERDOWN://手指滑动case SDL_FINGERMOTION:{//event.tfinger.dx和event.tfinger.dy值范围:-1~1point.x=event.tfinger.dx*win_w;point.y=event.tfinger.dy*win_h;//event.tfinger.x和event.tfinger.y值范围:0~1SDL_Point point={event.tfinger.x*win_w, event.tfinger.y*win_h};for (int i=0; i<TexNum; i++)//判断触点是否在box矩形中中if (SDL_PointInRect(&point, &box[i]))m=i;}break;//手指抬起case SDL_FINGERUP:{//event.tfinger.x和event.tfinger.y值范围:0~1SDL_Point point={event.tfinger.x*win_w, event.tfinger.y*win_h};for (int i=0; i<TexNum; i++)//判断触点是否在box矩形中if (SDL_PointInRect(&point, &box[i]))n=i;m=-1;}break;}}}void show(){//绘画填充矩形for (int i=0; i<TexNum; i++){SDL_SetRenderDrawColor(renderer, 0, 255, 255, 0);SDL_RenderFillRect(renderer, &box[i]);}if (m!=-1){SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0);SDL_RenderFillRect(renderer, &box[m]);}//显示文字for (int i=0; i<TexNum; i++)tex.showTex(i);}};//主函数int main(int argc, char**argv){ Window win("多个按钮"); Button button; while (win.load) { button.touch(); button.show(); button.tex.showTexture(button.point.x, button.point.y); switch (button.n) { case 0:{ win.load=false; }break; } win.reflush();
阅读全文
0 0
- sdl实现texture拖动
- sdl实现texture旋转
- sdl实现texture透明
- SDL Game Development-第2章-5.实现纹理管理器Texture Manager
- sdl renderer window texture surface更新关系
- Tamura texture C++实现
- SDL实现生产者消费者
- sdl实现计时器
- SDL 实现马赛克
- 用GPU实现Cellular Texture
- Texture
- texture
- 使用SDL编写一个拖动开关点亮灯泡的程序
- SDL 实现五子棋 GUI (一)
- SDL 实现五子棋 GUI (二)
- SDL 实现五子棋 GUI (三)
- SDL实现多个按钮
- Projective Texture的原理与实现 (转贴)
- 如何正确使用log4j
- 查sqlserver 版本信息, 实例名, 服务器名以及SP,trigger等object的定义
- npm shrinkwrap的用途
- 创建数据库和表
- [iOS 项目中用的MQTT以及注意点记录]
- sdl实现texture拖动
- 【HDU 1598】find the most comfortable road(并查集)
- 深度学习笔记——深度学习框架TensorFlow(九)[Building Input Functions with tf.contrib.learn]
- SVN管理
- 白话空间统计之二十五:空间权重矩阵(一)点数据的空间关系(1)
- 常用的调试手段
- POJ 3342 Party at Hali-Bula / HDU 2412 / UVAlive 3794 / UVA 1220
- 编译和链接(一)
- 论文笔记(一) GOTURN