按钮制作

按钮我们定义三种状态, 1.按钮区域外,2.按钮区域内,3.按钮被点下

对三种状态可以分别显示不同的图片。

#ifndef SKBUTTON_H_
#define SKBUTTON_H_#include "SkComm.h"
#include "SkImage.h"#include <vector>
#include <string>
using namespace std;
namespace sk_park {typedef enum _SkButtonStatus {SK_BUTTON_STATUS_OUT = 1,SK_BUTTON_STATUS_IN = 2,SK_BUTTON_STATUS_PRESSED = 3,
} SkButtonStatus;class SkButton {
public:/**按钮的位置信息,只作为成员属性,按钮绘制的位置需要在绘制时候指定**/Sint32 m_iPosX;Sint32 m_iPosY;/**按钮是否显示**/bool m_bShow;/**按钮是否监听事件**/bool m_bListen;/**鼠标在按钮内的显示**/SkSurface m_effectIn;/**鼠标在按钮外的显示**/SkSurface m_effectOut;/**鼠标在按钮按下的显示**/SkSurface m_effectPressed;/**鼠标当前状态**/SkButtonStatus m_status;/**按钮标识**/int m_iId;string m_sName;/**按钮覆盖区域-多边形**/SkArea m_area;SkButton();~SkButton();void setShow(SkSurface & effectIn, SkSurface & effectOut,SkSurface & effectPressed);/**处理事件,iPosX+iPosY:按钮当前位置,pData:外传数据**/bool handleEvent(Sint32 iPosX, Sint32 iPosY, SkEvent & stEvent,void * pData);/**回调函数**/void setFuncPressed(void (*func_pressed)(void *, SkButton *));SkSurface * getShow(Sint64 iTime);void setPosition(Sint32 x, Sint32 y);private:bool bPointIn(Sint32 iX, Sint32 iY);void (*m_func_pressed)(void *, SkButton * pButton);
};}extern sk_park::SkButton g_SkButton;#endif /* SKBUTTON_H_ */

具体实现

#include "pch.h"#include "SkButton.h"
using namespace sk_park;SkButton::SkButton() {m_bShow = true;m_bListen = true;m_status = SK_BUTTON_STATUS_OUT;m_func_pressed = NULL;m_iId = 0;
}SkButton::~SkButton() {}
void SkButton::setFuncPressed(void (*func_pressed)(void *, SkButton *)) {m_func_pressed = func_pressed;
}
void SkButton::setShow(SkSurface & effectIn, SkSurface & effectOut,SkSurface & effectPressed) {m_effectIn = effectIn;m_effectOut = effectOut;m_effectPressed = effectPressed;
}
bool SkButton::bPointIn(int32_t iX, int32_t iY) {return m_area.bPointIn(iX, iY);
}
void SkButton::setPosition(Sint32 x, Sint32 y) {m_iPosX = x;m_iPosY = y;
}
bool SkButton::handleEvent(int32_t iPosX, int32_t iPosY, SkEvent & stEvent,void * pData) {//g_SkComm.log("[%s][%d]posx:%d posy:%d ex:%d ey:%d", __FILE__, __LINE__,//     iPosX, iPosY, stEvent.iX, stEvent.iY);if (!m_bListen) {return false;}bool bRet = false;if (stEvent.type.type == SDL_MOUSEMOTION) {int32_t iX = stEvent.iX - iPosX;int32_t iY = stEvent.iY - iPosY;if (m_status == SK_BUTTON_STATUS_IN|| m_status == SK_BUTTON_STATUS_OUT) {if (bPointIn(iX, iY)) {m_status = SK_BUTTON_STATUS_IN;bRet = true;} else {m_status = SK_BUTTON_STATUS_OUT;}} else if (m_status == SK_BUTTON_STATUS_PRESSED) {if (!bPointIn(iX, iY)) {m_status = SK_BUTTON_STATUS_OUT;}}} else if (stEvent.type.type == SDL_MOUSEBUTTONDOWN) {int32_t iX = stEvent.iX - iPosX;int32_t iY = stEvent.iY - iPosY;if (bPointIn(iX, iY)) {m_status = SK_BUTTON_STATUS_PRESSED;bRet = true;}} else if (stEvent.type.type == SDL_MOUSEBUTTONUP) {SkButtonStatus oldStatus = m_status;int32_t iX = stEvent.iX - iPosX;int32_t iY = stEvent.iY - iPosY;if (bPointIn(iX, iY)) {m_status = SK_BUTTON_STATUS_IN;bRet = true;} else {m_status = SK_BUTTON_STATUS_OUT;}if (oldStatus == SK_BUTTON_STATUS_PRESSED) {if (m_func_pressed != NULL) {m_func_pressed(pData, this);bRet = true;}}}return bRet;
}SkSurface * SkButton::getShow(Sint64 iTime) {if (m_status == SK_BUTTON_STATUS_IN) {return &m_effectIn;} else if (m_status == SK_BUTTON_STATUS_PRESSED) {return &m_effectPressed;} else {return &m_effectOut;}
}SkButton g_SkButton;

按钮的点击区域,设一个区域类来管理

class SkArea {
public:SkArea();~SkArea();void clear();/**判断点是否在面积内部**/bool bPointIn(float fX, float fY);/**多边型添加点**/void addPoint(float fX, float fY);
private:int m_iNum;float * m_pFX;float * m_pFY;/**禁止拷贝构造**/SkArea(SkArea & obj);
};
SkArea::SkArea() {m_iNum = 0;m_pFX = NULL;m_pFY = NULL;
}
SkArea::~SkArea() {if (m_pFX != NULL) {delete[] m_pFX;m_pFX = NULL;}if (m_pFY != NULL) {delete[] m_pFY;m_pFY = NULL;}m_iNum = 0;
}
void SkArea::clear() {if (m_pFX != NULL) {delete[] m_pFX;m_pFX = NULL;}if (m_pFY != NULL) {delete[] m_pFY;m_pFY = NULL;}m_iNum = 0;
}
bool SkArea::bPointIn(float fX, float fY) {int i, j;bool inside = false;double polygon_area = 0;double trigon_area = 0;for (i = 0, j = m_iNum - 1; i < m_iNum; j = i++) {polygon_area += m_pFX[i] * m_pFY[j] - m_pFX[j] * m_pFY[i];trigon_area += abs(fX * m_pFY[i] - fX * m_pFY[j] - m_pFX[i] * fY+ m_pFX[i] * m_pFY[j] + m_pFX[j] * fY- m_pFX[j] * m_pFY[i]);}trigon_area *= 0.5;polygon_area = abs(polygon_area * 0.5);if (fabs(trigon_area - polygon_area) < 1e-7)inside = true;return inside;
}
void SkArea::addPoint(float fX, float fY) {float * pFx = new float[m_iNum + 1];float * pFy = new float[m_iNum + 1];for (int i = 0; i < m_iNum; i++) {pFx[i] = m_pFX[i];pFy[i] = m_pFY[i];}pFx[m_iNum] = fX;pFy[m_iNum] = fY;if (m_pFX != NULL) {delete[] m_pFX;m_pFX = NULL;}if (m_pFY != NULL) {delete[] m_pFY;m_pFY = NULL;}m_pFX = pFx;m_pFY = pFy;m_iNum++;
}

使用示例:

SkImage pic_ch_1;SkImage pic_ch_2;pic_ch_1.load("pic/ch1.png");pic_ch_2.load("pic/ch2.png");m_testButton.setShow(pic_ch_1.m_skSurface, pic_ch_1.m_skSurface,pic_ch_2.m_skSurface);m_testButton.m_area.addPoint(0, 0);m_testButton.m_area.addPoint(0, pic_ch_1.m_iHeight);m_testButton.m_area.addPoint(pic_ch_1.m_iWidth, pic_ch_1.m_iHeight);m_testButton.m_area.addPoint(pic_ch_1.m_iWidth, 0);m_testButton.setPosition(400, 400);

此时按钮显示已经做完了,我们需要在屏幕的点击和移动事件中,调用事件处理函数。

void ViewFirst::doEvent(SkEvent & stSkEvent, Sint64 iCurMTime) {bool bRet = m_testButton.handleEvent(m_testButton.m_iPosX,m_testButton.m_iPosY, stSkEvent, NULL);if (bRet) {return;}
}

效果如下:

SDL游戏之路(十一)--按钮制作相关推荐

  1. 【微信小游戏实战】零基础制作《欢乐停车场》三、游戏场景制作

    1.游戏立项 微信小游戏中有一款<欢乐停车场Plus>的小游戏,大家可以搜索玩下.这是一款益智类的小游戏,游戏中有红.黄.绿.蓝.紫5辆豪车6个停车位,玩家通过可行走路线移动小车,最终让各 ...

  2. 【微信小游戏实战】零基础制作《欢乐停车场》一、游戏设计

    1.游戏立项 微信小游戏中有一款<欢乐停车场>的小游戏,大家可以搜索玩下.这是一款益智类的小游戏,游戏中有红.黄.绿.蓝.紫5辆豪车6个停车位,玩家通过可行走路线移动小车,最终让各颜色的小 ...

  3. 游戏建模次世代角色模型制作教程,内藏超级无敌干货!

    游戏建模次世代角色模型制作整个制作的流程分为:原画设定阶段.中模阶段.高模阶段.低模阶段和贴图.' 原画设定阶段 关于此阶段的审核 此阶段需要自我审核,如果有疑问需要和组长.负责人以及主美进行沟通并理 ...

  4. 菜鸡教程(1):简易游戏每周推荐小程序制作

    写在前面:   1. 阅读本文最好具备一定html+css+js基础,并已成功注册微信小程序,成功下载了开发工具   2.菜鸡菜笔,如有不正,还请大佬们不吝惜赐教 接下来开始小程序的制作   1.首先 ...

  5. android游戏开发引擎唤境制作单机俯角射击h5小游戏教程

    1.新建项目 首先下载唤境,打开唤境,点击欢迎页左上角的新建项目按钮. 在弹出的项目设置中,选择窗口尺寸为1920*1080.命名为"俯角射击". 点击确定,即可进入我们新建的项目 ...

  6. 利用二分法查找 设计人与计算机猜数游戏,计算机游戏教学法第十一章.ppt

    <计算机游戏教学法第十一章.ppt>由会员分享,可在线阅读,更多相关<计算机游戏教学法第十一章.ppt(72页珍藏版)>请在装配图网上搜索. 1.第十一章 计算机游戏教学法,方 ...

  7. 计算机游戏教学法.ppt,计算机游戏教学法第十一章课件.ppt

    计算机游戏教学法第十一章课件 第十一章 计算机游戏教学法 方法简介: 游戏与严肃性 在通常的思路中,玩游戏就是一件极不严肃的事情,人们看到的只是游戏所带来的负面影响,却从不愿正视游戏的积极功能.比如我 ...

  8. 42佳优秀的 Photoshop 按钮制作教程

    想要一个好看点的按钮,可是在网上找来找去也没找到满意的.俗话说,自己动手,丰衣足食,想要满意的按钮,还是自己动手,想做成什么样就做成什么样.今天这篇文章就收集了42佳非常好的 Photoshop 按钮 ...

  9. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现 ...

  10. 【微信小游戏实战】零基础制作《欢乐停车场》二、关卡设计

    1.游戏立项 微信小游戏中有一款<欢乐停车场Plus>的小游戏,大家可以搜索玩下.这是一款益智类的小游戏,游戏中有红.黄.绿.蓝.紫5辆豪车6个停车位,玩家通过可行走路线移动小车,最终让各 ...

最新文章

  1. 自学成才翁_如何发挥自学成才的内在游戏
  2. Python命令行参数学习
  3. zend studio 9.0汉化
  4. android游戏加载,Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
  5. 风湿病年鉴 | scRNA-seq研究揭示骨关节炎患者的半月板退变新机制
  6. 突发!联想被责令立即开展全面整改
  7. 不服气不行,同样是码农,字节程序员的年薪居然达247万
  8. 组策略同步的频率和设置修改
  9. 一个rsync自动备份并发信通知的shell脚本
  10. 最新win7/win10/XP系统下载_「装机系统」_百度云
  11. MQL5 信号的优势
  12. Vmware虚拟机设置固定IP地址
  13. 李航《统计学习方法》课后习题答案(第2版)
  14. day9Python操作Excel
  15. Android 之大话-设计模式
  16. html外链怎么做,外链铺广之路如何走?外链实操战术整理
  17. vue图片裁切cropperjs的使用
  18. nginx的安装以及简单代理域名
  19. systemverilog:always_comb、always_latch、always_ff区别
  20. VUE项目 格林威治时间转换为北京时间

热门文章

  1. 手机号测性别 微信男女检测原理解析 技术分享
  2. 2020年最值得收藏的60个AI开源工具
  3. 修改app应用的图标与名字
  4. IDEA开发工具当前窗口导入多个项目
  5. OFDM专题之多径效应引起的码间串扰问题
  6. 用奈式第一准则判断是否有码间干扰
  7. PlantUML - 程序员必备绘图工具,不只是UML
  8. 差分放大电路的构成(零点漂移、差分放大电路是怎么构成的、共模信号、差模信号)
  9. librdkafka 封装的C++类
  10. win10 Kafka环境搭建 + 编译C++(librdkafka) 封装库