# -*- coding: utf8 -*-

background_image_filename = 'background.png'

mouse_image_filename = 'hero.png'

#指定图像文件名称

import pygame #导入pygame库

from sys import exit #向sys模块借一个exit函数用来退出程序

pygame.init() #初始化pygame,为使用硬件做准备

screen = pygame.display.set_mode((480, 650), 0, 32)

#创建了一个窗口

pygame.display.set_caption("PlaneFight!")

#设置窗口标题

background = pygame.image.load(background_image_filename).convert()

mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

#加载并转换图像

while True:

#游戏主循环

for event in pygame.event.get():

if event.type == pygame.QUIT:

#接收到退出事件后退出程序

pygame.quit()

exit()

screen.blit(background, (0,0))

#将背景图画上去

x, y = pygame.mouse.get_pos()

#获得鼠标位置

x-= mouse_cursor.get_width() / 2

y-= mouse_cursor.get_height() / 2

#计算光标的左上角位置

screen.blit(mouse_cursor, (x, y))

#把光标画上去

pygame.display.update()

#刷新一下画面

显示结果就会如下:

上次没有说明鼠标图片跟随鼠标位置的具体说法,这里说明一下,用pygame.mouse.get_pos()可以得到一个鼠标的当前坐标位置的元组,将这个值赋值给x, y ,之后可以用它方便调用,但是如果我们直接用这个量,图片将会出现在鼠标的右下角,这是图片的坐标系决定的。如果我们想让它鼠标在图片中心,必须让鼠标坐标和图片中心对齐。对于任何一个Surface对象,可以用get_width(), get_height()和gei_size()对象,来获得它的尺寸,这样我们就可以将鼠标中点和图像尺寸对齐。

当然,美中不足的是鼠标本身出现在了游戏上,可能看起来不是那么和谐,可以通过pygame.mouse.set_visible(False)来设置鼠标的可见性。把这一句加入程序就可以隐藏鼠标。

好的,我们完成了一个部分,飞机可以显示在了屏幕上并能自由移动,但是,这个移动是完全由我们移动的,那些自己移动的飞机和子弹又是怎么做到移动的呢?

我们现在知道游戏的动画本质是由一张张图的变化而来的,子弹的运动也是这样,我们需要它每一幅图比上一幅图都向前多移动一点,这样就可以实现子弹的移动。

我们用总结一下子弹的特点:

1、子弹从飞机前端射出,发射的坐标应该是鼠标所在的位置。

2、每一帧子弹都向前多移动一些。

3、子弹飞出屏幕底部时,不再处理该子弹。(这里我用一个技巧,让子弹重新回到鼠标所在的位置)

4、为了使子弹从飞机下面飞出去,我们需要先绘制子弹,再在上面绘制飞机。

子弹有这样三个特点,根据这三个特点,可以写出它的代码:

# -*- coding: utf8 -*-

background_image_filename = 'background.png'

mouse_image_filename = 'hero.png'

bullet_image_filename = 'bullet.png'

#指定图像文件名称

import pygame #导入pygame库

from sys import exit #向sys模块借一个exit函数用来退出程序

pygame.init() #初始化pygame,为使用硬件做准备

screen = pygame.display.set_mode((480, 650), 0, 32)

#创建了一个窗口

pygame.display.set_caption("PlaneFight!")

#设置窗口标题

pygame.mouse.set_visible(False)

background = pygame.image.load(background_image_filename).convert()

mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

bullet = pygame.image.load(bullet_image_filename).convert_alpha()

#加载并转换图像

bullet_x, bullet_y = 0, -100 #初始化子弹坐标

while True:

#游戏主循环

for event in pygame.event.get():

if event.type == pygame.QUIT:

#接收到退出事件后退出程序

pygame.quit()

exit()

screen.blit(background, (0,0))

#将背景图画上去

x, y = pygame.mouse.get_pos()

#获得鼠标位置

if bullet_y < -1 : #移动子弹

bullet_x, bullet_y = x, y

else:

bullet_y -= 1

x-= mouse_cursor.get_width() / 2

y-= mouse_cursor.get_height() / 2

#计算光标的左上角位置

screen.blit(bullet, (bullet_x, bullet_y))

screen.blit(mouse_cursor, (x, y))

#把光标画上去

pygame.display.update()

#刷新一下画面

可以得到这样的效果:

子弹会从飞机打出,到屏幕顶端时就会重置。

上面的代码似乎是解决了子弹运动的问题,如此而来,敌机的运动也显得非常的简单。暂时不讲具体显示敌机的代码,让大家思考。

可其实有一个很容易发现的问题,那就是每一台机器的处理速度不一样,虽然每次循环时都让坐标自减一,实际上,还是有很大的差别的,处理速度快的机器可能一秒钟处理一千次循环,而处理慢的机器可能才30次循环,两台机器看到的动画帧率完全不同,子弹速度也完全不同,这应该怎么处理呢?

还好pygame早就帮我们做好了这一点,我们只需要这么去做就可以让所有的机子都有同样的速度。

pygame.time模块给我们提供了一个Clock()对象,让我们轻易做到控制帧率:

clock = pygame.time.Clock()

time_passed = clock.tick()

time_passed = clock.tick(50)

第一行初始化了一个Cloc对象,第二行返回了一个从上一次到现在调用的时间(毫秒计的单位),第三行就是控制帧率的好办法了。在每一次循环过程中加上它,在clock.tick()里加入参数,代表了你设定的最大帧率,你的画面的最大帧率就是你写的值,当然,有的时候动画过于复杂,它可能没办法到达这个帧率,那时我们需要别的优化方式。那么怎么保证控制的匀速呢?

将上面的代码再一次变化:

# -*- coding: utf8 -*-

background_image_filename = 'background.png'

mouse_image_filename = 'hero.png'

bullet_image_filename = 'bullet.png'

#指定图像文件名称

import pygame #导入pygame库

from sys import exit #向sys模块借一个exit函数用来退出程序

pygame.init() #初始化pygame,为使用硬件做准备

screen = pygame.display.set_mode((480, 650), 0, 32)

#创建了一个窗口

pygame.display.set_caption("PlaneFight!")

#设置窗口标题

pygame.mouse.set_visible(False)

background = pygame.image.load(background_image_filename).convert()

mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

bullet = pygame.image.load(bullet_image_filename).convert_alpha()

#加载并转换图像

bullet_x, bullet_y = 0, -100 #初始化子弹坐标

bullet_speed = 600 #初始化子弹速度

clock = pygame.time.Clock()

while True:

#游戏主循环

for event in pygame.event.get():

if event.type == pygame.QUIT:

#接收到退出事件后退出程序

pygame.quit()

exit()

time_passed = clock.tick(100)

time_passed_second = time_passed/1000.0

screen.blit(background, (0,0))

#将背景图画上去

x, y = pygame.mouse.get_pos()

#获得鼠标位置

if bullet_y < -1 : #移动子弹

bullet_x, bullet_y = x, y

else:

bullet_y -= time_passed_second * bullet_speed

x-= mouse_cursor.get_width() / 2

y-= mouse_cursor.get_height() / 2

#计算光标的左上角位置

screen.blit(bullet, (bullet_x, bullet_y))

screen.blit(mouse_cursor, (x, y))

#把光标画上去

pygame.display.update()

#刷新一下画面

我比较懒,直接贴了全部的代码。。。

这里面,我们每次读取了经过的时间,然后根据每次经过的时间不同,乘以速度系数来得到应该变化多少位移。用这种方法调整的动画,在不同的电脑上都有相同的显示。

敌机怎么显示,看大家怎么做了。明天继续讲,关于敌机的显示和随机性。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

立即提交

专题推荐独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

python飞机大战跟随鼠标移动_用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动...相关推荐

  1. Python游戏之Pygame——太空飞机大战(三)

    上一篇(Python游戏之Pygame--太空飞机大战(二))完成了敌机类以及敌机坠毁时释放包裹类,这一篇将给出英雄战机类和处理.由于英雄战机是由游戏者操控的,所以要处理操控事件,比如往那个方向飞,发 ...

  2. Python游戏之Pygame——太空飞机大战(四)

    上一篇(Python游戏之Pygame--太空飞机大战(三))完成了英雄战机和星空,那么基本上飞机大战的主要元素都已经完成,该是总结成功玩自己游戏的时候了. 哦,差点忘了,Bullet类对于普通子弹和 ...

  3. Python游戏之Pygame——太空飞机大战(二)

    上一篇(Python游戏之Pygame--太空飞机大战(一))文章简单对游戏进行了说明,给出了部分配置文件以及子弹类.下面给出敌机类和方法. 大家直到,飞机必须能非,最好能非直线飞行.因此必须有X_s ...

  4. cesium鼠标控制键盘_用 Python 控制 鼠标和键盘,花式操作

    可能有时候你需要在电脑做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己爱干嘛干嘛去,有点 "按键精灵" 的意思,是不是 ...

  5. python弹球游戏绑定鼠标事件_用python和pygame游戏编程入门-弹球[鼠标控制]

    本节我们再将鼠标的事件引入到这个动画中,要做什么呢?就是在动画中,如果按下鼠标左键,小球会停止移动,如果松开左键,小球会移动到鼠标的位置,然后继续刚才的运动:如果按下鼠标左键不放,移动鼠标,小球就会跟 ...

  6. python实现图片找不同游戏_用Python实现谷歌的小恐龙游戏

    (给Python开发者加星标,提升Python技能) 来源: Charles的皮卡丘-白露未晞me理 谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏". ...

  7. python发行版是什么意思_致 Python 初学者

    当下是一个喧嚣.浮躁的时代.我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会.我始终认为,学习是需要沉下心来慢慢钻研的,是长期的:同时,学习不应该被赋予太多的功利色彩.一个Py ...

  8. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  9. python数据科学指南是什么_《Python数据科学指南》——导读

    前 言 如今,我们生活在一个万物互联的世界,每天都在产生海量数据,不可能依靠人力去分析产生的所有数据并做出决策.人类的决策越来越多地被计算机辅助决策所取代,这也得益于数据科学的发展.数据科学已经深入到 ...

最新文章

  1. Web API与JWT认证
  2. 智慧农业物联网云平台方案
  3. Runnable、Callable、Executor、Future、FutureTask关系解读
  4. AXI4总线协议的发展历史
  5. 纯js实现瀑布流布局及ajax动态新增数据
  6. linux 误删etc,centos7中误删/etc/passwd与etc/shadow文件恢复
  7. java 遗传算法_遗传算法的基本概念和实现(附 Java 实现案例)
  8. 使用Python处理声音文件(一):让歌曲重复两次
  9. nginx的高级配置(1)——为某个虚拟主机添加用户验证
  10. SSI(Server Side Includeds)使用详解(转载)
  11. Java 常用修饰符总结
  12. UML概要基础知识(待完善)
  13. 自定义View:悬浮球与加速球
  14. 简单循迹小车实验心得_你真的了解循迹小车吗,小宇教你如何制作属于自己的循迹小车...
  15. 护眼色RGB值和HSV值
  16. 已知一点经纬度及与另一点距离和航向,求另一点经纬度
  17. java集合之TreeMap 构造器 方法 比较器
  18. EMWin对话框(Diolog)通知框(Messa…
  19. Python-Flask实战项目一:仿知乎轻量级web问答平台搭建
  20. 移动支付模式再添新军:指纹支付

热门文章

  1. MySQL高阶面试题
  2. Linux内核代码 分析大纲思维导图
  3. Nginx-1.18.0主函数main思维导图(第一版)
  4. ZeroMQ简介:一种高性能的异步消息传递库
  5. CentOS 安装gnutls
  6. i like share
  7. android 自定义控件linearlayout,自定义控件(瀑布流,LinearLayout)
  8. jquery请求后台数据(get请求)
  9. java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
  10. 云南计算机专升本数据结构_云南计算机专升本分数大全(公布分数线431分)