pygame实现跳跃发射子弹打怪效果

news2025/1/20 3:45:10

import pygame
import sys,time,random
from pygame.locals import *
pygame.init()
# 设置按下鼠标的时候一直触发
pygame.key.set_repeat(10, 10)
# 加载背景图片
bg = pygame.image.load('./img/bg.png')
# 加载左方向行走和站立图片
heroLStand = pygame.image.load('img/heroLstand.png')
heroL1 = pygame.image.load('img/heroL1.png')
heroL2 = pygame.image.load('img/heroL2.png')
heroL3 = pygame.image.load('img/heroL3.png')
# 加载右方向行走和站立图片
heroRStand = pygame.image.load('img/heroRstand.png')
heroR1 = pygame.image.load('img/heroR1.png')
heroR2 = pygame.image.load('img/heroR2.png')
heroR3 = pygame.image.load('img/heroR3.png')
# 加载障碍物
zaw1 = pygame.image.load('img/zaw1.png')
zaw2 = pygame.image.load('img/zaw2.png')
zaw3 = pygame.image.load('img/zaw3.png')
# 加载武器图片
wq = pygame.image.load('img/b.png')
effer = pygame.image.load('img/effer.png')
clock = pygame.time.Clock()
# 创建一个画布
canvas = pygame.display.set_mode((1200,600))
# 初始数据

# 设置跳跃高度
jumpHeight = 40
# 设置移动速度
moveSpeed = 10
#------------------创建武器类----------------
class Wq():#武器的属性有:皮肤,坐标以及宽高,以及方向
    def __init__(self,skin,x,y,width,height,direction):
        self.skin = skin
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.direction = direction
    # 武器的移动
    def shoot(self):
        #如果方向是往右则x值增加
        if self.direction == "right":
            for i in range(10):
                self.x = self.x+2
        else:# 否则就是往左移动
            for i in range(10):
                self.x = self.x-2
            
    
#------------------创建英雄类----------------
# 英雄类:属性, 皮肤skin,坐标,x,y 宽高width,height
n = 0# 实现动态切换不同的图片
class Hero():
    def __init__(self,skin,x,y,width,height,direction="right"):
        self.skin = skin
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.direction = direction
    # 往左移动的方法
    def goLeft(self):
        self.x = self.x-moveSpeed
    # 往右移动的方法
    def goRight(self):
        self.x = self.x+moveSpeed
    # 往左移动的时候,图片的切换(英雄人物的切换)
    def leftChange(self):
        global n
        if n%3 == 0:# 如果对3取余结果等于0,使用第一张图片
            self.skin = heroL1
        elif n%3 == 1:
            self.skin = heroL2
        else:
            self.skin = heroL3
        n = n+1
    # 往右移动的时候,图片的切换(英雄人物的切换)
    def rightChange(self):
        global n
        if n%3 == 0:# 如果对3取余结果等于0,使用第一张图片
            self.skin = heroR1
        elif n%3 == 1:
            self.skin = heroR2
        else:
            self.skin = heroR3
        n = n+1 
    
#-----------------创建英雄对象-------------
# heroRStand,10,400,135,200
hero = Hero(heroRStand,10,400,135,200)

#----------------创建障碍物类---------------------
# 障碍物的属性:x,y,skin,width,height
# 障碍物的方法: 往左移动的方法
class Zaw():# 障碍物类
    def __init__(self,x,y,skin,width,height):
        self.x = x
        self.y = y
        self.skin = skin
        self.width = width
        self.height = height
    def walk(self):# 设置往左移动的方法
        self.x = self.x - 3
# 创建列表存储同时存储多个障碍物对象
zawList = []
createTime = 0# 用来存储创建障碍物对象的时间
# 创建一个方法:批量的生成障碍物对象
def createZaw():
    # 因为每次创建障碍物对象的时候,都需要看间隔时间,时间符合要求则创建
    # 更新时间
    global createTime
    # 检测时间间隔
    if time.time()-createTime > 3:
        # 更新一下创建障碍物的时间
        createTime = time.time()
        type = random.randint(1,3)
        if type == 1:
            #  如果type的值是1就要创建第一种障碍物
            zawenemy = Zaw(1200,500,zaw1,46,46)
        elif type == 2:
            #  如果type的值是2就要创建第2种障碍物
            zawenemy = Zaw(1200,500,zaw2,142,103)
        else:# 创建第3种障碍物
            zawenemy = Zaw(1200,450,zaw3,180,180)
        # 将障碍物追加列表
        zawList.append(zawenemy)
        
   



#--------------批量创建障碍物对象---------------------
#-----------------创建传送到画布方法-----------
# 让背景往右移动
bginit1 = -1200
bginit2 = 0
def draw():
    global bginit1,bginit2
    canvas.blit(bg,(bginit1,0))
    canvas.blit(bg,(bginit2,0))
    bginit1 = bginit1+1# 因为整体往右移动故2张背景图片x的值全部都在增加
    bginit2 = bginit2+1
    if bginit1>1200:
        bginit1 = -1200
    if bginit2>1200:
        bginit2 = -1200
    canvas.blit(hero.skin,(hero.x,hero.y))
    # 将障碍物列表中的所有障碍物传送到画布上
    for e in zawList:
        if e.x < -200:# 说明往左移动的到最左边出画布
            zawList.remove(e)# 从障碍物列表中移出该障碍物
        else:
            canvas.blit(e.skin,(e.x,e.y))
            e.walk()
    # 将武器绘制到画布上
    for w in wqList:  
        if w.x<-200 or w.x>1200:
             wqList.remove(w)
        else:
            canvas.blit(w.skin,(w.x,w.y))
            w.shoot()    
  

def hit():
    # 武器和障碍物碰撞
    for w in wqList:  
        for e in zawList:     
            if w.x+w.width >= e.x and w.x<=e.x+e.width\
                and w.y+150>=e.y:
                for i in range(4):
                     canvas.blit(effer,(e.x,e.y))
                wqList.remove(w)
                zawList.remove(e)
                
# 事件监听方法
isJump = False# 默认False没有跳跃
wqList = []# 武器库
# 设置发射时间间隔
shootTime = 0
def eventDeal():
    global isJump
    if hero.direction == "right":
        hero.skin = heroRStand# 默认向右站立
    elif hero.direction == "left":
        hero.skin = heroLStand    
     # 遍历所有的事件
    for e in pygame.event.get():
        # 点击关闭按钮的时候,关闭窗口处理
        if e.type == QUIT:
            pygame.quit()# pygame退出相当于窗口关闭
            sys.exit()# 系统退出   
        #---------------上下左右键监听处理-------------------
        if e.type == KEYDOWN:# 当检测按下按键的时候
            # 判断按的左键
            if e.key == K_LEFT:
                print('您刚才按下了左键')
                hero.goLeft()# 往左移动
                hero.leftChange()# 调用往左移动切换图片的效果
                hero.direction = "left"
        
            elif e.key == K_RIGHT:
                print('您刚才按下了右键')
                hero.direction = "right"
                hero.goRight()
                hero.rightChange()  
                          
            elif e.key == K_SPACE:# 检测到空格
                print('您刚才按下课空格键')
                isJump = True# 当点击空格的时候跳跃状态切换成True
                
            elif e.key == K_UP:
                global shootTime
                if time.time()-shootTime > 1:
                    shootTime = time.time()
                    # 通过武器类创建武器库
                    w = Wq(wq,hero.x,hero.y+hero.height/8,20,\
                           56,hero.direction)
                    # 将武器追加到武器库
                    wqList.append(w)
                  
while True:
    clock.tick(15)
    if isJump:
        hero.y = hero.y-jumpHeight
        jumpHeight = jumpHeight-2
        if hero.y == 400:
            isJump = False
            jumpHeight = 40
            
            
    createZaw()# 程序帮我们创建障碍物       
    draw()
    hit()
    eventDeal()
    pygame.display.update()

整个代码下载位置:https://download.csdn.net/download/Gjanuary/88384893

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IoT 物联网 JavaScript 全栈开发,构建家居环境监控系统实战

智能家居环境监测端到端场景&#xff0c;全栈JavaScript开发&#xff0c;串联Ruff硬件、温湿度和空气质量传感器、阿里云 IoT、Serverless函数计算、百度ECharts可视化、最终以微信小程序形式在微信里实时展示家中实时温度&#xff0c;湿度&#xff0c;PM2.5指数。 01 技术架构…

嵌入式Linux应用开发-第十一章设备树的引入及简明教程

嵌入式Linux应用开发-第十一章设备树的引入及简明教程 第十一章 驱动进化之路&#xff1a;设备树的引入及简明教程11.1 设备树的引入与作用11.2 设备树的语法11.2.1 1Devicetree格式11.2.1.1 1DTS文件的格式11.2.1.2 node的格式11.2.1.3 properties的格式 11.2.2 dts文件包含 d…

postgresql实现单主单从

实现步骤 1.主库创建一个有复制权限的用户 CREATE ROLE 用户名login # 有登录权限的角色即是用户replication #复制权限 encrypted password 密码;2.主库配置开放从库外部访问权限 修改 pg_hba.conf 文件 &#xff08;相当于开放防火墙&#xff09; # 类型 数据库 …

计算机图像处理:椒盐噪声和高斯噪声

图像滤波 图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;同时会造成图像一定程度上的模糊&#xff0c;这也叫做平滑或者低通滤波。无论是均衡化直方图和图像滤波&#xff0c;都一定程度上降低了图像阈值分割的难度&#xff0c;直…

MySQL-数据库的操作

1、数据库的操作 数据库是指不同的系统&#xff08;比如学生信息管理系统和停车管理系统&#xff09;可以把数据都存储在一个数据库服务器软件中。不同的系统会创建不同的数据库来使用。 1.1显示所有数据库 show databases; 这个是命令行客户端&#xff0c;是以分号为结束的…

JavaScript高阶班之ES6 → ES11(九)

JavaScript高阶班之ES6 → ES11 1、class类1.1、class的静态成员1.2、类的继承1.3、类的get和set方法 2、数值扩展2.1、Number.EPSILON2.2、二进制和八进制2.3、Number.isFinite2.4、Number.isNaN2.5、Number.parseInt、Number.parseFloat2.6、Number.isInteger2.7、Math.trunc…

算法题系列8·买卖股票的最佳时机

目录 题目描述 实现 提交结果 题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。 设计一个算法来计算你所能获取的最大利润。…

DHCP(自动分配ip地址实验案例)

目录 实验原理 案例 实验原理 DHCP 使用客户服务器方式&#xff0c;采用请求/应答方式工作。DHCP 基于 UDP 工作&#xff0c;DHCP服务器运行在67号端口&#xff0c;DHCP客户运行在68号端口。 DHCP的工作过程分为以下步骤&#xff1a; &#xff08;1&#xff09;DHCP服务器被…

一种单键开关机电路图

我们设计产品时&#xff0c;通常需要设计单键开关机功能。 单键开关机&#xff0c;通常需要单片机的两个IO完成&#xff0c;一个IO用于保持开机状态。另外&#xff0c;一个IO用于判定关机状态。 下面就是一种单键开关机电路原理图&#xff1a; 此单键开关电路已经在S2W-M02、S2…

运用文心大模型优化前端工程师简历

文章目录 大模型写简历第一步&#xff0c;整理大纲&#xff1a;第二步&#xff0c;完善专业技能部分&#xff1a;第三步&#xff0c;写项目经验&#xff1a;文心大模型 输出结果第一步第二步第三步 大模型优化简历文心大模型 输出结果openAI-Chat3.5 输出结果 总结 大模型写简历…

陪诊系统|陪诊软件医疗陪护的创新之路

陪诊服务系统源码功能及解决方案&#xff0c;在一对一专属服务&#xff0c;就医经验丰富的专业陪诊师的陪伴下&#xff0c;就医体验得以优化&#xff0c;就医全程无须自行探究和寻找&#xff0c;就医过程更加省心&#xff0c;同时减轻了家属时间精力的负担。陪诊服务系统提供的…

【Java 进阶篇】MySQL 数据库备份与还原

MySQL 是一款常用的关系型数据库管理系统&#xff0c;用于存储和管理数据。在数据库应用中&#xff0c;数据备份和还原是非常重要的操作&#xff0c;用于保护数据免受意外删除、损坏或数据丢失的影响。本文将详细介绍如何在 MySQL 中进行数据库备份和还原操作&#xff0c;包括常…

【赠书活动】AI时代项目经理必备技能

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【GDB】 command 命令

GDB command 命令 语法 command 命令是一个很好用的调试命令&#xff0c;它配合断点使用&#xff0c;可以在指定的断点执行预先设置的命令 其语法为&#xff1a;command bread_id&#xff0c;这样会提示你输入你要执行的命令&#xff0c;以 end 结束。这个 bread_id 就是用 …

期权定价模型系列【7】:Barone-Adesi-Whaley定价模型

期权定价模型系列第7篇文章 1.前言 目前大连商品交易所、郑州商品交易所、以及上海期货交易所的所有商品期权都为美式期权&#xff0c;并且大商所的所有期权合约会根据BAW(Barone-Adesi-Whaley)美式期权定价模型计算新上市期权合约的挂牌基准价。 BAW模型(Barone-Adesi and W…

Java进阶篇--网络编程

​​​​​​​ 目录 计算机网络体系结构 什么是网络协议&#xff1f; 为什么要对网络协议分层&#xff1f; 网络通信协议 TCP/IP 协议族 应用层 运输层 网络层 数据链路层 物理层 TCP/IP 协议族 TCP的三次握手四次挥手 TCP报文的头部结构 三次握手 四次挥手 …

[old]TeamDev DotNetBrowser Crack

TeamDev DotNetBrowser将 Chromium Web 浏览器添加到您的 .NET 应用程序中。在 WPF 和 WinForms 中显示现代网页。使用 DOM、JS、网络、打印等。在 Windows x86/x64/ARM64、macOS x64/Apple Silicon、Linux x64/ARM64 上运行&#xff0c;支持.NET Framework 4.5 特征 HTML5、C…

计算机图像处理-均值滤波

均值滤波 线性滤波器的原始数据与滤波结果是一种算术运算&#xff0c;即用加减乘除等运算实现&#xff0c;如均值滤波器&#xff08;模板内像素灰度值的平均值&#xff09;、高斯滤波器&#xff08;高斯加权平均值&#xff09;等。由于线性滤波器是算术运算&#xff0c;有固定…

基于风险的漏洞管理实现高效安全

通常&#xff0c;网络中存在很多漏洞&#xff0c;修补和修复它们是一个永无止境的过程。但总会有这样的问题&#xff1a;“我应该首先补救什么&#xff1f;如果在我发现另一个开放漏洞之前就被攻击者利用怎么办&#xff1f;” 如何才能避免自己陷入怨恨和悔恨的想法中&#x…

monkeyrunner录制脚本和回放

Monkeyrunner关于使用录制、生成脚本、编译脚本及执行脚本。 首先在计算机上下载和安装SDK、python 2.将recorder.py文件放置SDK文件夹里tools文件夹下 3.USB连接手机&#xff0c;手机端&#xff0c;开启USB调试&#xff0c;并在计算机DOS中输入adb devices命令&#xff0c;查看…