pygame 笔记-5 模块化&加入敌人
上一节,已经用OOP方法,把几个类抽象出来了,但是都集中在一个.py文件中,代码显得很冗长,这一节复用模块化的思想,把这个大文件拆分成几个小文件:
先把主角Player单独放到一个文件player.py里:
import pygame # 主角
class Player(object): def __init__(self, x, y, width, height, img_base_path):
self.x = x
self.y = y
self.width = width
self.height = height
self.speed = 5
self.left = False
self.right = True
self.isJump = False
self.walkCount = 0
self.t = 10
self.speed = 5
self.char = pygame.image.load(img_base_path + 'standing.png')
# 向右走的图片数组
self.walkRight = [pygame.image.load(img_base_path + 'actor/R1.png'),
pygame.image.load(img_base_path + 'actor/R2.png'),
pygame.image.load(img_base_path + 'actor/R3.png'),
pygame.image.load(img_base_path + 'actor/R4.png'),
pygame.image.load(img_base_path + 'actor/R5.png'),
pygame.image.load(img_base_path + 'actor/R6.png'),
pygame.image.load(img_base_path + 'actor/R7.png'),
pygame.image.load(img_base_path + 'actor/R8.png'),
pygame.image.load(img_base_path + 'actor/R9.png')] # 向左走的图片数组
self.walkLeft = [pygame.image.load(img_base_path + 'actor/L1.png'),
pygame.image.load(img_base_path + 'actor/L2.png'),
pygame.image.load(img_base_path + 'actor/L3.png'),
pygame.image.load(img_base_path + 'actor/L4.png'),
pygame.image.load(img_base_path + 'actor/L5.png'),
pygame.image.load(img_base_path + 'actor/L6.png'),
pygame.image.load(img_base_path + 'actor/L7.png'),
pygame.image.load(img_base_path + 'actor/L8.png'),
pygame.image.load(img_base_path + 'actor/L9.png')] def draw(self, win):
if self.walkCount >= 9:
self.walkCount = 0 if self.left:
win.blit(self.walkLeft[self.walkCount % 9], (self.x, self.y))
self.walkCount += 1
elif self.right:
win.blit(self.walkRight[self.walkCount % 9], (self.x, self.y))
self.walkCount += 1
else:
win.blit(self.char, (self.x, self.y))
其次是子弹类:
import pygame # 子弹类
class Bullet(object): def __init__(self, x, y, direction, img_base_path):
self.x = x
self.y = y
self.facing = direction
self.vel = 8 * direction
self.width = 24
self.height = 6
self.bullet_right = pygame.image.load(img_base_path + 'r_bullet.png')
self.bullet_left = pygame.image.load(img_base_path + 'l_bullet.png') def draw(self, win):
# 根据人物行进的方向,切换不同的子弹图片
if self.direction == -1:
win.blit(self.bullet_left, (self.x - 35, self.y))
else:
win.blit(self.bullet_right, (self.x + 10, self.y))
做为一个射击类的小游戏,这一节我们再加入目标敌人的类:
import pygame
class Enemy(object):
def __init__(self, x, y, width, height, end, img_base_path):
self.x = x
self.y = y
self.width = width
self.height = height
self.path = [x, end]
self.walkCount = 0
self.vel = 3
self.walkRight = [pygame.image.load(img_base_path + 'enemy/R1E.png'),
pygame.image.load(img_base_path + 'enemy/R2E.png'),
pygame.image.load(img_base_path + 'enemy/R3E.png'),
pygame.image.load(img_base_path + 'enemy/R4E.png'),
pygame.image.load(img_base_path + 'enemy/R5E.png'),
pygame.image.load(img_base_path + 'enemy/R6E.png'),
pygame.image.load(img_base_path + 'enemy/R7E.png'),
pygame.image.load(img_base_path + 'enemy/R8E.png'),
pygame.image.load(img_base_path + 'enemy/R9E.png'),
pygame.image.load(img_base_path + 'enemy/R10E.png'),
pygame.image.load(img_base_path + 'enemy/R11E.png')]
self.walkLeft = [pygame.image.load(img_base_path + 'enemy/L1E.png'),
pygame.image.load(img_base_path + 'enemy/L2E.png'),
pygame.image.load(img_base_path + 'enemy/L3E.png'),
pygame.image.load(img_base_path + 'enemy/L4E.png'),
pygame.image.load(img_base_path + 'enemy/L5E.png'),
pygame.image.load(img_base_path + 'enemy/L6E.png'),
pygame.image.load(img_base_path + 'enemy/L7E.png'),
pygame.image.load(img_base_path + 'enemy/L8E.png'),
pygame.image.load(img_base_path + 'enemy/L9E.png'),
pygame.image.load(img_base_path + 'enemy/L10E.png'),
pygame.image.load(img_base_path + 'enemy/L11E.png')]
def draw(self, win):
self.move()
if self.walkCount >= 11:
self.walkCount = 0
if self.vel > 0:
win.blit(self.walkRight[self.walkCount % 11], (self.x, self.y))
self.walkCount += 1
else:
win.blit(self.walkLeft[self.walkCount % 11], (self.x, self.y))
self.walkCount += 1
def move(self):
if self.vel > 0:
if self.x < self.path[1] + self.vel:
self.x += self.vel
else:
self.vel = self.vel * -1
self.x += self.vel
self.walkCount = 0
else:
if self.x > self.path[0] - self.vel:
self.x += self.vel
else:
self.vel = self.vel * -1
self.x += self.vel
self.walkCount = 0
这3个.py文件放在与主文件tutorial_6.py同一个目录下,如下图:

然后在主文件tutorial_6.py里,把这3个模块导进来:
import os
# 导入3个模块
from bullet import *
from player import *
from enemy import * pygame.init() WIN_WIDTH, WIN_HEIGHT = 500, 500 win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("first game") img_base_path = os.getcwd() + '/img/'
bg = pygame.image.load(img_base_path + 'bg.jpg') clock = pygame.time.Clock() def redraw_game_window():
win.blit(bg, (0, 0))
man.draw(win)
goblin.draw(win)
for b in bullets:
b.draw(win)
pygame.display.update() # main
man = Player(200, 410, 64, 64, img_base_path)
goblin = Enemy(100, 410, 64, 64, 400, img_base_path)
run = True
bullets = []
while run:
clock.tick(24) for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False for bullet in bullets:
if WIN_WIDTH > bullet.x > 0:
bullet.x += bullet.vel
else:
bullets.pop(bullets.index(bullet)) keys = pygame.key.get_pressed() if keys[pygame.K_SPACE]:
if man.left:
facing = -1
else:
facing = 1 if len(bullets) < 5:
bullets.append(Bullet(round(man.x + man.width // 2), round(man.y + man.height // 2), facing, img_base_path)) if keys[pygame.K_LEFT] and man.x > 0:
man.x -= man.speed
man.left = True
man.right = False
elif keys[pygame.K_RIGHT] and man.x < win.get_size()[0] - man.width:
man.x += man.speed
man.left = False
man.right = True
else:
man.walkCount = 0 if not man.isJump:
if keys[pygame.K_UP]:
man.isJump = True
man.walkCount = 0
else:
if man.t >= -10:
a = 1
if man.t < 0:
a = -1
man.y -= 0.5 * a * (man.t ** 2) man.t -= 1
else:
man.isJump = False
man.t = 10 redraw_game_window() pygame.quit()
效果:
该出场的人物与道具都齐全了,下一节将讨论"碰撞检测"。
pygame 笔记-5 模块化&加入敌人的更多相关文章
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- pygame 笔记-10 摩擦力与屏幕环绕
多年前写过一篇 Flash/Flex学习笔记(25):摩擦力与屏幕环绕,可惜的当时上传的flash,服务器后来无人维护,现在flash链接都失效了.本篇用pygame重新实现了一个: 原理是类似,但要 ...
- pygame 笔记-7 生命值/血条处理
通常游戏中的角色都有所谓的生命值,而且头顶上会有一个血条显示.生命值无非就是一个属性而已,很容易在Player.py类中增加,头顶上的血条其实就是绘制二个矩形,叠加在一起. 以上节的Player.py ...
- javascript 学习笔记之模块化编程
题外: 进行web开发3年多了,javascript(后称js)用的也比较多,但是大部分都局限于函数的层次,有些公共的js函数可重用性不好,造成了程序的大量冗余,可读性差(虽然一直保留着注释的习惯,但 ...
- pygame 笔记-9 图片旋转及边界反弹
h5或flash中,可以直接对矢量对象,比如line, rectange旋转,但是pygame中,仅支持对image旋转,本以为这个是很简单的事情,但是发现还是有很多小猫腻的,记录一下: 先看一个错误 ...
- pygame 笔记-8 背景音乐&子弹音效
游戏哪能没有音效?这节我们研究下如何加背景音乐,其实也很简单: # 加载背景音乐 pygame.mixer.music.load(music_base_path + "music.mp3&q ...
- pygame 笔记-6 碰撞检测
这一节学习碰撞检测,先看原理图: 2个矩形如果发生碰撞(即:图形有重叠区域),按上图的判断条件就能检测出来,如果是圆形,则稍微变通一下,用半径检测.如果是其它不规则图形,大多数游戏中,并不要求精确检测 ...
- pygame 笔记-4 代码封装&发射子弹
继续之前的内容,随着游戏的内容越来越复杂,有必要把代码优化一下,可以参考OOP的做法,把人物类抽象出来,弄成一个单独的类,这们便于代码维护,同时我们给小人儿,加个发射子弹的功能,代码如下:(看上去略长 ...
- pygame 笔记-3 角色动画及背景的使用
上二节,已经知道如何控制基本的运动了,但是只有一个很单调的方块,不太美观,本节学习如何加载背景图,以及角色的动画. 素材准备:(原自github) 角色动画的原理:动画都是一帧帧渲染的,比如向左走的动 ...
随机推荐
- hdu2036
题解: 求多边形面积 分成很多块三角形求就可以了 凹的也是支持的 代码: #include <bits/stdc++.h> using namespace std; #define rin ...
- 【BZOJ2560】串珠子
题解: 跟n个点有标号的无向连通图个数几乎一模一样 直接上代码了 代码: #include <bits/stdc++.h> using namespace std; #define ll ...
- [转]Tor Browser在国内Windows平台下的超详细教程
https://cloudfra.com/tor-browser-windows.html 下载与安装 首先,你必须身处科学式网络(实在怕网站再出问题),接着就可以点击打开Tor Browser官网, ...
- [转]android sqlite db-journal文件产生原因及说明 .
http://blog.csdn.net/kaiwii/article/details/8609093 今天在android中将sqlite的数据库文件生成在SD卡上的过程中,发现生成的.db文件的旁 ...
- spark学习之路1--用IDEA编写第一个基于java的程序打包,放standalone集群,client和cluster模式上运行
1,首先确保hadoop和spark已经运行.(如果是基于yarn,hdfs的需要启动hadoop,否则hadoop不需要启动). 2.打开idea,创建maven工程.编辑pom.xml文件.增加d ...
- StringBuffer 可变参数拼接
@RequestMapping(value="/getFundsCount",method=RequestMethod.POST) public Result getFundsCo ...
- 使用PHPStorm 配置自定义的Apache与PHP环境
使用PHPStorm 配置自定义的Apache与PHP环境之一 关于phpstorm配置php开发环境,大多数资料都是直接推荐安装wapmserver.而对于如何配置自定义的PHP环境和Apach ...
- Windows10 下Apache服务器搭建
Windows10 下Apache服务器搭建 转 https://blog.csdn.net/sunqian666888/article/details/78561399 目录 一.软件下载 二. ...
- 大数据小白系列——HDFS(3)
这里是大数据小白系列,这是本系列的第三篇,介绍HDFS中NameNode选举,JournalNode等概念. 上一期我们说到了为解决NameNode(下称NN)单点失败问题,HDFS中使用了双NN的机 ...
- continue — Skip to the next iteration of a loop in a shell script
continue — Skip to the next iteration of a loop in a shell script