一.效果

二.简介

游戏中,按钮是必不可少的控件.但是pygame并没有给我们提供相关的功能.那么只能自己写一个啦.

演示工程的下载地址:https://pan.baidu.com/s/1dCgCs8t2FPn1DstRyAF84g

三.相关代码

Button.py:

class Button:NORMAL=0MOVE=1DOWN=2def __init__(self,x,y,text,imgNormal,imgMove=None,imgDown=None,callBackFunc=None,font=None,rgb=(0,0,0)):"""初始化按钮的相关参数:param x: 按钮在窗体上的x坐标:param y: 按钮在窗体上的y坐标:param text: 按钮显示的文本:param imgNormal: surface类型,按钮正常情况下显示的图片:param imgMove: surface类型,鼠标移动到按钮上显示的图片:param imgDown: surface类型,鼠标按下时显示的图片:param callBackFunc: 按钮弹起时的回调函数:param font: pygame.font.Font类型,显示的字体:param rgb: 元组类型,文字的颜色"""#初始化按钮相关属性self.imgs=[]if not imgNormal:raise Exception("请设置普通状态的图片")self.imgs.append(imgNormal)     #普通状态显示的图片self.imgs.append(imgMove)       #被选中时显示的图片self.imgs.append(imgDown)       #被按下时的图片for i in range(2,0,-1):if not self.imgs[i]:self.imgs[i]=self.imgs[i-1]self.callBackFunc=callBackFunc      #触发事件self.status=Button.NORMAL       #按钮当前状态self.x=xself.y=yself.w=imgNormal.get_width()self.h=imgNormal.get_height()self.text=textself.font=font#文字表面self.textSur=self.font.render(self.text,True,rgb)def draw(self,destSuf):dx=(self.w/2)-(self.textSur.get_width()/2)dy=(self.h/2)-(self.textSur.get_height()/2)#先画按钮背景if self.imgs[self.status]:destSuf.blit(self.imgs[self.status], [self.x, self.y])#再画文字destSuf.blit(self.textSur,[self.x+dx,self.y+dy])def colli(self,x,y):#碰撞检测if self.x<x<self.x+self.w and self.y<y<self.y+self.h:return Trueelse:return Falsedef getFocus(self,x,y):#按钮获得焦点时if self.status==Button.DOWN:returnif self.colli(x,y):self.status=Button.MOVEelse:self.status=Button.NORMALdef mouseDown(self,x,y):if self.colli(x,y):self.status = Button.DOWNdef mouseUp(self):if self.status==Button.DOWN:    #如果按钮的当前状态是按下状态,才继续执行下面的代码self.status=Button.NORMAL   #按钮弹起,所以还原成普通状态if self.callBackFunc:       #调用回调函数return self.callBackFunc()

相关方法说明:

def draw(self,destSur):用来绘制按钮,destSur是你要绘制的地方,一般是窗体的surface

def colli(self,x,y):检测鼠标是否在按钮范围内,x,y是鼠标坐标.返回值True:在范围内,False:不再范围内

def mouseDown(self,x,y):鼠标按下的时候调用的方法,功能是令按钮的显示状态变为按下状态

def mouseUp(self):鼠标弹起时调用的方法,并且会触发按钮的回调函数,返回值是回调函数的返回值

使用:

下面的代码依赖了三个按钮图片,请把图片文件与代码文件放在同一文件夹下.

main.py:

import pygamefrom Button import Button# 初始化pygame
pygame.init()
winSur = pygame.display.set_mode([300, 300])# 加载按钮图片
surBtnNormal = pygame.image.load("./btn_normal.png").convert_alpha()
surBtnMove = pygame.image.load("./btn_move.png").convert_alpha()
surBtnDown = pygame.image.load("./btn_down.png").convert_alpha()#按钮使用的字体
btnFont = pygame.font.SysFont("lisu", 40)# 按钮的回调函数
def btnCallBack():print("我被按下了")# 创建按钮
btn1 = Button(30, 50, "按钮测试", surBtnNormal, surBtnMove, surBtnDown, btnCallBack,btnFont,(255,0,0))
btn2 = Button(30, 150, "", surBtnNormal, surBtnMove, surBtnDown, btnCallBack,btnFont)# 游戏主循环
while True:mx, my = pygame.mouse.get_pos()  # 获得鼠标坐标for event in pygame.event.get():if event.type == pygame.QUIT:exit()elif event.type == pygame.MOUSEMOTION:  # 鼠标移动事件# 判断鼠标是否移动到按钮范围内btn1.getFocus(mx, my)btn2.getFocus(mx, my)elif event.type == pygame.MOUSEBUTTONDOWN:  # 鼠标按下if pygame.mouse.get_pressed() == (1, 0, 0): #鼠标左键按下btn1.mouseDown(mx,my)btn2.mouseDown(mx, my)elif event.type == pygame.MOUSEBUTTONUP:  # 鼠标弹起btn1.mouseUp()btn2.mouseUp()pygame.time.delay(16)winSur.fill((0, 0, 0))#绘制按钮btn1.draw(winSur)btn2.draw(winSur)#刷新界面pygame.display.flip()

python游戏开发实战:游戏按钮相关推荐

  1. iOS cocos2d 2游戏开发实战(第3版)---你的第一个游戏!

    2019独角兽企业重金招聘Python工程师标准>>> 随着苹果公司不断地创新与发展,新的iPhone 5.iPad 4以及iPad mini产品相继问世,包括iOS与Xcode在内 ...

  2. HTML5 Canvas游戏开发实战 PDF扫描版

    HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读 ...

  3. 微信小游戏开发实战教程13-随机生成形状功能的实现

    微信小游戏开发实战系列的第13篇. 本节内容包括:通过使用列表来实现可以设置权重的随机功能,以及游戏中的随机生成形状功能的具体实现. 如果你没有任何的游戏开发经验,欢迎阅读我的"人人都能做游 ...

  4. 《Unity 5.x游戏开发实战》一1.9 添加一个水平面

    本节书摘来异步社区<Unity 5.x游戏开发实战>一书中的第1章,第1.9节,作者: Alan Thorn 译者: 李华峰 责编: 胡俊英,更多章节内容可以访问云栖社区"异步社 ...

  5. HTML5游戏开发实战

    <HTML5游戏开发实战> 基本信息 原书名:HTML5 Games Development by Example: Beginner's Guide 作者: (美)Makzan 译者: ...

  6. 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)

    文章目录 一.前言 二.实现方案 1.无主之地,第一人称视角 2.我之前做的摇杆控制 3.第一人称视角 + 摇杆控制 三.开始实战 1.资源获取:Unity AssetStore 2.Low Poly ...

  7. 【游戏开发实战】用Go语言写一个服务器,实现与Unity客户端通信(Golang | Unity | Socket | 通信 | 教程 | 附工程源码)

    文章目录 一.前言 二.Go开发环境搭建(Windows系统) 1.安装Go命令行工具 2.创建GoWorkspace目录 3.配置GOPATH环境变量 4.配置GOPROXY代理 5.安装VSCod ...

  8. 【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(附源码 | Mirror | 多人视频 | 详细教程)

    文章目录 一.前言 二.思考问题与解决方案 1.思考问题 2.解决方案 2.1.Unity中如何开启摄像头并对图像进行采样 2.2.图像如何中转给其他客户端 2.3.如何实现清晰度切换 2.4.客户端 ...

  9. 游戏开发实战之弹球游戏

    文/Steffen Itterheim.Andreas Löw 为了更好地使用Box2D物理引擎,本文我们将制作一个真实的弹球游戏.弹球游戏桌利用各种物理世界的效果来创造有趣的体验.然而,在使用物理引 ...

最新文章

  1. html研究中心,seo研究中心 教程:认识HTML、css的重要性-专业SEO技
  2. 数据告诉你史上最年轻35000分先生到底有多强?
  3. Introduction or Why Should I Bother
  4. 联合国隐私监督机构:大规模信息监控并非行之有效
  5. 关于Android 传感器坐标与读数的进一步讨论
  6. java hasmoreelements_Java IOException.hasMoreElements方法代码示例
  7. python读取word图片_Python中如何读取Word中的图片
  8. 一个很Low的通讯录管理系统(但是能用)C/C++单链表实现
  9. 多路平衡查找树 --- B(B-)树
  10. 出道50年+!乘风破浪的编程语言们,能二次翻红吗?
  11. vue联动切换搜索域
  12. 【漫画】AI小猪的一生---阿里云ET农业大脑如何与特驱集团养出“200公里猪”
  13. python如何读取文本_python 如何读取windows-1252格式文本?
  14. linux用户组和权限分配
  15. 2019-5-6作业
  16. java 通过sftp服务器上传下载删除文件
  17. AR Camera开发记录(一) -- Rajawali的使用
  18. camera内存优化
  19. java 专业英语单词_java_专业英语单词_力荐
  20. todo已完成任务_总结一下TODO的用法

热门文章

  1. Unity制作二次元卡通渲染角色材质——3、高光反射与ILM贴图
  2. 雷林鹏分享:PHP Secure E-mails
  3. OSCP-UT99(IRC、Unreal Tournament 99)
  4. 前端h5 播放器vue-video-player
  5. Vue之vuex实现简易计算器
  6. Python——基于最小二乘法和最大似然法的回归分析方程中系数的估计
  7. WebSocket前后端联调
  8. python之父头发-校招C++大概学习到什么程度?
  9. MySQL 中外键与使用详解
  10. 当无法打开eclipse可能的解决方法