群星,Python基础教程:Day10-图形用户界面和游戏开发-优德88手机版

admin3个月前282浏览量

Python基础教程:图形用户界面和游戏开发

根据tkinter模块的GUI

GUI是图形用户界面的缩写,图形化的用户界面临运用过计算机的人来说应该都不生疏,在此也无需进行赘述。Python默许的GUI开发模块是tkinter(在Python 3曾经的版别中名为Tkinter),从这个姓名就能够看出它是根据Tk的,Tk是一个工具包,开端是为Tcl规划的,后来被移植到许多其他的脚本言语中,它供给了跨渠道的GUI控件。当然Tk并不是最新和最好的挑选,也没有功用特别强壮的GUI控件,事实上,开发GUI运用并不是Python最拿手的作业,假如真的需求运用Python开发GUI运用,wxPython、PyQt、PyGTK等模块都是不错的挑选。

基本上运用tkinter来开发GUI运用需求以下5个过程:

  1. 导入tkinter模块中咱们需求的东西。
  2. 创立一个顶层窗口目标并用它来承载整个GUI运用。
  3. 在顶层窗口目标上增加GUI组件。
  4. 经过代码将这些GUI组件的功用组织起来。
  5. 进入主事情循环(main loop)。

下面的代码演示了怎么运用tkinter做一个简略的GUI运用。

import tkinter
import tkinter.messagebox
def main():
flag = True
# 修正标签上的文字
def change_label_text():
nonlocal flag
flag = not flag
color, msg = ('red', 'Hello, world!')\
if flag else ('blue', 'Goodbye, world!')
label.config(text=msg, fg=color)
# 承认退出
def confirm_to_quit():
if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
top.quit()
# 创立顶层窗口
top = tkinter.Tk()
# 设置窗口巨细
top.geometry('240x160')
# 设置窗口标题
top.title('小游戏')
# 创立标签目标并增加到顶层窗口
label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
label.pack(expand=1)
# 创立一个装按钮的容器
panel = tkinter.Frame(top)
# 创立按钮目标 指定增加到哪个容器中 经过command参数绑定事情回调函数
button1 = tkinter.Button(panel, text='修正', command=change_label_text)
button1.pack(side='left')
button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
button2.pack(side='right')
panel.pack(side='bottom')
# 敞开主事情循环
tkinter.mainloop()
if __name__ == '__main__':
main()

需求阐明的是,GUI运用一般是事情驱动式的,之所以要进入主事情循环便是要监听鼠标、键盘等各种事情的发作并履行对应的代码对事情进行处理,由于事情会继续的发作,所以需求这样的一个循环一向运转着等候下一个事情的发作。另一方面,Tk为控件的摆放供给了三种布局管理器,经过布局管理器能够对控件进行定位,这三种布局管理器分别是:Placer(开发者供给控件的巨细和摆放方位)、Packer(主动将控件填充到适宜的方位)和Grid(根据网格坐标来摆放控件),此处不进行赘述。

运用Pygame进行游戏开发

Pygame是一个开源的Python模块,专门用于多媒体运用(如电子游戏)的开发,其间包含对图画、声响、视频、事情、磕碰等的支撑。Pygame建立在SDL的基础上,SDL是一套跨渠道的多媒体开发库,用C言语完结,被广泛的运用于游戏、模拟器、播映器等的开发。而Pygame让游戏开发者不再被底层言语捆绑,能够更多的重视游戏的功用和逻辑。

下面咱们来完结一个简略的小游戏,游戏的姓名叫“大球吃小球”,当然完结这个游戏并不是要点,学会运用Pygame也不是要点,最重要的咱们要在这个过程中领会怎么运用前面解说的面向目标程序规划,学会用这种编程思想去处理实际中的问题。

制造游戏窗口

import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显现的窗口并设置窗口尺度
screen = pygame.display.set_mode((800, 600))
# 设置当时窗口的标题
pygame.display.set_caption('大球吃小球')
running = True
# 敞开一个事情循环处理发作的事情
while running:
# 从音讯行列中获取事情并对事情进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()

在窗口中绘图

能够经过pygame中draw模块的函数在窗口上绘图,能够制作的图形包含:线条、矩形、多边形、圆、椭圆、圆弧等。需求阐明的是,屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0),向右是x轴的正向,向下是y轴的正向,在表明方位或许设置尺度的时分,咱们默许的单位都是像素。所谓像素便是屏幕上的一个点,你能够用阅读图片的软件试着将一张图片扩大若干倍,就能够看到这些点。pygame中表明色彩用的是色光三原色表明法,即经过一个元组或列表来指定色彩的RGB值,每个值都在0~255之间,由于是每种原色都用一个8位(bit)的值来表明,三种色彩相当于总共由24位构成,这也便是常说的“24位色彩表明法”。

import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显现的窗口并设置窗口尺度
screen = pygame.display.set_mode((800, 600))
# 设置当时窗口的标题
pygame.display.set_caption('大球吃小球')
# 设置窗口的背景色(色彩是由红绿蓝三原色构成的元组)
screen.fill((242, 242, 242))
# 制作一个圆(参数分别是: 屏幕, 色彩, 圆心方位, 半径, 0表明填充圆)
pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
# 改写当时窗口(烘托窗口将制作的图画呈现出来)
pygame.display.flip()
running = True
# 敞开一个事情循环处理发作的事情
while running:
# 从音讯行列中获取事情并对事情进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()

加载图画

假如需求直接加载图画到窗口上,能够运用pygame中image模块的函数来加载图画,再经过之前取得的窗口目标的blit办法烘托图画,代码如下所示。

import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显现的窗口并设置窗口尺度
screen = pygame.display.set_mode((800, 600))
# 设置当时窗口的标题
pygame.display.set_caption('大球吃小球')
# 设置窗口的背景色(色彩是由红绿蓝三原色构成的元组)
screen.fill((255, 255, 255))
# 经过指定的文件名加载图画
ball_image = pygame.image.load('./res/ball.png')
# 在窗口上烘托图画
screen.blit(ball_image, (50, 50))
# 改写当时窗口(烘托窗口将制作的图画呈现出来)
pygame.display.flip()
running = True
# 敞开一个事情循环处理发作的事情
while running:
# 从音讯行列中获取事情并对事情进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()

完结动画作用

提到动画这个词咱们都不会生疏,事实上要完结动画作用,自身的原理也十分简略,便是将不接连的图片接连的播映,只需每秒钟达到了必定的帧数,那么就能够做出比较流通的动画作用。假如要让上面代码中的小球动起来,能够将小球的方位用变量来表明,并在循环中修正小球的方位再改写整个窗口即可。

import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显现的窗口并设置窗口尺度
screen = pygame.display.set_mode((800, 600))
# 设置当时窗口的标题
pygame.display.set_caption('大球吃小球')
# 界说变量来表明小球在屏幕上的方位
x, y = 50, 50
running = True
# 敞开一个事情循环处理发作的事情
while running:
# 从音讯行列中获取事情并对事情进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((255, 255, 255))
pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)
pygame.display.flip()
# 每隔50毫秒就改动小球的方位再改写窗口
pygame.time.delay(50)
x, y = x + 5, y + 5
if __name__ == '__main__':
main()

磕碰检测

一般一个游戏中会有许多目标呈现,而这些目标之间的“磕碰”在所难免,比方炮弹击中了飞机、箱子撞到了地上等。磕碰检测在绝大多数的游戏中都是一个必须得处理的至关重要的问题,pygame的sprite(动画精灵)模块就供给了对磕碰检测的支撑,这儿咱们暂时不介绍sprite模块供给的功用,由于要检测两个小球有没有磕碰其实十分简略,只需求查看球心的间隔有没有小于两个球的半径之和。为了制造出更多的小球,咱们能够经过对鼠标事情的处理,在点击鼠标的方位创立色彩、巨细和移动速度都随机的小球,当然要做到这一点,咱们能够把之前学习到的面向目标的常识运用起来。

from enum import Enum, unique
from math import sqrt
from random import randint
import pygame
@unique
class Color(Enum):
"""色彩"""
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (242, 242, 242)
@staticmethod
def random_color():
"""取得随机色彩"""
r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
return (r, g, b)
class Ball(object):
"""球"""
def __init__(self, x, y, radius, sx, sy, color=Color.RED):
"""初始化办法"""
self.x = x
self.y = y
self.radius = radius
self.sx = sx
self.sy = sy
self.color = color
self.alive = True
def move(self, screen):
"""移动"""
self.x += self.sx
self.y += self.sy
if self.x - self.radius <= 0 or \
self.x + self.radius >= screen.get_width():
self.sx = -self.sx
if self.y - self.radius <= 0 or \
self.y + self.radius >= screen.get_height():
self.sy = -self.sy
def eat(self, other):
"""吃其他球"""
if self.alive and other.alive and self != other:
dx, dy = self.x - other.x, self.y - other.y
distance = sqrt(dx ** 2 + dy ** 2)
if distance < self.radius + other.radius \
and self.radius > other.radius:
other.alive = False
a self.radius = self.radius + int(other.radius * 0.146)
def draw(self, screen):
"""在窗口上制作球"""
pygame.draw.circle(screen, self.color,
(self.x, self.y), self.radius, 0)

事情处理

能够在事情循环中对鼠标事情进行处理,经过事情目标的type特点能够断定事情类型,再经过pos特点就能够取得鼠标点击的方位。假如要处理键盘事情也是在这个当地,做法与处理鼠标事情相似。

def main():
# 界说用来装一切球的容器
balls = []
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显现的窗口并设置窗口尺度
screen = pygame.display.set_mode((800, 600))
# 设置当时窗口的标题
pygame.display.set_caption('大球吃小球')
running = True
# 敞开一个事情循环处理发作的事情
while running:
# 从音讯行列中获取事情并对事情进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 处理鼠标事情的代码
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
# 取得点击鼠标的方位
x, y = event.pos
radius = randint(10, 100)
sx, sy = randint(-10, 10), randint(-10, 10)
color = Color.random_color()
# 在点击鼠标的方位创立一个球(巨细、速度和色彩随机)
ball = Ball(x, y, radius, sx, sy, color)
# 将球增加到列表容器中
balls.append(ball)
screen.fill((255, 255, 255))
# 取出容器中的球 假如没被吃掉就制作 被吃掉了就移除
for ball in balls:
if ball.alive:
ball.draw(screen)
else:
balls.remove(ball)
pygame.display.flip()
# 每隔50毫秒就改动球的方位再改写窗口
pygame.time.delay(50)
for ball in balls:
ball.move(screen)
# 查看球有没有吃到其他的球
for other in balls:
ball.eat(other)
if __name__ == '__main__':
main()

上面的两段代码合在一起,咱们就完结了“大球吃小球”的游戏(如下图所示),精确的说它算不上一个游戏,可是做一个小游戏的基本常识咱们现现已过这个比方通知咱们了,有了这些常识现已能够开端你的小游戏开发之旅了。其实上面的代码中还有许多值得改善的当地,比方改写窗口以及让球移动起来的代码并不应该放在事情循环中,等学习了多线程的常识后,用一个后台线程来处理这些事可能是更好的挑选。假如期望取得更好的用户体会,咱们还能够在游戏中参加背景音乐以及在球与球发作磕碰时播映音效,使用pygame的mixer和music模块,咱们能够很简单的做到这一点,咱们能够自行了解这方面的常识。事实上,想了解更多的关于pygame的常识,最好的教程是pygame的官方网站,假如英语没缺点就能够赶忙去看看啦。 假如想开发3D游戏,pygame就显得无能为力了,对3D游戏开发假如有爱好的读者无妨看看Panda3D。

最新评论