汇智学堂-phthon小游戏(太空阻击之七-旋转战机发射子弹)

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=0

    if bulletx[1]<0 or bulletx[1]>480 or bulletx[2]<0 or bulletx[2]>700:
        bullets.pop(index)
        
    index+=1
    
    playerrot = 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]=True
        elif event.key==K_a:
            keys[1]=True
        elif event.key==K_s:
            keys[2]=True
        elif event.key==K_d:
            keys[3]=True
    if event.type == pygame.KEYUP:
        if event.key==pygame.K_w:
            keys[0]=False
        elif event.key==pygame.K_a:
            keys[1]=False
        elif event.key==pygame.K_s:
            keys[2]=False
        elif 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]-=10
    if positionPlayer[1]<=10:
        positionPlayer[1]=10
elif keys[2]:
    positionPlayer[1]+=10
    if positionPlayer[1]>=600:
        positionPlayer[1]=600
if keys[1]:
    positionPlayer[0]-=10
    if positionPlayer[0]<=10:
        positionPlayer[0]=10
elif keys[3]:
    positionPlayer[0]+=10
    if 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])*20
    vely=math.sin(bulletx[0])*20
    print(velx)
    print(vely)
    bulletx[1]+=velx
    bulletx[2]+=vely

    index=0

    if bulletx[1]<0 or bulletx[1]>480 or bulletx[2]<0 or bulletx[2]>700:
        bullets.pop(index)
        
    index+=1
    
    playerrot = 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+=1

for flyingsaucer in flyingsaucers:
    if flyingsaucer[1]<610:
        flyingsaucer[1]+=0.5
    screen.blit(enemy,flyingsaucer)
    pygame.display.update()
    #pygame.display.flip()

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

在这里插入图片描述
图5-12

猜你喜欢

转载自blog.csdn.net/weixin_39593940/article/details/88414414
今日推荐