上一节实现了小球自由移动,本节在上节基础上增加通过方向键控制小球运动,并为游戏增加了背景图片。

一、实现:

  1. # -*- coding:utf-8 -*-
  2. import os
  3. import sys
  4. import pygame
  5. from pygame.locals import *
  6. def load_image(pic_name):
  7. '''''
  8. Function:图片加载函数
  9. Input:NONE
  10. Output: NONE
  11. author: socrates
  12. blog:http://blog.csdn.net/dyx1024
  13. date:2012-04-15
  14. '''
  15. #获取当前脚本文件所在目录的绝对路径
  16. current_dir = os.path.split(os.path.abspath(__file__))[0]
  17. #指定图片目录
  18. path = os.path.join(current_dir, 'image', pic_name)
  19. #加载图片
  20. return pygame.image.load(path).convert()
  21. def control_ball(event):
  22. '''''
  23. Function:控制小球运动
  24. Input:NONE
  25. Output: NONE
  26. author: socrates
  27. blog:http://blog.csdn.net/dyx1024
  28. date:2012-04-15
  29. '''
  30. #相对偏移坐标
  31. speed = [x, y] = [0, 0]
  32. #速度
  33. speed_offset = 1
  34. #当方向键按下时,进行位置计算
  35. if event.type == pygame.KEYDOWN:
  36. if event.key == pygame.K_LEFT:
  37. speed[0] -= speed_offset
  38. if event.key == pygame.K_RIGHT:
  39. speed[0] = speed_offset
  40. if event.key == pygame.K_UP:
  41. speed[1] -= speed_offset
  42. if event.key == pygame.K_DOWN:
  43. speed[1] = speed_offset
  44. #当方向键释放时,相对偏移为0,即不移动
  45. if event.type in (pygame.KEYUP, pygame.K_LEFT, pygame.K_RIGHT, pygame.K_DOWN) :
  46. speed = [0, 0]
  47. return speed
  48. def play_ball():
  49. '''''
  50. Function:主函数
  51. Input:NONE
  52. Output: NONE
  53. author: socrates
  54. blog:http://blog.csdn.net/dyx1024
  55. date:2012-04-15
  56. '''
  57. pygame.init()
  58. #窗口大小
  59. window_size = Rect(0, 0, 700, 500)
  60. #设置窗口模式
  61. screen = pygame.display.set_mode(window_size.size)
  62. #设置窗口标题
  63. pygame.display.set_caption('运动的小球(2)-通过方向键控制小球移动')
  64. #加载小球图片
  65. ball_image = load_image('ball.gif')
  66. #加载窗口背景图片
  67. back_image = load_image('back_image.jpg')
  68. #获取小球图片的区域开状
  69. ball_rect = ball_image.get_rect()
  70. while True:
  71. #退出事件处理
  72. for event in pygame.event.get():
  73. if event.type == pygame.QUIT:
  74. pygame.quit()
  75. sys.exit()
  76. #使小球移动,速度由speed变量控制
  77. cur_speed = control_ball(event)
  78. #Rect的clamp方法使用移动范围限制在窗口内
  79. ball_rect = ball_rect.move(cur_speed).clamp(window_size)
  80. #设置窗口背景
  81. screen.blit(back_image, (0, 0))
  82. #在背景Surface上绘制 小球
  83. screen.blit(ball_image, ball_rect)
  84. #更新窗口内容
  85. pygame.display.flip()
  86. if __name__ == '__main__':
  87. play_ball()

二、测试

1、开始运行,小球位于窗口(0, 0)坐标处。

2、按下向右方向键,使用小球向右移动

3、按下向下方向键,使用小球向下移动。

Python:pygame游戏编程之旅三(玩家控制的小球)的更多相关文章

  1. 【python游戏编程之旅】第三篇---pygame事件与设备轮询

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...

  2. 【python游戏编程之旅】第七篇---pygame中的冲突检测技术

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...

  3. 【python游戏编程之旅】第一篇---初识pygame

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 一.pygame简介 Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础 ...

  4. 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/ ...

  5. 【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...

  6. 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...

  7. 【python游戏编程之旅】第二篇--pygame中的IO、数据

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇中,我们介绍了pygame的入门操作http://www.cnblogs.com/msxh/p/49 ...

  8. 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...

  9. 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...

  10. python+pygame游戏开发之使用Py2exe打包游戏

    最近在用python+pygame 开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本. 这会吓退99%以上的人……所以把我们的游戏打包(注意是打包而不是编 ...

随机推荐

  1. vue 报错 Component template should contain exactly one root element. If you are using v-if on multiple elements

    vue 报错 Component template should contain exactly one root element. If you are using v-if on multiple ...

  2. 【VMware VCF】VCF 5.2:配置管理域 vSAN 延伸集群。

    VMware vSAN 解决方案中,根据集群的配置类型分为 vSAN 标准集群.vSAN 延伸集群以及双主机集群(延伸集群特例).我们最常见的使用方式应该是 vSAN 标准集群,也就是 vSAN HC ...

  3. iptables NAT

    详解什么是NAT? IPtables中SNAT.DNAT和MASQUERADE的含义 Docker网络入门 – 默认设置

  4. 技术实践 | 在线 KTV 实现过程(内附demo体验)

    ​ 你在线上K过歌吗? 在线K歌自2014年兴起以来,已经发展出了无比庞大的用户群体,每两人中就有就有一人体验过在线 K歌,其前景不可小觑. 如此庞大的市场规模,以及音视频技术使用门槛逐步降低的加持, ...

  5. CSS & JS Effect – Hero Banner Swiper

    效果 重点 1. 一张图片, 一个 content 定位居中作为一个 slide 2. slider 用了 JavaScript Library – Swiper 3. 当 slide active ...

  6. 提升软件测试效率与灵活性:探索Mock测试的重要性

    Mock测试是测试过程中的一种方法,用于替代那些难以构造或获取的对象,通过创建虚拟对象来进行测试.所谓难以构造的对象如何理解呢? 举例来说,像HttpServletRequest这样的对象需要在具有s ...

  7. Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]

    Launcher的启动经过了三个阶段: 第一个阶段:SystemServer完成启动Launcher Activity的调用 第二个阶段:Zygote()进行Launcher进程的Fork操作 第三个 ...

  8. iOSwkwebView 打开 TXT/PDF 文件乱码的问题

    最近做资料文件下载下来并查看的时候,用 WKWebView 打开office 类型的文件的时候是没问题的,但是打开测试人员上传的一个 TXT/PDF 文件就出现了乱码问题,经过查看,应该是文件的编码问 ...

  9. Gradio 5 稳定版正式发布

    在过去的几个月里,我们一直在努力工作,今天,我们想向大家展示成果:Gradio 5 稳定版现已发布. 有了 Gradio 5,开发者可以构建 生产级的机器学习 Web 应用,这些应用不仅性能优越.可扩 ...

  10. 大模型存储选型 & JuiceFS 在关键环节性能详解

    从去年开始,LLM大语言模型领域发展迅速.如 LLaMA.ChatGLM.Baichuan.Qwen 和 yi-model 等基础模型(Foundation Models)的数量显著增加.众多企业也开 ...