范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

带薪玩一周游戏,还要涨工资

  作者:李晓飞
  来源:Python 技术
  带薪玩游戏,是多么开心的事情,我就找到了。
  前段时间,公司接到一个模拟业务场景的项目,需要在图形界面上模拟业务场景,比如人跑动,拖拽物体等,从而获取不太业务场景的模拟数据。
  想了一下,不就是编个游戏吗?之前写过  骰筛子 ,和  模拟疫情扩散  的程序,于是果断请缨……
  经过一个星期的尝试,终于用 Pygame 实现了业务场景的可视化模拟,坐等收钱。
  由于商务限制,无法展示模拟程序,所以今天制作一个  打猴子[1]  游戏,来介绍 Pygame 的一些用法,这个游戏也是我完成模拟程序的主要学习对象。 重识 Pygame
  之前对 Pygame 的认识很肤浅,停留在画图工具的层面上。
  通过学习和探索之后,才发现 Pygame 的强度功能,而且有很多框架和组件,帮助开发者提高效率,比如对象类  Sprite[2]  等。
  Pygame 中 Surface 是个很重要的概念,相当于  Ps(Photo shop)[3]  的图层,图层之间可以叠加,可以相对所在图层定位,比如将背景图层相对屏幕定位后,背景图层上的其他图层可以相对于背景定位,这样就不用每次都计算一个图层想对于屏幕的具体位置了。 打猴子游戏
  Chimp[4]  是 Pygame 文档中的一个示例,帮助开发者学习和理解,我们就以这个游戏为,并且在原版基础上,做了些改动,比如加入了游戏统计信息的显示等。
  最终效果是这样的:
  打猴子游戏  思路
  打猴子游戏,就是一只猴子在不断地跑,然后用鼠标控制一个拳头去击打它,玩的过程中会记录击中次数和击中率。
  根据游戏思路,游戏中有猴子和拳头两个对象,对了提高可玩性,需要添加一些音效和动作。  实现
  实现过程将分为 游戏加载、对象设置、游戏主循环三个方面做说明。  游戏资源
  游戏有两种资源,对象图像和声效。
  图像资源可以是图片,格式可以是比如 bmp,jpg,png 等。
  我们编写一个图像加载方法:  def load_image(name, colorkey=None):     fullname = os.path.join("chimp_data", name)     try:          image = pygame.image.load(fullname)     except pygame.error as message:         print("Cannot load image:", name)         raise SystemExit(message)     image = image.convert()     if colorkey is not None:         if colorkey is -1:             colorkey = image.get_at((0, 0))         image.set_colorkey(colorkey, RLEACCEL)     return image, image.get_rect() load_image  方法用来加载一个图像,参数 name  为图像文件名,colorkey  为需要去除的关键颜色 利用  Pygame.image.load  用图片文件创建为 image  对象 image.convert()  的作用是对图像做适应环境的优化,以便绘制更高效 如果  colorkey  参数没有提供的话,会将图像上第一个像素颜色作为 colorkey  image.set_colorkey(colorkey, RLEACCEL)  用于设置图像的 colorkey ,其中 RLEACCEL  作用是对 colorkey  做除去操作 方法返回图像对象和图像的矩形区域,矩形区域在对象绘制时很重要
  声效资源的加载也类似:  def load_sound(name):     class NoneSound:         def play(self): pass     if not pygame.mixer:         return NoneSound()     fullname = os.path.join("chimp_data", name)     try:         sound = pygame.mixer.Sound(fullname)     except pygame.error as message:         print("Cannot load sound:", fullname)         raise SystemExit(message)     return sound pygame.mixer  是 Pygame 的声音合成器,如果电脑设备上没有声卡(声音处理组件),将无法播放声音 定义了一个  NoneSound  类,实现了空的 play 方法,以便在没有声卡的设备上正常运行 最好返回声音资源
  通过  load_image  和 load_sound  两个方法,就完成了游戏中资源的加载。 对象设置
  现在可以定义游戏对象了,需要处理样式,形态,状态等,为了对象定义动作行为等。
  如果光靠手工绘制,是很麻烦的,Pygame 提供了对象类 Sprite,只需要初始化数据,实现状态更新就可以了。
  游戏需要两种对象:拳头和猴子。
  拳头,需要在屏幕上显示一个拳头,并且需要跟着鼠标移动,当做打击动作时,需要变化形态,具体的代码如下:  class Fist(pygame.sprite.Sprite):     def __init__(self):         super().__init__(self)         self.image, self.rect = load_image("fist.bmp", -1)         self.punching = 0      def update(self):         """拳头随鼠标移动"""         pos = pygame.mouse.get_pos()         self.rect.midtop = pos         if self.punching:             self.rect.move_ip(5, 10)      def punch(self, target):         """返回是否打击到目标"""         if not self.punching:             self.punching = 1             hitbox = self.rect.inflate(-5, -5)             return hitbox.colliderect(target.rect)      def unpunch(self):         """结束打击"""         self.punching = 0 在初始化方法  __init__  里,用 load_image  加载了拳头图像,获得了 image  和 rect ,这两个属性是 Sprite  对象必须的 update  是必须实现的 Sprite  方法,用来更新对象的状态:首先获得鼠标的位置坐标,并将位置赋予对象区域,即将对象区域的中上位置移动到鼠标位置,从而实现对象位置的变化 然后判读对象是否处于击打状态,如果是则将对象的相对位置,向右移动 5 个像素,向下移动 10 个像素,表示在向下挥舞拳头  punch  是自定义方法,作为外边调用的接口。调用时会设置对象状态,并返回是否击中。具体是:如果击打的话,且当前不是在击打状态时,设置状态为击打中,并将对象的区域缩小 5 个像素,即打击下去的话拳头远去,区域会缩小。 colliderect  方法用于做碰撞检测,即与目标的区域做判断,是否碰撞到一起 unpunch  也是自定方法,结束击打之后,将击打状态设置为否
  仔细阅读代码就会发现, Sprite  让一个业务复杂的对象很简单地实现了,而且不用关注如何绘制。
  同样的方式定义猴子对象,猴子对象需要自动移动,如果被打击到,会做旋转动作,具体代码如下:  class Chimp(pygame.sprite.Sprite):     def __init__(self):         super().__init__(self)         self.image, self.rect = load_image("chimp.bmp", -1)         screen = pygame.display.get_surface()         self.area = screen.get_rect()         self.rect.topleft = 60, 10         self.move = 9         self.dizzy = 0      def update(self):         """根据状态调整猴子行为"""         if self.dizzy:             self._spin()         else:             self._walk()             pass      def _walk(self):         """猴子在屏幕之间移动,当碰到屏幕边缘时返回"""         newpos = self.rect.move((self.move, 0))         if not self.area.contains(newpos):             self.move = -self.move             newpos = self.rect.move((self.move, 0))             self.image = pygame.transform.flip(self.image, 1, 0)         self.rect = newpos      def _spin(self):         """旋转猴子图片"""         center = self.rect.center         self.dizzy += 12         if self.dizzy >= 360:             self.dizzy = 0             self.image = self.original         else:             rotate = pygame.transform.rotate             self.image = rotate(self.original, self.dizzy)         self.rect = self.image.get_rect(center=center)      def punched(self):         """被击中时调用"""         if not self.dizzy:             self.dizzy = 1             self.original = self.image __init__  中,area  获取了屏幕的区域,以便判断猴子移动范围;move 为移动速度,即每帧移动多数像素,值越大速度越快 update  方法中,根据对象状态调用对于状态的行为 _walk  方法为走动行为,首先将对象区域移动到新位置,获得新位置范围 newpos ,然后判断新位置是否在屏幕区域 area  中,没有的话,将移动距离设置为相反数,向相反的方向移动;pygame.transform.flip  的作用时让图片水平翻转,好像猴子掉了个头一样 _spin  方法为转圈行为,当被打中之后,做360度旋转,dizzy  为旋转角度,每帧旋转 12 度,rotate  方法用于图像旋转,当旋转角度超出 360 度后,回复图像样式。 punched  方法在被击中时调用,只做状态设置,其中 original  是将旋转前的图像暂存起来,用于旋转结束后的图像恢复
  请注意   图像旋转方法  rotate  ,虽然能产生旋转效果,但是却不能指定旋转中心点,其旋转中心点为将图像刚好放在一个正方形的左侧时,正方形的中心点作为旋转中心点。
  如果要实现围绕特定中心点旋转,就需要在旋转之后,将图像移动到这个点。
  这就是在  _spin   方法中, self.rect = self.image.get_rect(center=center)   这句代码的作用——让图像围绕图像中心点旋转。
  到这里,我们的游戏对象就设置完成了。  理解主循环
  Pygame 中有个重要的概念就是主循环。
  一般来说,会认为对象会自动发生移动和操作。
  其实各种动作的游戏场景是由每帧图像合并而成的,就好比拍一个 pose,拍一张照,如此反复,最后将图片快速的切换,可以看到动画效果一样。
  理解了这个,就能理解为什么电脑游戏的性能常常用更多的帧数来衡量的,更多的帧,意味着需要每秒绘制更多的图像。
  Pygame 就是这么做的,通过一个主循环,不断地绘制对象的行为,从而产生动画效果。
  主循环实际上就是个死循环,通过  pygame.time.Clock  控制游戏帧数。
  来看看具体代码:  def main():     # 初始化     pygame.init()      screen = pygame.display.set_mode((468, 90))  # 设置窗口大小,获得窗口屏幕     pygame.display.set_caption("Monkey Fever")  # 窗口标题     pygame.mouse.set_visible(0)  # 隐藏鼠标      background = pygame.Surface(screen.get_size()) # 设置背景     background = background.convert()     background.fill((250, 250, 250))      if pygame.font:         font = pygame.font.SysFont("SimHei",24)  # 设置字体      whiff_sound = load_sound("whiff.wav")  # 加载声音资源     punch_sound = load_sound("punch.wav")      # 创建对象     chimp = Chimp()     fist = Fist()      # 将对象添加到对象控制组     allsprites = pygame.sprite.Group((fist, chimp))      # 获取游戏时钟     clock = pygame.time.Clock()      # 游戏统计     punchcount = 0     hitcount = 0          while 1:         clock.tick(60)  # 设置游戏帧数          # 事件循环         for event in pygame.event.get():             if event.type == QUIT:                 return             elif event.type == KEYDOWN and event.key == K_ESCAPE:                 return             elif event.type == MOUSEBUTTONDOWN:                 punchcount += 1                 if fist.punch(chimp):                     punch_sound.play()  # 击中                     chimp.punched()                     hitcount += 1                 else:                     whiff_sound.play()  # 错过                     pass             elif event.type == MOUSEBUTTONUP:                 fist.unpunch()          bg = background.copy()         # 合成游戏统计信息                 if punchcount > 0:             msg = "打中次数: %d 击中率: %d%s" % (hitcount, round((hitcount/punchcount)*100), "%")         else:             msg = "挥舞拳头吧!"         # 绘制统计信息         text = font.render(msg, 1, (10, 10, 10))         textpos = text.get_rect(centerx=background.get_width()/2)         bg.blit(text, textpos)          allsprites.update() # 更新对象状态         screen.blit(bg, (0, 0)) # 绘制背景         allsprites.draw(screen) # 绘制对象         pygame.display.flip() # 刷新屏幕 main  方法为游戏的主方法,会在游戏启动时调用 在  while  之前的代码主要做的是初始化和定义,需要注意字体的设置,如果需要显示汉字的话,需要加载中文字体,可以参考这篇文章[5]  while  里面是个游戏的主循环,首先设置游戏帧数为 60 帧;然后进入事件循环,游戏过程中的事件都会存储在 Pygame 的 event  中,通过 get  方获取,对我们关心的事件进行处理,比如游戏退出事件,鼠标点击事件等 在鼠标点击中,判断是否打中猴子,如果打中,播放打中音效,并且调用猴子被击中的方法  punched ;如果没有打中,播放挥舞空拳的音效。如果捕获到鼠标键抬起事件,则调用停止打击方法。 事件循环之后,进行画面绘制,首先是拷贝一个起始背景,因为在每次绘制都会污染背景。然后绘制游戏信息,将信息绘制在背景上。  allsprites.update()  会调用对象组里的每个对象的 update  方法,完成对象的状态更新 allsprites.draw(screen)  将对象图像绘制到窗口中 pygame.display.flip()  刷新屏幕,我们就会看到新的游戏画面了
  至此游戏的主要编码工作就完成了,不到 200 行代码,做了一个可玩的小游戏,赶紧运行起来试试吧。  总结
  这个简单的游戏制作过程,让我更深入地理解了 Pygame 的特点和使用方法,建立起来游戏开发的基本认知。
  总体来看,要学会一个新东西,需要正确的理解它的核心概念,与自己原来的知识体系相融合,就能很快习得,而能灵活应用的前提是多玩多练。
  通过一个星期的探索实践,为客户解决了模拟业务场景的问题,坐等加薪。
  期望通过这个练习也能帮助你扩展一项技能,开拓一条道路,比心。

有没有什么厉害的app推荐一下?1。全世界酷炫到不敢相信地覆盖历史文化地理领域的全场景app仅仅一个时空柱,就把世界历史国别史展示得生动有趣形象直观。深受历史爱好者的喜欢。任何一个历史时间,都是有人物场景关系影响为什么那么多人认为滴滴不公平,还这么多司机跑呢?这实际上就是滴滴高明之处,利用了现在物价高,就业困难,工作不稳定,医保养老年年涨等诸多因素,总的来说就是差钱,而滴滴是一个相对自由的可兼职挣钱的工作,可以利用现有车辆的资源挣钱,起12G256G高配抄底?2022这3款旗舰手机大跳水哪一款都成优选12G256G高配抄底?2022这3款旗舰手机大跳水,哪一款都成优选本文原创,禁止搬运和抄袭,违者必究!导语你是喜欢尝鲜,选择优先购买新品发布会后首发产品用户?还是一枚资深的等等党量产有序推进苹果iPhone14开始小范围试产PChome手机频道报道据分析师郭明錤的报告显示,苹果iPhone14系列已经开始了小范围的试产,试产阶段主要在于发现问题并解决,iPhone14系列真正开始量产的时间要从6月份开网上30元买500G的流量卡?当心是陷阱,买卡充值你就被套路了!(央视财经第一时间)提起手机SIM卡,相信很多人都知道,通过它你的手机可以打电话发短信上网络,但说到物联卡可能很多人就比较陌生了。其实,它和手机卡的功能很相似,只不过主要被用于物联买手机别被套路了!看懂这几个参数,手机好坏就稳了一部手机性能好不好使用寿命长不长,该怎么衡量呢?听取其他使用者的意见固然很重要,可是最重要的还是靠自己精准鉴别。那接下来就看看买手机该认准哪些参数吧!1。CPU不管是手机还是电脑,分布式架构系列负载均衡技术详解技术头条戳蓝字CSDN云计算关注我们哦!技术头条干货简洁多维全面。更多云计算精华知识尽在眼前,get要点solve难题,统统不在话下!作者ITFLY8转自架构师技术联盟面对大量用户访问高并中国固态电池组解决方案获爱迪生金奖,下一代电池技术全球领先?爱迪生奖颁奖典礼是创新技术产业最大的年度活动之一,在今年4月4日美国纽约世贸中心举行的颁奖典礼中,专攻固态电池的独角兽公司Prologium(辉能科技)开发的固态电池组赢得了该类别看锁芯还是品牌技术?买智能门锁你需要知道这些!对家庭用户而言,门锁往往是家庭安全的首道防线,因此用户对待门锁非常审慎。从网上搜索数据来看,消费者在搜索引擎上查询智能门锁的消息时,包括智能门锁安全小黑盒弊端等关键词出现的概率比较世界首个全数字化房屋,3D打印技术与机器人联合,已在瑞典面世随着人力成本的增长,能够24小时不间断工作机器人成了商家新的选择,尤其是工程量巨大的建造领域,有了机器人的加入,就能够加快工作的效率,让工程可以尽早的完工,除此之外,3D打印技术目周报呷哺营收47。34亿周黑鸭1年少赚2。2亿瑞幸4500万担保2018年中国72个重点购物中心销售额统计出炉,北京SKP销售额135亿元排在头位,而南京德基广场超100亿元呷哺呷哺发布年报营收47。34亿元,湊湊强势增长扭亏为盈周黑鸭年报1年
大众纯电动汽车热泵热管理系统继大众ID。4X亮相上海车展之后,以补贴后19。99万到27。29万的终端价格上市销售在汽车圈引起了广泛关注。其中ID。4X采用的二氧化碳制冷剂和热泵热管理系统引来了很多关注。那么科普汽车功能安全是什么随着汽车智能化电气化技术的快速普及,车内控制器和相应的电子部件越来越多。相应的汽车功能安全变得越来越重要。那么什么是汽车功能安全,它为什么和车规级芯片相关度这么高呢?车辆使用过程中共享汽车的发展挑战与机遇之前小星带着大家体验了EVCARD分时租赁服务,车型包括通用别克Velite6纯电动MAV荣威Ei5纯电旅行车ERX5纯电动SUV和宝马i3增程式电动车等等。最近EVCARD推出了上海车展固态激光雷达助力自动驾驶2021上海车展迎来了很多配备自动驾驶功能的车型。而其中固态激光雷达技术成为了助力自动驾驶技术革新的关键。一起来跟小星逛逛车展,看看那些配备固态激光雷达的车型吧。智己L7上汽集团全上海车展i上海车展比亚迪展台除了带来了一系列重点车型以外,比亚迪还特意展示了核心新能源技术的发展历程和系统演示平台。随着国家发布越来越严格的排放和油耗要求,出色的混合动力技术成为竞争核心。那小巧美丽,功能强大,520礼物首选坚果G9每年的5月20日,不光是单身族猛吃狗粮的时候,更是考验情侣情商跟创意的大型送命现场。不少直男表示,光是想礼物这件事就足够让人头疼了。化妆品功课做不懂,男生喜欢的礼物女生又不一定会喜刚刚上架AppStore的影视App,iOS和安卓都支持大家好,我是波老师。看到很多小伙伴又开始私信要影视神器了,之前波老师分享过不少这类App,但确实好多都已经无法打开,甚至AppStore也已经下架了一般来说,当你们打开链接却显示本华为mate30pro的使用心得2020年1月1日正式告别苹果,成功更换成华为手机,不是因为手机那怎么样。有两点原因,一是因为工作需要需要使用两个微信,不愿意带两个手机,所以选择更换还有就是真的被没有音量键的瀑布因为限速,百度网盘将被整治!不限速的百度网盘,真的要来了?近日,工信部最近发了一篇文章关于开展信息通信服务感知提升行动的通知。波老师划重点相关企业应优化产品服务资费介绍,清晰明示存储空间传输速率功能权益及资费水平等内容,不得进行误导宣传。一个字,膜不管之前使用的苹果6p,8p二手购买的XS还是现在的华为mate30pro,X2。个人认为对于膜来说我用的种类不说很多但也不少,今天就分析一下。1。普通钢化膜,不管在页面上怎么吹捧安踏正式签约王一博,几家欢喜,几家愁五一期间,也是北京冬奥会特许上新日。徽章会议杯套装箱包等一系列纪念性和实用性兼备的一大波北京冬奥特许新品来袭,作为一直致力于为中国国家队打造专业运动装备的安踏,也正式官宣了王一博将