用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实现定制交互式命令行的方法
Jul 03 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
Python编程之event对象的用法实例分析
Mar 23 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
python装饰器实例大详解
Oct 25 Python
Python实现的求解最大公约数算法示例
May 03 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
原生python实现knn分类算法
Oct 24 Python
python取均匀不重复的随机数方式
Nov 27 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
记一次Django响应超慢的解决过程
Sep 17 Python
python re模块和正则表达式
Mar 24 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中神奇的fastcgi_finish_request
2011/05/02 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
php建立Ftp连接的方法
2015/03/07 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
jquery动态添加option示例
2013/12/30 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
巧用canvas
2017/01/21 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
Python 实现数组相减示例
2019/12/27 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
大学生旷课检讨书
2014/01/22 职场文书
实习生岗位职责
2014/04/12 职场文书
部队个人年终总结
2015/03/02 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python