pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考

这篇具有很好参考价值的文章主要介绍了pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       最近,儿子一直缠着让我把之前给他编写的游戏重做一下,要加一些功能.但是因为之前写代码的时候刚学会python,当时的想法就是能跑就行,现在回头看来,代码的可维护性几乎为零.所以没办法只能冲头再来,重构了几乎所有代码.在编写的时候遇到了一个有意思的问题,儿子让我给游戏添加一种带追踪能力的导弹.导弹不仅要能追踪目标不断修正轨迹向着目标前进,同时导弹的弹头要一直朝向目标,我一听,这不就是弹道导弹嘛,有意思,整!

        当时我想,这还不简单,在追踪的时候顺手把本体和目标之间连线的斜率计算出来不久完了吗?于是说干就干,但是当我到了真正编写的时候还是发现了一些问题.今天就来和大家分享一下.

        首先呢,路径追踪很简单,我之前写过一篇相关的文章可以参考这个,所以路径这里咱们就跳过.

        这篇文章主要就聊聊如何实现导弹通过旋转始终指向目标.

先来看一张示意图

pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考,pygame,python,pygame,python

如图,当A点向B移动时是沿着AB移动,所以只要计算出AB的斜率时就会得到第一个旋转角度,当A移动到A`点时追踪目标变为了C,这时算出A`C的斜率就能得到第二个旋转角度,如此循环往复,无论被追踪的目标如何变化,我们只要算出当前目标和本身的斜率就能得出要旋转的角度了.明白了实现旋转的方法以后,我们就开始写代码.这里多说一句,其实一开始我在这里思考了很长时间,主要的问题是我的一个闪念,既然正切函数能够得到斜率,那么正弦余弦甚至正割余割,也应该能到倾斜角度(其实是废话,利用推导公式本来就可以推导出的,但我也不知道为什么非要跟自己较劲,花了一整天时间去复习初中数学),但是,正弦余弦有一个问题,就是要判断象限.我甚至写了一大段"if"函数去判断象限.知道我发现math模块里的atan2()这个方法,我才明白,我之前想多了.这个方法不用考虑象限,只需要输入对边临边的值就会自动判断象限,从而得出当前的弧度.

代码如下:

import math

import pygame,sys
from math import *
pygame.init()
screen=pygame.display.set_mode((800,700),0,32)
pygame.display.set_caption("弹道导弹")
clock = pygame.time.Clock()

class Sprite1(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('2.png')
        self.rect = self.image.get_rect()

    def update(self, *args, **kwargs):
        self.rect.center = pygame.mouse.get_pos()

class Sprite2(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.mumimage = pygame.image.load('1.png')
        self.image = self.mumimage
        # print(id(self.mumimage), id(self.image))
        self.rect = self.image.get_rect()
        self.speed = 3

    def update(self, target):
        deltax = target.rect.centerx - self.rect.midtop[0]
        deltay = target.rect.centery - self.rect.midtop[1]
        distance = math.sqrt(deltax ** 2 + deltay ** 2)
        if distance != 0:
            angle = math.degrees(math.atan2(-deltay, deltax))
            self.image = pygame.transform.rotate(self.mumimage, angle - 90)
            # print(id(self.mumimage), id(self.image))
            stepx = self.speed * deltax / distance
            stepy = self.speed * deltay / distance
            self.rect.centerx += stepx
            self.rect.centery += stepy




sprite1 = Sprite1()
sprite2 = Sprite2()
sprites = pygame.sprite.Group()
sprites.add(sprite1,sprite2)
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

    screen.fill((0,0,0))
    sprites.update(sprite1)
    sprites.draw(screen)
    pygame.draw.rect(screen, (0,255,0), sprite2.rect, 2)


    pygame.display.update()
    clock.tick(60)

运行效果如下

pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考,pygame,python,pygame,python其实写到这里,我要的目的目的其实已经达到了.但是,在写代码的时候我发现一个问题.

可以看到,我在编写sprite2的时候,定义了一个self.mumimage对象,然后又创建了一个self.image对象指向self.mumimage.这样做,主要是因为python的变量赋值其实是将变量指向了对象的内存地址,也就是说python里的变量都是指针变量.

pygame.transform.rotate()这个方法会生成一个新的对象,同时在内存中开辟一个新的地址.

如果我们直接使用self.image = pygame.transform.rotate(self.mumimage, angle - 90),那么就会产生递归,self.image 会不停的迭代self.image会不停的指向新地址而pygame.transform.rotate()方法会使用self.image迭代的新对象.这就产生了无限递归,直至内存泄漏,程序崩溃.下面举个例子.当我们删掉self.mumimage这个变量,直接定义self.image = pygame.image.load('1.png'),那么运行会得到以下结果.

pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考,pygame,python,pygame,python

所以,在这里我们必须要先声明一个变量self.mumimage,然后用self.image捕获self.mumimage迭代后的对象.这样才能保证pygame.transformer.rotate()这个方法一直作用与self.mumimage而不会产生无限的递归导致程序崩溃.

最后是文章中用到的素材pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考,pygame,python,pygame,pythonpygame里实现导弹追踪效果,同时对python的指针机制有一点点思考,pygame,python,pygame,python文章来源地址https://www.toymoban.com/news/detail-812540.html

到了这里,关于pygame里实现导弹追踪效果,同时对python的指针机制有一点点思考的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pygame事件处理机制简介-慕课的python游戏开发入门02

    目录 首先解释几个问题: 1、事件处理需求主要有以下几个方面: 2、Pygame事件队列 3、Pygame事件 4、事件类型及属性  5、事件处理的重要函数  6、键盘事件 7、鼠标事件 8、处理事件函数 9、操作事件队列 10、生成事件 其次给出代码段,有利于大家对其进行学习和分析 最后进

    2024年02月06日
    浏览(40)
  • c语言实现this指针效果

    由于目前在做一个比较复杂的嵌入式项目,想要借此提升一下代码的结构设计能力,所以想要以 面向对象 的思想来完成这个项目,即把每个板载外设资源视为一个对象,采用 msp+bsp 的模式,对每个bsp外设实现对象化处理,现有方案需要手动传入对象引用,调用方法时比较麻

    2024年02月05日
    浏览(17)
  • pygame 烟花效果

    pygame.init() screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption(\\\'烟花效果\\\') particles = []  # 焰火粒子 def firework(x, y):     num_particles = 100  # 每次发射的粒子数量     for _ in range(num_particles):         direction = random.uniform(0, 2 * math.pi

    2024年04月23日
    浏览(18)
  • 【Android车载系列】第9章 车载通信-Socket实现IPC通信机制(实现仿FDBus效果)

      FDBus 基于 Socket (TCP 和 Unix domain) 之上的IPC机制, 采用 Google protobuf 做序列化和反序列化。 FDBus还支持字符串形式的名字作为server地址。通过 name server 自动为 server 分配Unix domain 地址和 TCP 端口号, 实现 client 和server 之间用服务名字寻址。 一句话描述:FDBus (Fast Distributed Bus

    2024年02月10日
    浏览(21)
  • pygame伪3d地面 移动效果

    2024年02月13日
    浏览(31)
  • 【Python】pygame弹球游戏实现

    游戏源码: pygame_os库:

    2024年02月12日
    浏览(24)
  • 深入理解Linux 内核追踪机制

    Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。   Probe Handler 如果我们想要追踪内核的一

    2024年02月15日
    浏览(23)
  • python和pygame实现烟花特效

    新年来临之际,来一个欢庆新年烟花祝贺,需要安装使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 效果图及源码 先看效果图: 源码如下: pygame在屏幕上显示字体的方法说明 使用 pygame.font.Font 函数来设置字体和大小,

    2024年02月04日
    浏览(33)
  • Python利用pygame实现飞机大战游戏

    文章目录: 一:运行效果 1.演示 2.思路和功能 二:代码 文件架构 Demo 必备知识:python图形化编程pygame游戏模块 效果图 ◕‿◕✌✌✌ Python利用pygame实现飞机大战游戏运行演示 参考:【Python游戏】1小时开发飞机大战游戏-Pygame版本(1小时40分钟) 博主提取资源: 提取

    2024年04月09日
    浏览(28)
  • python3.8.8 :pygame实现角色动画

    用途:通过不同的序列图片在界面上展示连贯的动画 结果如下:  参考文章:pygame之旅 - 知乎 (zhihu.com) 项目结构目录  角色类 角色生成类: 代码入口 结果如下:  发现出现问题,动画出现残影,看网上说需要先绘制背景,再绘制角色可以解决,随意填个颜色screen.fill(255)

    2024年02月05日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包