用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的Django框架中settings文件的部署建议
May 30 Python
django中模板的html自动转意方法
May 27 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
Python日志无延迟实时写入的示例
Jul 11 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
Python3 类型标注支持操作
Jun 02 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 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开发大型项目的一点经验
2006/10/09 PHP
计数器详细设计
2006/10/09 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
php桥接模式应用案例分析
2019/10/23 PHP
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
python操作yaml说明
2020/04/08 Python
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
给物业的表扬信
2014/01/21 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
SQL Server表分区删除详情
2021/10/16 SQL Server
yolov5返回坐标的方法实例
2022/03/17 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python