用pygame来制作你心中的那个游戏~可以进你的收藏夹吗
第一章 pygame基础使用操作
第二章 pygame创建人物显示(待更新)
pygame基础使用操作
- 用pygame来制作你心中的那个游戏~可以进你的收藏夹吗
- pygame基础使用操作
- 一、死亡使者
- 二、如何用pygame显示窗口
- 使用到的库
- 显示窗口
- 显示
- 事件
- 三、代码升级成面向对象
- 面向对象的一些小思路
- 总结
pygame基础使用操作
有没有人像我一样学习编程就是为了去制作游戏,c++是游戏行业的主流发展,但是pygame却有着语法简单,逻辑简单的原因,适合做2d游戏开发,游戏的好坏与使用编写游戏的编程语言没有关系,我也只是想完成很久以前,一直想做的事情。
一、死亡使者
做了GIF的效果图,好像不是很好,唔~,见谅,见谅
总之要使用pygame实现死亡使者的攻击,移动,复活,静态动作等等,算是完成了主角的登场~~~~
什么敌人怎么办,那我去拿ps改一下颜色
二、如何用pygame显示窗口
pygame官方文档
最头疼的事情就是官方文档英文看不懂,翻译给我连代码一起翻译了
使用到的库
import pygame
from sys import exit
from pygame.locals import *
1.pygame是最主要的库。
2.pygame.locals 里面包括了pygame里面的一些定义,但是为了大家对于代码的理解,不打算使用这个库。
3.退出程序会使用到sys模块的退出函数,也可以直接exit退出。
显示窗口
pygame只需要简单几句代码就可以完成窗口的显示与事件的监听。
代码如下:
import pygame
import sys
pygame.display.init()
screen = pygame.display.set_mode([520, 520])
pygame.display.set_caption("死亡使者")
while True:
screen.fill(pygame.Color(255,255,255))
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()
这里会用到pygame的display方法,emmm,显示函数,主要作用那肯定就是显示窗口啦,已经不用我多说了吧。
显示
- 使用display需要对display进行初始化也就是pygame.display.init(),
- 要显示出一个窗口,肯定要先创建窗口对象 screen = pygame.display.set_mode([520, 520]),记住传进去的参数是数组,返回的是窗口对象,以后进行的所有操作,都围绕screen进行。
- pygame.display.set_caption(“死亡使者”),用来设置窗口名
pygame游戏实现原理就是通过对鼠标,键盘事件的处理,进行创建图片和图片的移动,这个过程肯定需要不断的刷新屏幕,也就是while True循环
- 设置好的screen目前先给他填充一个白色,screen.fill(pygame.Color(255,255,255)),创建一个pygame可以使用的颜色对象就需要使用pygame.Color这个类传进去的参数是rgb颜色体系
- pygame.display.updata()用来实现游戏的不断刷新,一般写在末尾。
事件
可以看到通过pygame.event.get()获取所有的事件,其中当然包括了,鼠标的移动,鼠标键是否按下,键盘的每个按键,如果不进行事件处理,会导致无法退出,没有任何操作性。
获取到的事件通过for循环遍历,当event的类型为退出的时候,关闭程序
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
三、代码升级成面向对象
代码如下(示例):
import pygame
class PlayGame:
def __init__(self):
pygame.display.init()
self.screen = pygame.display.set_mode([800, 520])
self.clock = pygame.time.Clock()
pygame.display.set_caption("死亡使者")
self.map = pygame.image.load("./images/map/001map.png").convert()
def star_game(self):
while True:
self.clock.tick(60)
self.screen.blit(self.map, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
pygame.display.update()
if __name__ == '__main__':
PlayGame().star_game()
if name == ‘main’: 这串代码是不是写起来很麻烦,这里悄悄告诉你们,敲main然后回车就可以了。相当于一个主程序的人口,然后只用创建主类就可以啦!
-
python 执行while Ture的速度是很快的,我们常常用不到这么快的速度,所以可以通过self.clock = pygame.time.Clock()去创建一个时钟对象,然后在whileTure 循环第一句调用self.clock.tick(60)代码,相当于time.sleep(),那为什么不用time.sleep(),还不是这该死的优越感~~~~
-
面向对象总是不理解怎么办,写几个pygame小游戏,包你透彻!!那从这里开始就要用面向对象的思路去理解代码了。
-
self.screen.blit(self.map, (0, 0))将图片贴到窗口
-
悄悄的贴了一张背景,这样就不用写screen.fill()函数了
创建地图对象: self.map=pygame.image.load("./images/map/001map.png").convert()
在循环里面显示地图对象:坐标当然是图片左上角的位置
self.screen.blit(self.map, (0, 0))
面向对象的一些小思路
代码如下:
import pygame
class PlayGame:
screen = None
def __init__(self):
pygame.display.init()
PlayGame.screen = pygame.display.set_mode([800, 520])
self.clock = pygame.time.Clock()
pygame.display.set_caption("死亡使者")
self.map = pygame.image.load("./images/map/001map.png").convert()
def star_game(self):
while True:
self.clock.tick(60)
PlayGame.screen.blit(self.map, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
pygame.display.update()
if __name__ == '__main__':
PlayGame().star_game()
- 这里将窗口的对象screen由实例属性转换成类属性,好处当然是更容易调用,这样子想的话,后期多了人物等等重要的对象,都可以设置成类属性,这样子可以增加代码的可读性,当然不要想我一样,懒得写注释,注释的作用也是很重要的,只是当你熟练了这些基础的操作,像默写课文一样可以写出来的时候,注释可以省略了
- 如果再往大了考虑,总会出现,需要的数据需要各种传参来实现,为何不能未雨绸缪,将所有使用的数据放到data.py里面呢
主函数代码如下:
import pygame
from data import *
class PlayGame:
def __init__(self):
pygame.display.init()
Screen.screen = pygame.display.set_mode([Screen.ScreenWeight, Screen.ScreenHeight])
Screen.clock = pygame.time.Clock()
Map.map = pygame.image.load("./images/map/001map.png").convert()
pygame.display.set_caption("死亡使者")
@staticmethod
def star_game():
while True:
Screen.clock.tick(60)
Screen.screen.blit(Map.map, Map.Map_pos)
EventGet.event_list = pygame.event.get()
EventGet.mouse = pygame.mouse.get_pos()
for event in EventGet.event_list:
if event.type == pygame.QUIT:
pygame.quit()
exit()
pygame.display.update()
if __name__ == '__main__':
PlayGame().star_game()
- @staticmethod将实例方法转换成类方法,这样就不会报黄了
- pygame.mouse.get_pos()获取鼠标的位置赋值给data中EventGet.mouse
- pygame.quit()关闭pygame
data.py代码如下:
class Screen:
ScreenWeight = 800
ScreenHeight = 520
clock = None
screen = None
class Map:
map = None
Map_pos = (0, 0)
class EventGet:
event_list = None
mouse = None
- 保存了鼠标移动的坐标,键盘的按键操作等事件,保存窗口对象,大小以及图片对象,位置。
总结
很多想法都是自己编写游戏的时候,遇到的bug,写代码就像是建房子一样,前期考虑的多一点,也就可以走的更远吧,将一些公共资源保存到py文件的变量中,方便调用。很多是自己的想法,参考即可,毕竟,我也只是个小萌新
代码暂时没有写好,也就不发了,游戏的玩法以及操作希望得到大家的建议。~~~~ 持续秃头中 ~~~~
所有图片链接
提取码:57mk