用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 04 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
python编程开发之日期操作实例分析
Nov 13 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
Python三级目录展示的实现方法
Sep 28 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
深入理解Django的自定义过滤器
Oct 17 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
pandas 如何分割字符的实现方法
Jul 29 Python
Django的CVB实例详解
Feb 10 Python
python如何做代码性能分析
Apr 26 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 操作excel文件的方法小结
2009/12/31 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
Python 文件和输入输出小结
2013/10/09 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python生成九宫格图片
2018/11/19 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
如何基于python操作excel并获取内容
2019/12/24 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
linux面试题参考答案(5)
2014/09/01 面试题
庆祝教师节活动总结
2015/03/23 职场文书
七一晚会主持词
2015/06/29 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP
SpringBoot Http远程调用的方法
2022/08/14 Java/Android