python 3.x--pygame&numpy

坚持,不是说,不能有中断,而是现在仍在做

正在学习一些数据分析有关的统计学及相关库知识,以为需要有点储备知识才能更好的应用,所以下周继续学习,然后实践

本周尝试pygame游戏编程,有些思路和之前tkinter类似,pygame、tkinter都是Python最常用的游戏编程

一、安装pygame

1、介绍
pygame基于SDL(Simple DirectMedia Layer,建议直控媒体层)。SDL是一套C语言架构,可用于多种包括win、linux、mac OS X操作系统,可访问图形、声音、键盘及其他输入设备实现游戏

2、下载安装

根据操作系统,选择pygame安装方式

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章