import time
import random
import os
import sysimport pygame
from pygame.locals import *#全局变量声明
if 65535:os.environ['SDL_VIDEO_WINDOW_POS']="350,250"#设置窗口初始位置BG_IMAGE0 = r'D:\VS2019_Object\2D射击\img\BackGround\BG0.png'BG_IMAGE1 = r'D:\VS2019_Object\2D射击\img\BackGround\BG1.png'BG_IMAGE2 = r'D:\VS2019_Object\2D射击\img\BackGround\BG2.png'#背景AK_IMAGE0 = r'D:\VS2019_Object\2D射击\img\AK\gun0.png'AK_IMAGE1 = r'D:\VS2019_Object\2D射击\img\AK\gun1.png'AK_IMAGE2 = r'D:\VS2019_Object\2D射击\img\AK\gun2.png'#AK47AKlogo_G = r'D:\VS2019_Object\2D射击\img\AK\AK_G.png'AKlogo_Y = r'D:\VS2019_Object\2D射击\img\AK\AK_Y.png'#logoSTAR = r'D:\VS2019_Object\2D射击\img\00.png'STAR_RED = r'D:\VS2019_Object\2D射击\img\00_red.png'#准星ENEMY0 = r'D:\VS2019_Object\2D射击\img\enemy\eneny0.png'ENEMY1 = r'D:\VS2019_Object\2D射击\img\enemy\eneny1.png'ENEMY2 = r'D:\VS2019_Object\2D射击\img\enemy\eneny2.png'ENEMY3 = r'D:\VS2019_Object\2D射击\img\enemy\eneny3.png'#敌人ROBOT0 = r'D:\VS2019_Object\2D射击\img\robot\robot-1.png'ROBOT1 = r'D:\VS2019_Object\2D射击\img\robot\robot-2.png'ROBOT2 = r'D:\VS2019_Object\2D射击\img\robot\robot-3.png'ROBOT3 = r'D:\VS2019_Object\2D射击\img\robot\robot-4.png'ROBOT4 = r'D:\VS2019_Object\2D射击\img\robot\robot-5.png'ROBOT5 = r'D:\VS2019_Object\2D射击\img\robot\robot-6.png'#机器人boom_pathss=[]for root, dirs, files in os.walk(r'D:\VS2019_Object\2D射击\img\boom'):path = [os.path.join(root, name) for name in files]boom_pathss.extend(path)#从目录获取所有爆炸贴图的路径并存入数组FAIL = r'D:\VS2019_Object\2D射击\img\fail.png'#失败#位图句柄pygame.init()#初始化pygamepygame.display.set_caption('2D')#设置标题栏screen = pygame.display.set_mode((700, 380),DOUBLEBUF,32)#窗口大小#0表示不使用特性,可用FULLSCREEN,RESIZEBLE,NOFRAME,DOUBLEBUF(双缓冲,使用时需用pygame.display.flip()来刷新屏幕)等替换#32=色深bg0 = pygame.image.load(BG_IMAGE0).convert_alpha()bg1 = pygame.image.load(BG_IMAGE1).convert_alpha()bg2 = pygame.image.load(BG_IMAGE2).convert_alpha()#载入背景图0AK0 = pygame.image.load(AK_IMAGE0).convert_alpha()AK1 = pygame.image.load(AK_IMAGE1).convert_alpha()AK2 = pygame.image.load(AK_IMAGE2).convert_alpha()AK=[AK0,AK1,AK2]#载入AK图并存入数组AK_logo_green = pygame.image.load(AKlogo_G).convert_alpha()AK_logo_green = pygame.transform.scale(AK_logo_green,(192,64))AK_logo_yellow = pygame.image.load(AKlogo_Y).convert_alpha()AK_logo_yellow = pygame.transform.scale(AK_logo_yellow,(192,64))#logo加载enemy0 = pygame.image.load(ENEMY0).convert_alpha()enemy1 = pygame.image.load(ENEMY1).convert_alpha()enemy2 = pygame.image.load(ENEMY2).convert_alpha()enemy3 = pygame.image.load(ENEMY3).convert_alpha()ENEMY=[enemy0,enemy1,enemy2,enemy3]#载入敌人贴图和初始化数组robot0 = pygame.image.load(ROBOT0).convert_alpha()robot1 = pygame.image.load(ROBOT1).convert_alpha()robot2 = pygame.image.load(ROBOT2).convert_alpha()robot3 = pygame.image.load(ROBOT3).convert_alpha()robot4 = pygame.image.load(ROBOT4).convert_alpha()robot5 = pygame.image.load(ROBOT5).convert_alpha()ROBOT=[robot0,robot1,robot2,robot3,robot4,robot5]#载入机器人贴图和初始化数组star = pygame.image.load(STAR).convert_alpha()star = pygame.transform.scale(star,(60,60))star_red = pygame.image.load(STAR_RED).convert_alpha()star_red = pygame.transform.scale(star_red,(60,60))#载入准星图和缩放图片大小for i in range(0,len(boom_pathss)):boom_pathss[i]=pygame.image.load(boom_pathss[i]).convert_alpha()#载入爆炸图fail = pygame.image.load(FAIL).convert_alpha()#载入失败图myfont=pygame.font.Font(r'D:\VS2019_Object\PyGame\Font\张海山草泥马体.ttf',30)#字体定义FPS=60#画面刷新速率BackGroundMove0=0BackGroundMove1=0BackGroundMove2=0BG_v0=.25BG_v1=.75BG_v2=1#背景滚动速度time_Pre=time.time()time_Now=time.time()#画面刷新间隔时间标记time_boom_Pre=time.time()time_boom_Now=time.time()#敌机生成间隔时间标记y_line = 190#AK到达此高度结束开场动画y_print = 380#AK创建高度# 使用类创建敌人结构体class EnemyClass(object):class Struct(object):def __init__(self, x, y,L,P,b):self.x = x  #敌人x坐标self.y = y  #敌人y坐标self.L = L  #敌人动画状态(存活置1,击中置0,销毁置-1)self.P = P #移动图号self.b = b #爆炸图号#def make_struct(self, x, y,L,P,b):#    self.x = x#    self.y = y#    self.L = L#    self.P = P#    self.b = b#    return self.Struct(x, y, L,P,b)enemy = EnemyClass()enemy_N=[EnemyClass() for i in range(0,32)]for i in range(0,32):enemy_N[i].x=700enemy_N[i].y=200enemy_N[i].L=-1enemy_N[i].P=-1enemy_N[i].b=0fire=False#开火状态标记Can_fire=False#准星是否瞄准fire_num=0#开火图号enemy_v=2#敌人速度num=0#分数robot_num=0#机器人贴图图号heath=3#生命值GameOver=False#游戏结束状态标记robot_boom_num=0#机器人爆炸图号fail_print=-108#失败图高度pygame.mouse.set_visible(False)#隐藏系统鼠标图标#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓开场动画
while 1024:if y_line>=y_print:#当AK达到结束高度时跳出循环动画breakscreen.blit(bg0, (0, 0))screen.blit(bg1, (0, 0))screen.blit(bg2, (0, 0))screen.blit(AK[0], (350, y_print))#背景和AK贴图y_print-= 2#AK移动量if robot_num==5:robot_num=0screen.blit(ROBOT[robot_num], ((380-y_print)/6, 270))robot_num+=1#机器人贴图pygame.display.update()#刷新画布time.sleep(0.01)#_开场动画time_Now=time.time()
time_boom_Now=time.time()
#初始化时间标记#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓主循环while 3.14:x, y = pygame.mouse.get_pos()#获取鼠标坐标for event in pygame.event.get():if event.type == QUIT:#退出消息pygame.quit()sys.exit()#调用退出函数if event.type ==MOUSEBUTTONDOWN:#鼠标按键消息pressed_array = pygame.mouse.get_pressed()for index in range(len(pressed_array)):#判断键值if pressed_array[index]:if index == 0:print("点击开火")fire=Trueif index == 1:print("中键")if index == 2:print("右键")    time_Now=time.time()#时间标记更新if time_Now-time_Pre>(1/FPS):screen.blit(bg0, (0-BackGroundMove0,0))screen.blit(bg0, (700-BackGroundMove0,0))#景深贴图BackGroundMove0+=BG_v0if BackGroundMove0>=700:BackGroundMove0=0#贴图滚动,超出界面则重置位置screen.blit(bg1, (0-BackGroundMove1,0))screen.blit(bg1, (700-BackGroundMove1,0))#云朵贴图BackGroundMove1+=BG_v1if BackGroundMove1>=700:BackGroundMove1=0screen.blit(bg2, (0-BackGroundMove2,0))screen.blit(bg2, (700-BackGroundMove2,0))#前景贴图BackGroundMove2+=BG_v2if BackGroundMove2>=700:BackGroundMove2=0#利用3层贴图实现视差效果time_boom_Now=time.time()#时间标记更新if GameOver==False:if time_boom_Now-time_boom_Pre>2:for i in range(1,len(enemy_N)-1):#生成敌人if enemy_N[i].L==-1:#判断是否可生成enemy_N[i].L=1#设置为存活状态print("生成敌人")enemy_N[i].x=700time_boom_Pre=time.time()#时间标记更新breakfor i in range(1,len(enemy_N)-1):#敌人贴图if enemy_N[i].L==1:#判断是否存活enemy_N[i].P+=1#图号自增if enemy_N[i].P==4:#图号超出重置enemy_N[i].P=0enemy_N[i].x-=enemy_v#贴图坐标更新if enemy_N[i].x<=110:enemy_N[i].L=0#碰撞爆炸print("发生碰撞-10,销毁敌人")num-=10heath-=1if heath<=0:heath=0GameOver=Truefor i in range(1,len(enemy_N)-1):enemy_N[i].L=-1#清空剩余敌人screen.blit(ENEMY[enemy_N[i].P], (enemy_N[i].x,enemy_N[i].y))for i in range(1,len(enemy_N)-1):#爆炸贴图if enemy_N[i].L==0:#判断是否击中screen.blit(boom_pathss[enemy_N[i].b], (enemy_N[i].x-150,enemy_N[i].y-80))enemy_N[i].b+=1if enemy_N[i].b>=37:enemy_N[i].b=0enemy_N[i].L=-1if GameOver==False:if robot_num==5:robot_num=0screen.blit(ROBOT[robot_num], (30, 270))robot_num+=1#机器人贴图if GameOver==True:screen.blit(fail, (100, fail_print))if fail_print<10:fail_print+=3#游戏失败标题动画for i in range(1,len(enemy_N)-1):if enemy_N[i].L==1:#判断是否存活if enemy_N[i].x<x<enemy_N[i].x+92 and enemy_N[i].y<y<enemy_N[i].y+108:screen.blit(star_red, (x-star.get_width() / 2,y-star.get_height()/2))Can_fire=Trueif fire:enemy_N[i].L=0#击中敌人num+=10print("击中敌人+10")else:passscreen.blit(star, (x-star.get_width() / 2,y-star.get_height()/2))#准星贴图if GameOver==True and robot_boom_num<len(enemy_N)-1:screen.blit(boom_pathss[robot_boom_num], (-80,170))robot_boom_num+=1#游戏失败,机器人爆炸textImage=myfont.render("分数:"+str(num),True,(0,0,0))screen.blit(textImage,(300,10))textImage=myfont.render("生命:"+str(heath),True,(0,0,0))screen.blit(textImage,(50,230))#信息打印if x>600:x=600if y<190:y=190#准星位置判断if fire:if fire_num==3:fire_num=0fire=Falsescreen.blit(AK[fire_num], (x, y))screen.blit(AK_logo_yellow, (0, 0))fire_num+=1#开火状态贴图else:screen.blit(AK[0], (x, y))screen.blit(AK_logo_green, (0, 0))#非开火状态贴图if GameOver==False:pygame.draw.rect(screen,(255, 0, 0), (30, 260, 120, 8))if heath>0:pygame.draw.rect(screen,(0, 255, 0), (30, 260, 120*heath/3, 8))#血条显示pygame.display.update()#刷新画布time_Pre=time.time()#_更新画面

运行:

pygame_2D射击小游戏相关推荐

  1. 基于pygame的射击小游戏制作(一)让飞船动起来

    基于pygame的射击小游戏制作(一)让飞船动起来 一.文件结构 alien_invasion.py 是整个系统的主文件,用来创建游戏中的一系列对象,ai_settings存储设置.screen存储显 ...

  2. Unity3D 2D射击小游戏瞄准线的实现

    Unity3D 2D射击小游戏瞄准线的实现 0. 前言 本片文章是对 https://www.bilibili.com/video/bv1sY411V7tx 视频中瞄准线是如何实现的一个讲解教程,欢迎 ...

  3. 基于html+JavaScript+css的飞机射击小游戏网页设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/86954471 资源下载地址:https://download.csdn.net/downl ...

  4. 坦克射击小游戏(后续将会升级功能)

    坦克射击小游戏(后续将会升级功能) 总体框架 关键技术 未来版本 我的Github 游戏源码在我的Github,感兴趣的的帮忙给颗星呀,并加入我们吧~ 这是我跟着b站韩顺平老师学的一个很锻炼基础的小项 ...

  5. 射击小游戏源码《90坦克大战》源码H5+安卓+IOS三端源码

    cocos creator2.2.2射击小游戏源码<90坦克大战>源码H5+安卓+IOS三端源码,开发脚本为javaScript方便扩展和阅读,支持cocos creator2.X版本,完 ...

  6. Java 飞机射击小游戏

    文章目录 前言 一.系统分析 问题描述 总体设计 功能流程图 二.程序和算法的介绍 FlyingObject(本机和所有敌机父类) Airplane(小敌机类) Bee(小蜜蜂敌机类) Bullet( ...

  7. Java面向对象(6) —— 射击小游戏

    这里做一个射击小游戏,作为对前面Java学习的一个小结. 1.设计 2.知识点总结 主要是在主程序ShootGame.java中引入了一些新知识,swing画图.定时器.鼠标事件处理.其他程序则主要体 ...

  8. 【转载】c++射击小游戏

    转载于:https://www.jb51.net/article/170405.htm 这篇文章主要为大家详细介绍了C++实现简单射击小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小 ...

  9. Android 自定义View实现炮弹射击小游戏

    先看效果图: 这是一个比较简易的射击小游戏,后期可以将圆球,炮筒用其它图片来替换,应该可以变得好看一些.我实现这个效果,主要是为了学习和巩固自定义View的一些知识点.下面我来讲述一下本游戏的设计思路 ...

最新文章

  1. Libevent实现TCP服务循环监听
  2. 活在未来,需要知道了解过去
  3. MySQL学习笔记02-数据库概述及MySQL简介 .
  4. React Native 轻松集成分享功能( iOS 篇)
  5. windows 10 systeminfo命令查看系统信息
  6. Jsp-Servlet 概要总结[转]
  7. 《Effective Java》 第二讲:对于所有对象都通用的方法
  8. 番茄钟怎么调_学习神器-番茄钟
  9. if函数 字体自动标红_发喜糖!REPT函数和图表订婚了~~
  10. 服务器配置 | 3306端口被占用,phpStudy无法启动Apache
  11. python pprint_python读写文件(七)
  12. 题解 P1137 【旅行计划】
  13. 关于java.sql.SQLRecoverableException: Closed Connection异常的解决方案(转)
  14. python中list和numpy的array的转换
  15. 物联网四大产业群的典型应用场景
  16. HTML emoji
  17. 中国省市JSON列表
  18. 深度学习系列笔记之统计基础
  19. MN梦奈宝塔主机系统V1.5版本发布
  20. Java利用Set集合去重复

热门文章

  1. 小黄鸭调试法,每个程序员都要知道的
  2. 蓝桥杯Java——枚举法
  3. 2023 年第八届数维杯数学建模挑战赛 赛题浅析
  4. 多分支结构——个人所得税计算器
  5. c#开发Edge插件
  6. 智能焊接机器人的视觉系统构成
  7. java swt 计算器_JAVA开发简易计算器界面-SWT
  8. 几种基于神经网络的CTR预估模型
  9. 关灯吃面?折基也会下蛋
  10. 511遇见易语言取数组成员数和取数组下标