游戏规则

用pygame动画实现神庙逃亡类似的小游戏,当玩家移动的时候躲避子弹,如果子弹命中玩家或者名字龙都会减速,玩家躲避子弹使更多的子弹打在龙上,当玩家被龙抓到,则游戏输,如果龙被子弹减少速度,与玩家有一定的距离,则玩家获胜。

精灵类

class MySprite(pygame.sprite.Sprite):def __init__(self, target):pygame.sprite.Sprite.__init__(self)  self.master_image = Noneself.frame = 0self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0self.last_frame = 0self.columns = 1self.last_time = 0 def _getx(self):return self.rect.xdef _setx(self, value):self.rect.x = valueX = property(_getx, _setx)def _gety(self):return self.rect.ydef _sety(self, value):self.rect.y = valueY = property(_gety, _sety)def _getpos(self):return self.rect.topleftdef _setpos(self, pos):self.rect.topleft = posposition = property(_getpos, _setpos)def load(self, filename, width, height, columns):self.master_image = pygame.image.load(filename).convert_alpha()self.frame_width = widthself.frame_height = heightself.rect = Rect(0, 0, width, height)self.columns = columnsrect = self.master_image.get_rect()self.last_frame = (rect.width // width) * (rect.height // height) - 1def update(self, current_time, rate=30):if current_time > self.last_time + rate:self.frame += 1if self.frame > self.last_frame:self.frame = self.first_frameself.last_time = current_timeif self.frame != self.old_frame:frame_x = (self.frame % self.columns) * self.frame_widthframe_y = (self.frame // self.columns) * self.frame_heightrect = pygame.Rect(frame_x, frame_y, self.frame_width, self.frame_height)self.image = self.master_image.subsurface(rect)self.old_frame = self.framedef __str__(self):return str(self.frame) + "," + str(self.first_frame) + \"," + str(self.last_frame) + "," + str(self.frame_width) + \"," + str(self.frame_height) + "," + str(self.columns) + \"," + str(self.rect)

MySprite继承精灵类,因为在做动画时候,需要许多的参数,这里进行了初始化,master_image 图片的位置,frame、old_frame分别储存第一帧和上一帧的位置,frame_width和frame_height保存宽高,first和last保存帧的第一帧和最后一帧。columns保存列数。last_time时间变量。
X、Y、pos保存精灵的位置x和y的位置。

load载入,赋予对应精灵的值,(rect.width // width) * (rect.height // height) - 1,通过给定的图片的宽高除以参数的值,-1就是初始的位置是从0开始的。

update更新的时候,根据传入的时间和间隔频率,如果时间大于上次时间和间隔则改变帧数,如果帧数改变对应的图片位置也改变,实现动态变化。

加载龙

dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
dragon.position = 100, 230
group.add(dragon)arrow_vel = 8.0
game_over = False
you_win = False
player_jumping = False
jump_vel = 0.0while True:framerate.tick(30)ticks = pygame.time.get_ticks()for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()keys = pygame.key.get_pressed()if keys[pygame.K_ESCAPE]:sys.exit()elif keys[pygame.K_SPACE]:if not player_jumping:player_jumping = Truejump_vel = -8.0screen.blit(bg, (0, 0))if not game_over:group.update(ticks, 50)group.draw(screen)print_text(font, 350, 360, "Press SPACE to jump!")if game_over:print_text(font, 360, 100, "G A M E O V E R")if you_win:print_text(font, 330, 130, "YOU BEAT THE DRAGON")else:print_text(font, 330, 130, "THE DRAGON GOT YOU")pygame.display.update()

加载龙,实现龙动画,这里没有龙的位移,玩家躲子弹或者命中子弹都会导致双方的x坐标减少,这里没使用对应的速度改变,减少游戏的开发难度。

加载子弹

def reset_arrow():y = random.randint(250, 350)arrow.position = 800, yarrow = MySprite(screen)
arrow.load("flame.png", 40, 16, 1)
arrow.position = 800, 320
group.add(arrow)

子弹因为只有一个,如果击中则需要重置,这里写了重置子弹的函数便于调用,random.randint(250, 350)给子弹一个随机的高度。使游戏与变化。

添加玩家

player = MySprite(screen)
player.load("caveman.png", 50, 64, 8)
player.first_frame = 1
player.last_frame = 7
player.position = 400, 303
group.add(player)player_start_y = player.Y

player_start_y记录玩家初始的y坐标判断玩家是否处于跳跃状态中。

碰撞事件

    if not game_over:arrow.X -= arrow_velif arrow.X < 40:reset_arrow()if pygame.sprite.collide_rect(arrow, player):reset_arrow()player.X -= 10if pygame.sprite.collide_rect(arrow, dragon):reset_arrow()dragon.X -= 10if pygame.sprite.collide_rect(player, dragon):game_over = Trueif dragon.X < -100:you_win = Truegame_over = Trueif player_jumping:player.Y += jump_veljump_vel += 0.5if player.Y > player_start_y:player_jumping = Falseplayer.Y = player_start_yjump_vel = 0.0

这里需要检验玩家、子弹和龙两两相碰的事件。

完整代码

import sys, time, random, math, pygame
from pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, target):pygame.sprite.Sprite.__init__(self)  # extend the base Sprite classself.master_image = Noneself.frame = 0self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0self.last_frame = 0self.columns = 1self.last_time = 0# X propertydef _getx(self):return self.rect.xdef _setx(self, value):self.rect.x = valueX = property(_getx, _setx)# Y propertydef _gety(self):return self.rect.ydef _sety(self, value):self.rect.y = valueY = property(_gety, _sety)# position propertydef _getpos(self):return self.rect.topleftdef _setpos(self, pos):self.rect.topleft = posposition = property(_getpos, _setpos)def load(self, filename, width, height, columns):self.master_image = pygame.image.load(filename).convert_alpha()self.frame_width = widthself.frame_height = heightself.rect = Rect(0, 0, width, height)self.columns = columns# try to auto-calculate total framesrect = self.master_image.get_rect()self.last_frame = (rect.width // width) * (rect.height // height) - 1def update(self, current_time, rate=30):# update animation frame numberif current_time > self.last_time + rate:self.frame += 1if self.frame > self.last_frame:self.frame = self.first_frameself.last_time = current_time# build current frame only if it changedif self.frame != self.old_frame:frame_x = (self.frame % self.columns) * self.frame_widthframe_y = (self.frame // self.columns) * self.frame_heightrect = pygame.Rect(frame_x, frame_y, self.frame_width, self.frame_height)self.image = self.master_image.subsurface(rect)self.old_frame = self.framedef __str__(self):return str(self.frame) + "," + str(self.first_frame) + \"," + str(self.last_frame) + "," + str(self.frame_width) + \"," + str(self.frame_height) + "," + str(self.columns) + \"," + str(self.rect)def print_text(font, x, y, text, color=(255, 255, 255)):imgText = font.render(text, True, color)screen.blit(imgText, (x, y))def reset_arrow():y = random.randint(250, 350)arrow.position = 800, ypygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Escape Dragon")
font = pygame.font.Font(None, 18)
framerate = pygame.time.Clock()bg = pygame.image.load('background.png').convert_alpha()group = pygame.sprite.Group()dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
dragon.position = 100, 230
group.add(dragon)player = MySprite(screen)
player.load("caveman.png", 50, 64, 8)
player.first_frame = 1
player.last_frame = 7
player.position = 400, 303
group.add(player)arrow = MySprite(screen)
arrow.load("flame.png", 40, 16, 1)
arrow.position = 800, 320
group.add(arrow)arrow_vel = 8.0
game_over = False
you_win = False
player_jumping = False
jump_vel = 0.0
player_start_y = player.Ywhile True:framerate.tick(30)ticks = pygame.time.get_ticks()for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()keys = pygame.key.get_pressed()if keys[pygame.K_ESCAPE]:sys.exit()elif keys[pygame.K_SPACE]:if not player_jumping:player_jumping = Truejump_vel = -8.0if not game_over:arrow.X -= arrow_velif arrow.X < 40:reset_arrow()if pygame.sprite.collide_rect(arrow, player):reset_arrow()player.X -= 10if pygame.sprite.collide_rect(arrow, dragon):reset_arrow()dragon.X -= 10if pygame.sprite.collide_rect(player, dragon):game_over = Trueif dragon.X < -100:you_win = Truegame_over = Trueif player_jumping:player.Y += jump_veljump_vel += 0.5if player.Y > player_start_y:player_jumping = Falseplayer.Y = player_start_yjump_vel = 0.0screen.blit(bg, (0, 0))if not game_over:group.update(ticks, 50)group.draw(screen)print_text(font, 350, 360, "Press SPACE to jump!")if game_over:print_text(font, 360, 100, "G A M E O V E R")if you_win:print_text(font, 330, 130, "YOU BEAT THE DRAGON")else:print_text(font, 330, 130, "THE DRAGON GOT YOU")pygame.display.update()

pygame 神庙逃亡相关推荐

  1. 图灵在布莱切利园的女朋友_前亚马逊副总裁蒂姆·布莱伊为什么离开了

    图灵在布莱切利园的女朋友 重点 (Top highlight) 大技术 (BIG TECHNOLOGY) OneZero is partnering with Big Technology, a ne ...

  2. HTC VIEW丨14. 使用激光指针与物体交互:一直显示激光——(VR交互机制3-Use)

    Use两种实现方式: 1.使用手柄点击,按下Trigger键触发 2.使用激光指针悬停在物体上,按下Trigger键 2019.06.26更新: 写了一套逻辑,只要勾选isHTC,自动帮你把UI从PC ...

  3. pygame 躲避僵尸

    游戏玩法 根据神庙逃亡,实现一个人躲避僵尸的小游戏,主要的是精灵.精灵组之间相撞.相交的处理. 游戏开始随机出现一定的僵尸,随机移动,玩家在一位置上,如果僵尸靠近玩家一定距离,则玩家持续掉血.玩家通过 ...

  4. pygame是python的一个库吗,python学习pygame,,基本库导入impor

    python学习pygame,,基本库导入impor 基本库导入 import pygame import sys from pygame.locals import * 初始化 pygame.ini ...

  5. 在Ubuntu 16.04.5 LTS上安装pygame模块

    简介 Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚. 安装 sudo pip insta ...

  6. pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)

    2D的跑酷游戏有很多,著名的例如Chrome的彩蛋小游戏,手机上的天天酷跑等. 打开Chrome浏览器输入 chrome://dino/,按空格激活彩蛋 这篇文章来分析一下这类横版跑酷游戏的主角奔跑, ...

  7. 用74l138实现一个一位全减器_用pygame实现一个简单的五子棋游戏

    准备 python基础相关准备: pygame的基础知识,参考目光博客的"用Python和Pygame写游戏-从入门到精通" 安装python 3.8.0 在python官网下载, ...

  8. 【Python】在Mac系统中安装Pygame

    我们通过Homebrew来安装Pygame,Homebrew是Mac OSX上的软件包管理工具,如果还没安装Homebrew,将以下命令粘贴至终端先安装Homebrew /usr/bin/ruby - ...

  9. 《Python和Pygame游戏开发指南》——2.16 pygame.display.update()函数

    本节书摘来自异步社区<Python和Pygame游戏开发指南>一书中的第2章,第2.16节,作者[美]Al Sweigart(斯维加特), 李强 译,更多章节内容可以访问云栖社区" ...

最新文章

  1. 为什么yamlp中没有cplex_在《英雄联盟》中,为什么有些T1英雄并没有我们想象中那么强势?...
  2. 16个matplotlib绘图实用小技巧!
  3. java 工厂模式 计算器_简单工厂模式实现简易计算器
  4. 分布式服务Dubbo+Zookeeper安全认证
  5. HyperLink 鼠标经过时候显示全部文字
  6. nginx mysql5.7_Centos7+Php7+Mysql5.7+Nginx源码安装实战部署手册
  7. 学习Java的相关知识
  8. Win7虚拟无线AP以及Android手机抓包
  9. 返回json格式 不忽略null字段
  10. 拓端tecdat|R语言markov switching model马尔可夫转换分析研究水资源
  11. “互联网+”大学生创新创业大赛项目策划书
  12. 页面置换算法详解(10种)
  13. 苹果微信html音乐播放,iphone 微信网页自动播放音频解决办法
  14. android窗口变化事件,android ViewPager滑动事件讲解
  15. Linux学习笔记-shell脚本-log脚本函数
  16. html中的定位及其定位方式
  17. 多看阅读怎么设置翻页
  18. 史上最全的APP推广模式及方法技巧
  19. 计算机专业英语答案任伟,专业英语教案
  20. 理解onMeasure

热门文章

  1. 爬虫---Beautiful Soup 初始
  2. 国足1-0韩国 热血球场想到了代码
  3. 20160129001 唯美句子
  4. 坦然面对,欣然接受,不卑不亢
  5. 微机汇编语言ptr 是操作符 运算符号更改属性操作符,左边数据类型赋给右边
  6. 汇编里面: add word ptr [bx],2 是什么意思??
  7. 阶乘求和python
  8. YC掌门Sam Altman:一开始就想做公司的只有死路一条
  9. Goby 2.0 | 引擎大升级 · DIY 指纹时代
  10. .Net 关于 InfoPath 的基本使用