SDL按钮制作

自己封装了一个SDL按钮类,主要是实现了三种状态的切换(鼠标移入,移出,左键单击)和左键单击消息的响应(回调函数)

头文件代码

#ifndef BRBUTTON_H_
#define BRBUTTON_H_
#include "SDL.h"
typedef enum _BrButtonStatus {
	BR_BUTTON_STATUS_OUT = 1,
	BR_BUTTON_STATUS_IN = 2,
	BR_BUTTON_STATUS_PRESSED = 3,
} BrButtonStatus;

class CBrButton{
public:
	/**按钮的显示区域**/
	SDL_Rect m_rcButton;
	/**按钮是否显示**/
	bool m_bShow;
	/**按钮是否监听事件**/
	bool m_bListen;
	/**按钮标识**/
	int m_iId;

	CBrButton();
	~CBrButton();
	void CreateTexture(SDL_Surface* effectIn, SDL_Surface* effectOut,
			SDL_Surface* effectPressed);
	//处理事件
	bool handleEvent(SDL_Event & stEvent);
	/**回调函数**/
	void setFuncPressed(void (*func_pressed)(const CBrButton *));

	void SetRect(const SDL_Rect &rc);
	SDL_Rect GetRect();

	void SetRenderer(SDL_Renderer* renderer);

	void Draw();

private:
	/**鼠标在按钮内的显示**/
	SDL_Texture* m_pTextureIn;
	/**鼠标在按钮外的显示**/
	SDL_Texture* m_pTextureOut;
	/**鼠标在按钮按下的显示**/
	SDL_Texture* m_pTexturePressed;
	/**鼠标当前状态**/
	BrButtonStatus m_status;
	SDL_Renderer* m_pRenderer;


	bool bPointIn(int x, int y);
	void (*m_func_pressed)(const CBrButton * pButton);
	SDL_Texture * GetShowTexture();
};

#endif /* BRBUTTON_H_ */

实现文件代码

#include "BrButton.h"
CBrButton::CBrButton() {
	m_bShow = true;
	m_bListen = true;
	m_status = BR_BUTTON_STATUS_OUT;
	m_func_pressed = NULL;
	m_iId = 0;
	m_rcButton.x = 0;
	m_rcButton.y = 0;
	m_rcButton.w = 0;
	m_rcButton.h = 0;
	m_pTextureIn = NULL;
	m_pTextureOut = NULL;
	m_pTexturePressed = NULL;
	m_pRenderer = NULL;
}

CBrButton::~CBrButton() {
	if (NULL != m_pTextureIn)
	{
		SDL_DestroyTexture(m_pTextureIn);
	}
	if (NULL != m_pTextureOut)
	{
		SDL_DestroyTexture(m_pTextureOut);
	}
	if (NULL != m_pTexturePressed)
	{
		SDL_DestroyTexture(m_pTexturePressed);
	}

}
void CBrButton::setFuncPressed(void (*func_pressed)(const CBrButton *)) {
	m_func_pressed = func_pressed;
}
void CBrButton::CreateTexture(SDL_Surface* surfaceIn, SDL_Surface* surfaceOut,
							 SDL_Surface* surfacePressed) {
	if (NULL != m_pRenderer)
	{
		if (NULL == m_pTextureIn)
		{
			m_pTextureIn = SDL_CreateTextureFromSurface(m_pRenderer, surfaceIn);
		}
		if (NULL == m_pTextureOut)
		{
			m_pTextureOut = SDL_CreateTextureFromSurface(m_pRenderer, surfaceOut);
		}
		if (NULL == m_pTexturePressed)
		{
			m_pTexturePressed = SDL_CreateTextureFromSurface(m_pRenderer, surfacePressed);
		}
	}
}
bool CBrButton::bPointIn(int x, int y) {
	if (x >= m_rcButton.x && x <= (m_rcButton.x+m_rcButton.w) && y >= m_rcButton.y && y <= (m_rcButton.y+m_rcButton.h))
	{
		return true;
	}
	else
	{
		return false;
	}

}
bool CBrButton::handleEvent(SDL_Event & stEvent) {
	if (!m_bListen) {
		return false;
	}

	bool bRet = false;
	if (stEvent.type == SDL_MOUSEMOTION) {
		if (m_status == BR_BUTTON_STATUS_IN
				|| m_status == BR_BUTTON_STATUS_OUT) {
			if (bPointIn(stEvent.motion.x, stEvent.motion.y)) {
				m_status = BR_BUTTON_STATUS_IN;
				bRet = true;
			} else {
				m_status = BR_BUTTON_STATUS_OUT;
			}
		} else if (m_status == BR_BUTTON_STATUS_PRESSED) {
			if (!bPointIn(stEvent.motion.x, stEvent.motion.y)) {
				m_status = BR_BUTTON_STATUS_OUT;
			}
		}

	} else if (stEvent.type == SDL_MOUSEBUTTONDOWN) {
		if (bPointIn(stEvent.button.x, stEvent.button.y)) {
			m_status = BR_BUTTON_STATUS_PRESSED;
			bRet = true;
		}
	} else if (stEvent.type == SDL_MOUSEBUTTONUP) {
		BrButtonStatus oldStatus = m_status;
		if (bPointIn(stEvent.button.x, stEvent.button.y)) {
			m_status = BR_BUTTON_STATUS_IN;
			bRet = true;
		} else {
			m_status = BR_BUTTON_STATUS_OUT;
		}
		if (oldStatus == BR_BUTTON_STATUS_PRESSED) {
			if (m_func_pressed != NULL) {
				m_func_pressed(this);
				bRet = true;
			}
		}
	}
	return bRet;
}

SDL_Texture * CBrButton::GetShowTexture() {
	if (m_status == BR_BUTTON_STATUS_IN) {
		return m_pTextureIn;
	} else if (m_status == BR_BUTTON_STATUS_PRESSED) {
		return m_pTexturePressed;
	} else {
		return m_pTextureOut;
	}
}

void CBrButton::SetRect(const SDL_Rect &rc)
{
	m_rcButton = rc;
}

SDL_Rect CBrButton::GetRect()
{
	return m_rcButton;
}

void CBrButton::SetRenderer(SDL_Renderer* renderer)
{
	if (NULL != renderer)
	{
		m_pRenderer = renderer;
	}
}

void CBrButton::Draw()
{
	if (NULL != m_pRenderer)
	{
		SDL_RenderCopy(m_pRenderer, GetShowTexture(), NULL, &m_rcButton);//将pTexture绘制到Render
	}
}

使用步骤

1、生成一个按钮对象并设置按钮显示区域
CBrButton brBtn;
SDL_Rect rc;
rc.x = 50;
rc.y = 50;
rc.w = 50;
rc.h = 50;
brBtn.SetRect(rc);
2、为按钮设置渲染器
brBtn.SetRenderer(pRenderer);
3、分别创建三态Texture
SDL_Surface *pSurfaceIn = SDL_LoadBMP("C:\\in.bmp");
SDL_Surface *pSurfaceOut = SDL_LoadBMP("C:\\out.bmp");
SDL_Surface *pSurfacePre = SDL_LoadBMP("C:\\pre.bmp");
brBtn.CreateTexture(pSurfaceIn, pSurfaceOut, pSurfacePre);
SDL_FreeSurface(pSurfaceIn);
SDL_FreeSurface(pSurfaceOut);
SDL_FreeSurface(pSurfacePre);
4、设置左键单击回调函数(如果需要响应左键单击)
brBtn.setFuncPressed(func_BRClick);
5、在消息循环中响应消息
brBtn.handleEvent(sdl_event);
6、在合适的位置进行绘制
brBtn.Draw();

效果

蝴蝶是背景图,中间外字是按钮区域


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
SDL制作俄罗斯方块是完全可行的。SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,非常适合用于制作游戏。 首先,我们需要定义游戏的基本元素和规则。俄罗斯方块游戏通常由一个矩形的游戏区域、七种不同类型的方块和下落速度组成。玩家需要操作方块,使其在游戏区域中水平移动并旋转,直到方块堆积到游戏区域底部或其他方块上方。当一行填满时,该行将被清除,并获得得分。游戏继续进行直到方块堆积得太高时,导致游戏结束。 接下来,我们可以使用SDL的图形功能来绘制游戏界面。可以使用SDL的绘图函数来绘制游戏区域、方块和分数等。还可以使用SDL的输入功能来响应玩家的操作,如按键盘上的箭头键来控制方块的移动和旋转。 游戏的逻辑部分可以使用C或C++来编写。可以使用循环来控制方块的下落速度和游戏的进行。可以使用数组或链表来表示游戏区域和方块的位置。每一次循环,都需要检测方块是否可以向下移动或旋转,如果不能则堆积方块并生成新的方块。 游戏还需要处理方块堆积到顶部或其他方块上方时游戏结束的情况。此时可以使用SDL的消息框功能来显示游戏结束的提示信息,并可以根据需要选择重新开始游戏或退出游戏。 在编写完成后,可以使用SDL的编译工具来编译和构建游戏,并在支持SDL的平台上进行测试和运行。 总的来说,使用SDL制作俄罗斯方块是一个有趣和具有挑战性的项目。通过合理规划和编写,我们可以实现一个完整的俄罗斯方块游戏,并让玩家体验到经典的游戏乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值