用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 select.select模块通信的实例讲解
Sep 21 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
让代码变得更易维护的7个Python库
Oct 09 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
基于pytorch 预训练的词向量用法详解
Jan 06 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
Python3 assert断言实现原理解析
Mar 02 Python
Python如何用filter函数筛选数据
Mar 05 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
python中的被动信息搜集
Apr 29 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将csv文件导入到mysql数据库的方法
2014/12/24 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
一段实时更新的时间代码
2006/07/07 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
Ruby元编程基础学习笔记整理
2016/07/02 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
Python中@property的理解和使用示例
2019/06/11 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
乌克兰在线药房:Аптека24
2019/10/30 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
施工安全协议书
2013/12/11 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
企业消防安全责任书
2014/07/23 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
简单租房协议书范本
2014/08/20 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2015新学期家长寄语
2015/02/26 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
python实现简单的名片管理系统
2021/04/26 Python
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript