用python做游戏的细节详解


Posted in Python onJune 25, 2019

PyGame是一个Python的库,能够让你更容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进你的游戏里。去官网点击这里下载适合你的PyGame安装包。

大家可以参阅:Python中pygame安装方法图文详解

我们就拿打飞机来做个例子

1 .创建游戏框架以及游戏背景

#这个模块放一些常用的工具和基础类和精灵类

#在其他模块调用

import pygame

import random

#设置游戏屏幕大小 这是一个常量

SCREEN_RECT = pygame.Rect(0,0,580,700)

#敌机的定时器事件常量

CREATE_ENEMY_EVENT = pygame.USEREVENT

 

#定制一个精灵类,需要继承pygame提供的精灵类

#需要定义的属性有:

#image图片 

#rect坐标

#speed速度

 

#接下来开始写敌机方面的内容 产生敌机

#先定义一个事件常量

CREATE_ENEMY_EVENT = pygame.USEREVENT

#我们还可以定义一个事件常量(发射子弹)

HERO_FIRE_EVENT = pygame.USEREVENT + 1

 

class GameSprite(pygame.sprite.Sprite):

  def __init__(self,new_image,new_speed=1):

    super().__init__()

    #图片

    self.image = pygame.image.load(new_image)

    #速度

    self.speed = new_speed

    #位置 获取图片的宽和高 get_rect()(0,0,宽,高)

    self.rect = self.image.get_rect()

    #精灵移动的速度 包括英雄精灵 背景精灵 敌机精灵 子弹精灵

    self.speed = new_speed

 

  def update(self):

    #默认垂直方向移动 y轴控制垂直方向

    self.rect.y += self.speed

    #self.rect.x += 1

#以上是游戏的基础类,接下来设置背景类

#明确背景类继承自游戏的精灵类

class Background(GameSprite):

  def __init__(self,is_alt = False):

    #is_alt判断是否为另一张图像

    #False表示第一张图像

    #Ture表示另外一张图像

    #两张图像交替循环

    #传图片

    super().__init__("/home/zhangyuan/下载/beijing.png")

    if is_alt:

      #如果是第二张图片 初始位置为-self.rect.height

      self.rect.y = -self.rect.height

  #def __init__(self,new_image):

  #  super().init__(new_image)

  def update(self):

    #调用父类方法

    super().update()

    if self.rect.y >= SCREEN_RECT.height:

      self.rect.y = -self.rect.height

2 .创建敌机精灵

class Enemy(GameSprite):

  def __init__(self):

 

  super().__init__("/home/zhangyuan/images/enemy1.png")

  #随机速度

  self.speed = random.randint(10, 15)

  #设置敌机的初始位置

  self.rect.left = SCREEN_RECT.width

  max_ = SCREEN_RECT.height -self.rect.height

  self.rect.bottom = random.randint(0, max_)

 

def update(self):

   

  panduan = random.randint(0, 1)

  if panduan == 0:

    self.rect.y -= self.speed

    self.rect.x -= self.speed

  else:

    self.rect.y += self.speed

    self.rect.x -= self.speed

  #判断敌机是否飞出屏幕 如果飞出屏幕将敌机从精灵组删除

  if self.rect.y >= SCREEN_RECT.height or self.rect.right <=0 or self.rect.bottom <=0:

    self.kill()

3 .创建英雄精灵

class Bullet(GameSprite):

 

    def __init__(self):

      super().__init__("/home/zhangyuan/images/bullet1.png",-5)

    def update(self):

      super().update()

 

   #判断是否超出屏幕 如果是 从精灵组删除

   if self.rect.bottom < 0:

     self.kill()

5 .碰撞检测

#第一个参数和第二个参数是要参与碰撞检测的精灵

#第三个参数为Ture的时候 就是当碰撞的时候被碰撞的精灵从精灵组移除

pygame.sprite.groupcollide( self.enemy_group,self.hero.bullet, True, True)#子弹

#判断列表时候有内容

  if len(enemies)>0:

    #让英雄牺牲

    self.hero.kill()

    #结束游戏

    PlaneGame.__game_over()

@staticmethod

def __game_over():

  print("游戏结束")

  #这是pygame提供的卸载模块功能

  pygame.quit()

  #这是pygame本身提供的退出脚本的功能

  exit()

  #需要先卸载pygame模块 然后退出脚本

 

  if __name__ == "__main__":

   game = PlaneGame()

   game.star_game()
Python 相关文章推荐
python计算圆周长、面积、球体体积并画出圆
Apr 08 Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
python调用java的jar包方法
Dec 15 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Jun 11 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 #Python
python print出共轭复数的方法详解
Jun 25 #Python
python安装pil库方法及代码
Jun 25 #Python
Python处理时间日期坐标轴过程详解
Jun 25 #Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 #Python
python求最大值最小值方法总结
Jun 25 #Python
python安装requests库的实例代码
Jun 25 #Python
You might like
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
php预定义变量使用帮助(带实例)
2013/10/30 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
JTrackBar水平拖动效果
2007/07/15 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue路由 遍历生成复数router-link的例子
2019/10/30 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python计算最大优先级队列实例
2013/12/18 Python
介绍Python中几个常用的类方法
2015/04/08 Python
Python多线程下载文件的方法
2015/07/10 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
python里dict变成list实例方法
2019/06/26 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
python各层级目录下import方法代码实例
2020/01/20 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
关于环保的标语
2014/06/13 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
Python软件包安装的三种常见方法
2022/07/07 Python