python导弹自动追踪以及实时图片旋转算法(吕万友)

以下是 Python-pygame代码实现:  

import sys, pygame
from math import *

pygame.init()
font1 = pygame.font.SysFont('microsoftyaheimicrosoftyaheiui', 23)
textc = font1.render('*', True, (250, 0, 0))  # this is the target that missile wants to attack
screen = pygame.display.set_mode((800, 700), 0, 32)  # set the attribution of screen
missile = pygame.image.load('C:/Users/win10/Desktop/rect1.png').convert_alpha()
bomb = pygame.image.load('C:/Users/win10/Desktop/bomb.png').convert_alpha()
height = missile.get_height()
width = missile.get_width()
pygame.mouse.set_visible(0)
x1, y1 = 100, 600  # 导弹的初始发射位置
velocity = 800  # 导弹速度
time = 1 / 1000  # 每个时间片的长度
clock = pygame.time.Clock()
A = ()
B = ()
C = ()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    clock.tick(300)
    x, y = pygame.mouse.get_pos()  # 获取鼠标位置,鼠标就是需要打击的目标
    distance = sqrt(pow(x1 - x, 2) + pow(y1 - y, 2))  # 两点距离公式
    print('distance  :   ', distance)
    section = velocity * time  # 每个时间片需要移动的距离
    sina = (y1 - y) / distance
    cosa = (x - x1) / distance
    angle = atan2(y - y1, x - x1)  # 两点间线段的弧度值
    fangle = degrees(angle)  # 弧度转角度
    x1, y1 = (x1 + section * cosa, y1 - section * sina)
    missiled = pygame.transform.rotate(missile, -(fangle))  # 得到旋转角度后的missile图片

    if 0 <= -fangle <= 90:
        A = (width * cosa + x1 - width, y1 - height / 2)
        B = (A[0] + height * sina, A[1] + height * cosa)

    if 90 < -fangle <= 180:
        A = (x1 - width, y1 - height / 2 + height * (-cosa))
        B = (x1 - width + height * sina, y1 - height / 2)

    if -90 <= -fangle < 0:
        A = (x1 - width + missiled.get_width(), y1 - height / 2 + missiled.get_height() - height * cosa)
        B = (A[0] + height * sina, y1 - height / 2 + missiled.get_height())

    if -180 < -fangle < -90:
        A = (x1 - width - height * sina, y1 - height / 2 + missiled.get_height())
        B = (x1 - width, A[1] + height * cosa)

    C = ((A[0] + B[0]) / 2, (A[1] + B[1]) / 2)
    screen.fill((0, 0, 0))
    if distance > 1:
        screen.blit(missiled, (x1 - width + (x1 - C[0]), y1 - height / 2 + (y1 - C[1])))  # 旋转后的missile 位块显示在 C点位置。
        screen.blit(textc, (x, y))  # 鼠标用一个红色*代替
    else:
        screen.blit(bomb, (x, y))  # 旋转后的missile 位块显示在 C点位置。
    pygame.display.update()

代码中需要的照片:  

  分别命名为: rect1.png  、bomb.png

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值