5.7旋转战机发射子弹
我们在5.5节时,按一定方向发射了子弹。在游戏场景中,要求飞机能够在不同角度,发射出去子弹。本节我们来解决旋转战机和按一定角度发射子弹的问题。

1、理解三角知识中的角度、反正切。
2、理解鼠标按键时坐标的获取。
3、旋转战机。
4、发射子弹。

我们先从理解三角知识中的角度开始:如下图5-9


图5-9

在上图5-9中,如果(5,3)是战机的位置,(2,4)是现在鼠标的位置,你可以通过三角定理来得出需要旋转的角度。然后,你知道了旋转的角度后,就可以来旋转你的战机了。
为了使用atan2函数(还有另一函数atan,功能类似),我们需要import math。

小知识:
atan 和 atan2 都是反正切函数,返回的都是弧度

对于两点形成的直线,两点分别是 point(x1,y1) 和 point(x2,y2),其斜率对应角度的计算方法可以是:
angle = atan( (y2-y1)/(x2-x1) )

angle = atan2( y2-y1, x2-x1 )
因此可以看出 atan 和 atan2 的区别:
1、参数的个数不同;atan 为单个参数,atan2为两个参数
2、atan2 的优点在于: 如果 x2-x1等于0 ,角度依然可以计算,但是atan函数则需要提前判断,否则就会导致程序出错;
注意:1、两者返回值都是弧度;2、atan2函数参数是y在前,x在后;

理解如何获取鼠标点击时的坐标,示例代码如下。

#!/usr/bin/python
import pygame
from pygame.locals import *

def main():
pygame.init()
pygame.display.set_mode((300,200))
pygame.display.set_caption(‘Testing’)
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN and event.key == K_ESCAPE:
running = False
if event.type == MOUSEBUTTONDOWN:
print(pygame.mouse.get_pos())
pygame.display.quit()

if name == ‘main’:
main()

我们在Shell界面,观察到打印结果如下图5-10


图5-10

旋转战机的代码如下:

#旋转飞机
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(positionPlayer[1]+50),position[0]-(positionPlayer[0]+40))
#print(angle57.29)
playerrot = pygame.transform.rotate(player,360-angle
57.29)
screen.blit(playerrot, positionPlayer)

生成子弹的代码如下:

if event.type==pygame.MOUSEBUTTONDOWN:
position = pygame.mouse.get_pos()
angle= math.atan2(position[1]-(positionPlayer[1]+50),
position[0]-(positionPlayer[0]+40))
bullets.append([angle,positionPlayer[0]+50,positionPlayer[1]+40])

射出子弹的代码如下:

#射出子弹
for bulletx in bullets:
velx=math.cos(bulletx[0])*20
vely=math.sin(bulletx[0])*20
print(velx)
print(vely)
bulletx[1]+=velx
bulletx[2]+=vely

    index=0if bulletx[1]<0 or bulletx[1]>480 or bulletx[2]<0 or bulletx[2]>700:bullets.pop(index)index+=1playerrot = pygame.transform.rotate(bullet,360-bulletx[0]*57.29)screen.blit(playerrot,(bulletx[1],bulletx[2]))

将代码整合起来,整合后完整代码如下:

import pygame
from pygame.locals import *
from sys import exit
import math
import random

#旋转战机发射子弹

screen_width, screen_height = 480, 700
screen=pygame.display.set_mode((screen_width, screen_height))
background=pygame.image.load(“resources/images/background2.png”)
pygame.display.set_caption(‘雷雷的太空大战’)
pygame.init()

running=1
flyingsaucers=[]
enemy = pygame.image.load(“resources/images/flyingsaucer.png”)

b=0

bullet = pygame.image.load(“resources/images/bullet1.png”)
player = pygame.image.load(“resources/images/hero1.png”)

positionPlayer=[100,400]
positionBullet=[positionPlayer[0]+50,positionPlayer[1]+40]
bullets=[]

keys = [False, False, False, False]

position=[]

while running:
screen.blit(background,(0,0))
#screen.blit(player,positionPlayer)

for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key==K_w:keys[0]=Trueelif event.key==K_a:keys[1]=Trueelif event.key==K_s:keys[2]=Trueelif event.key==K_d:keys[3]=Trueif event.type == pygame.KEYUP:if event.key==pygame.K_w:keys[0]=Falseelif event.key==pygame.K_a:keys[1]=Falseelif event.key==pygame.K_s:keys[2]=Falseelif event.key==pygame.K_d:keys[3]=False               if event.type == pygame.QUIT:pygame.quit()exit()if event.type==pygame.MOUSEBUTTONDOWN:position = pygame.mouse.get_pos()angle = math.atan2(position[1]-(positionPlayer[1]+50),position[0]-(positionPlayer[0]+40))bullets.append([angle,positionPlayer[0]+50,positionPlayer[1]+40])           if keys[0]:positionPlayer[1]-=10if positionPlayer[1]<=10:positionPlayer[1]=10
elif keys[2]:positionPlayer[1]+=10if positionPlayer[1]>=600:positionPlayer[1]=600
if keys[1]:positionPlayer[0]-=10if positionPlayer[0]<=10:positionPlayer[0]=10
elif keys[3]:positionPlayer[0]+=10if positionPlayer[0]>=380:positionPlayer[0]=380#screen.blit(player,positionPlayer)#旋转飞机
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(positionPlayer[1]+50),position[0]-(positionPlayer[0]+40))
#print(angle*57.29)
playerrot = pygame.transform.rotate(player,360-angle*57.29)
screen.blit(playerrot, positionPlayer)#射出子弹
for bulletx in bullets:        velx=math.cos(bulletx[0])*20vely=math.sin(bulletx[0])*20print(velx)print(vely)bulletx[1]+=velxbulletx[2]+=velyindex=0if bulletx[1]<0 or bulletx[1]>480 or bulletx[2]<0 or bulletx[2]>700:bullets.pop(index)index+=1playerrot = pygame.transform.rotate(bullet,360-bulletx[0]*57.29)screen.blit(playerrot,(bulletx[1],bulletx[2]))        if b<5:flyingsaucers.append([random.randint(0,400),random.randint(20,100)])
b+=1for flyingsaucer in flyingsaucers:if flyingsaucer[1]<610:flyingsaucer[1]+=0.5screen.blit(enemy,flyingsaucer)pygame.display.update()#pygame.display.flip()

运行这段代码,在画布上,我们的无敌战机,在我们按下WASD不同键时,它会向不同的方向运动,移动鼠标,战机旋转。单击鼠标,子弹沿着鼠标点击的方向射出。见下图5-11、5-12。

图5-11


图5-12

【汇智学堂】-python小游戏(太空阻击之七-旋转战机发射子弹)相关推荐

  1. 【汇智学堂】-python小游戏(太空阻击之一-浅谈游戏开发)

    第五章:太空阻击 本章将通过一个太空射击游戏实例来介绍python中pygame的基本使用方法,包括创建游戏体,键盘.鼠标操作,基本的物理碰撞.UI显示和逻辑处理等. 5.1浅谈游戏开发 游戏开发是一 ...

  2. python制作射击游戏_零基础用Python开发的第一个小游戏——太空射击

    写在最前面 你想成为Python高手吗?你想使用Python编写一个炫酷的游戏吗? 那么今天这篇文章就能带着你从零开始编写一个Python小游戏.希望你能喜欢. 话不多说,我们先来看一副动图 ​ 号: ...

  3. python小游戏之三

    猜拳游戏 Python代码实现猜拳小游戏 Python代码实现猜拳小游戏_zhangtongyuan0909的博客-CSDN博客_python猜拳游戏代码 用python中类与对象写一个猜拳游戏 用p ...

  4. Python 小游戏—加农炮送特朗普上太阳

    美股熔断历史上只发生过4次,上上次熔断和上一次熔断,还要追溯到2020年3月9日和2020年3月13日,那两天我的记忆很深刻,那感觉,仿佛就在几天前. 话又说回来了,特朗普可是说过狠话的: 这是在20 ...

  5. python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  6. python简单小游戏代码_一个简单的python小游戏---七彩同心圆

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...

  7. python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  8. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  9. python小游戏编程arcade----坦克动画图片合成

    python小游戏编程arcade----坦克动画图片合成 前言 坦克动画图片合成 1.PIL image 1.1 读取文件并转换 1.2 裁切,粘贴 1.3 效果图 1.4 代码实现 2.处理图片的 ...

最新文章

  1. 关于命名空间namespace
  2. 欢迎加入网络管理论坛群
  3. 园子里有没有介绍netframework3.0的
  4. 架构设计:生产者/消费者模式 第3页:队列缓冲区
  5. centos7从有线切换到无线_如何简单实现内外网自由切换?
  6. WPF的ListBox的数据绑定,但需要添加控件在里面的时候
  7. 用java编写一个课表串口,安卓课程表源代码
  8. Oracle : 使用JDBC连接ORACLE的三种URL格式
  9. 树莓派c语言实现modbus主机_特斯拉+树莓派实现车牌识别检测系统
  10. 【Python量化】风险平价策略
  11. 蚂蚁全媒体中心刘鑫炜:从李子柒看如何打造成功的个人品牌形象
  12. 将系统必备组件打包进安装文件(以vs15打包.net formwork 4.5为例)有点鸡肋
  13. Linux下查看CPU型号,内存大小,硬盘空间的命令(详解)
  14. GCN-Global Convolutional Network
  15. ACM--津津的储蓄计划
  16. 基于JAVA毕业生就业管理系统计算机毕业设计源码+系统+lw文档+部署
  17. java调用libreoffice_JAVA实现LibreOffice转换PDF文档
  18. [个人笔记]HCIP-Routing Switching-IENP/H12-222
  19. hackthebox - inception (考点:dompdf apache配置 webdav 3128 proxy tftp apt update 提权 ssh-key提权)
  20. 甲骨文大裁员后,中国企业软件业务能做什么?

热门文章

  1. linux琐碎记录之 numberLock指示灯设置
  2. 油液磨粒监测设计方案
  3. 次坐标从0开始_全站仪测量使用方法及坐标计算,视频一步一步讲解
  4. Megan McDuffee 将为即将到来的Atari的PC 和主机游戏系列打分
  5. windows上的一些文件夹为什么图标是快捷方式的图标
  6. Open-world Machine Learning: Applications, Challenges,and Opportunities || 阅读笔记
  7. win10怎么设置外接摄像头_Win10电脑外接摄像头无法使用的解决方法
  8. 简单到爆——用Python在MP4和GIF间互转,我会了
  9. 用Python分析582个专业,1281个本科院校,帮你选专业填志愿
  10. 基于LayUI框架的Jsp日记本系统