用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网络爬虫出现乱码问题的解决方法
Jan 05 Python
用pickle存储Python的原生对象方法
Apr 28 Python
python指定写入文件时的编码格式方法
Jun 07 Python
Python 3.x基于Xml数据的Http请求方法
Dec 28 Python
Django的models模型的具体使用
Jul 15 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 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
php中stdClass的用法分析
2015/02/27 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
angular2使用简单介绍
2016/03/01 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
投标文件签署授权委托书范本
2014/10/12 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
《去年的树》教学反思
2016/02/18 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang