坚持,不是说,不能有中断,而是现在仍在做
正在学习一些数据分析有关的统计学及相关库知识,以为需要有点储备知识才能更好的应用,所以下周继续学习,然后实践
本周尝试pygame游戏编程,有些思路和之前tkinter类似,pygame、tkinter都是Python最常用的游戏编程
一、安装pygame
1、介绍
pygame基于SDL(Simple DirectMedia Layer,建议直控媒体层)。SDL是一套C语言架构,可用于多种包括win、linux、mac OS X操作系统,可访问图形、声音、键盘及其他输入设备实现游戏
2、下载安装
根据操作系统,选择pygame安装方式
- linux,可在Debian软件库中找到相应版本
https://packages.qa.debian.org/p/pygame.html - Windows 可以根据Python版本,从pygame官网上下载合适的安装包
http://www.pygame.org/download.shtml - mac也可以选择在官网上下载安装 http://www.pygame.org/download.shtml
3、Anaconda 安装
我使用的是Anaconda,直接终端安装,很方便
直接在终端输入
pip install pygame
可完成安装
二、简单实践
1、怎么少得了 hello world
#导入模块、常用的函数和常量
import pygame,sys
from pygame.locals import *
#初始化pygame,为使用硬件做准备
pygame.init()
#创建一个500*500的窗口
screen = pygame.display.set_mode((500,500))
#设置窗口标题
pygame.display.set_caption("Hello world")
#游戏主循环
while True:
sysFont = pygame.font.SysFont("None",19)
rendered = sysFont.render('hello world',0,(255,100,100))
screen.blit(rendered,(100,100))
for event in pygame.event.get():
#接收到退出事件则退出程序
if event.type ==QUIT:
pygame.quit()
sys.exit()
#刷新画面
pygame.display.update()
结果
三、动画
使用numpy 制作动画对象
1、创建pygame的clock对象
clock = pygame.time.Clock()
说明:函数pygame.time.Clock()可以创建一个游戏中的时钟对象
2、载入图像,图片地址也可用绝对路径表示,注意目录与目录间使用双斜杠\
img = pygame.image.load('2.jpg')
3、定义一些数组储存动画中的图片位置座标,让对象在上下左右方向进行移动,产生动画效果,每一个方向上有40个等距步长,上下左右的值全部初始化为零
steps = np.linspace(20,360,40).astype(int)
right = np.zeros((2,len(steps)))
down = np.zeros((2,len(steps)))
left = np.zeros((2,len(steps)))
up = np.zeros((2,len(steps)))
4、设置图片的位置座标,[::-1]可获得倒序的数组元素
right[0] = steps
right[1] = 20
down[0] = 360
down[1] =steps
left[0] = steps[::-1]
left[1] = 360
up[0] = 20
up[1] = steps[::-1]
5、将四个方向的路径连接起来,动画产生连贯,需要使用T对数组进行转置,使得四个方向以正确的方式对齐
pos = np.concatenate((right.T,down.T,left.T,up.T))
6、实现:
7、完整代码
#numpy制作动画
import pygame,sys
from pygame.locals import *
import numpy as np
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption("play numpy")
img = pygame.image.load('2.jpg')
steps = np.linspace(20,360,40).astype(int)
right = np.zeros((2,len(steps)))
down = np.zeros((2,len(steps)))
left = np.zeros((2,len(steps)))
up = np.zeros((2,len(steps)))
right[0] = steps
right[1] = 20
down[0] = 360
down[1] =steps
left[0] = steps[::-1]
left[1] = 360
up[0] = 20
up[1] = steps[::-1]
pos = np.concatenate((right.T,down.T,left.T,up.T))
i = 0
#游戏主循环
while True:
#清屏
screen.fill((255,255,255))
if i >= len(pos):
i = 0
screen.blit(img, pos[i])
i += 1
for event in pygame.event.get():
#接收到退出事件则退出程序
if event.type ==QUIT:
pygame.quit()
sys.exit()
#刷新画面
pygame.display.update()
#函数设置时钟周期,30帧/s
clock.tick(30)
四、pygame与tkinter
1、Tkinter
主要是进行GUI的绘制,画面绘制要通过创建窗口,Tk.canvas进行绘图,另外,tk窗口只能载入动图
其中tkinter的主循环比较简单,不过显示画面需要再通过mainloop主循环,让窗口进入事件循环,即如果不执行mainloop循环,Tkinter窗口会关闭
相比pygame,tkinter中必不可少mainloop函数,mainloop循环主要功能即:让窗口进入事件处理的循环和Tkinter窗口生命周期的控制
2、pygame
pygame的主循环比较有意思,它的事件处理主要通过事件队列进行事件处理
下面是第一个helloworld的主循环,while整体是一个死循环,在死循环中通过update函数进行不断的跟新画面,并且在获取事件时,通过for循环遍历事件队列,这里使用了get函数,除此之外还有wait函数,wait会有等待时间,有卡顿,二者具体区分还不太清楚
因此,pygame显示画面主要通过while死循环进行进行画面更新与事件处理
#游戏主循环
while True:
sysFont = pygame.font.SysFont("None",19)
rendered = sysFont.render('hello world',0,(255,100,100))
screen.blit(rendered,(100,100))
for event in pygame.event.get():
#接收到退出事件则退出程序
if event.type ==QUIT:
pygame.quit()
sys.exit()
#刷新画面
pygame.display.update()