首页Python2.游戏开发之机制——屏幕...

2.游戏开发之机制——屏幕绘制机制

1、Pygame屏幕绘制机制简介:

屏幕绘制机制指游戏窗口跟屏幕相关的事情。

Pygame使用Pygame.display来控制屏幕。Pygame屏幕采用笛卡尔坐标系,左上角为(0,0),横方向为x轴,纵方向为y轴,屏幕的尺寸以像素为单位。

屏幕绘制的重要函数主要分为三部分:

1.屏幕尺寸和模式

函数说明
pygame.display.set_mode()设置相关屏幕模式
pygame.display.Info()生成屏幕相关信息

2.窗口标题和图标

函数说明
pygame.display.set_caption()设置标题信息
pygame.display.set_icon()设置图标信息
pygame.display.get_caption()获得图标

3.窗口感知和刷新

函数说明
pygame.display.get_active()刷新窗体
pygame.display.flip()刷新窗体
pygame.display.update()刷新窗体

2、Pygame屏幕尺寸和模式设置:

pygame.display.set_mode(r=(0,0),flags=0)

r——是游戏的分辨率,采用(width,height)方式输入;

flags——用来控制显示类型,可用|组合使用,常用显示标签如下:

pygame.RESIZABLE——窗口大小可调节;

pygame.NOFRAME——窗口没有边界显示;

pygame.FULLSCREEN——窗口全屏显示。

需注意的是:每种显示方式要配合相应的处理机制。

BLACK = 0, 0, 0
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
# screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")

设置屏幕可调节是,要有尺寸变化的相应机制(对扩张显示界面的刷新、对扩张/缩小显示界面的游戏相应),否则就会出现如下情况:

相应的,屏幕设置为无边框时要增加其他推出方式,屏幕设置为全屏时要考虑系统分辨率否则将会按照用户设定被拉伸。

# 产生一个现实信息对象VideoInfo,表达当前屏幕的参数信息,在set_mode()之前调用,则显示当前系统显示参数信息,参数很多,其中有两个十分重要,如下:
# current_w——当前显示模式或窗口的像素宽度;
# current_h——当前显示模式或窗口的像素高度。
pygame.display.Info()

实现壁球小游戏全屏型:

import pygame, sys

pygame.init()
# 获取当前系统的屏幕尺寸
vInfo = pygame.display.Info()
# 将我们预设的游戏的尺寸设置为Info()函数提供的当前系统的宽度和高度
size = width, height = vInfo.current_w, vInfo.current_h
speed = [1, 1]
BLACK = 0, 0, 0
# 将游戏的屏幕设置成全屏模式
screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1) * int(speed[0] / abs(speed[0]))
            elif event.key == pygame.K_RIGHT:
                speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
            elif event.key == pygame.K_UP:
                speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
            elif event.key == pygame.K_DOWN:
                speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1) * int(speed[1] / abs(speed[1]))
            # 在相应的敲击事件之后增加一个对ESC键的相应操作
            elif event.key == pygame.K_ESCAPE:
                SYS.exit()
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = - speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = - speed[1]

    screen.fill(BLACK)
    screen.blit(ball, ballrect)
    pygame.display.update()
    fclock.tick(fps)

运行代码,将得到一个全屏运行游戏的版本,通过按ESC键退出。

实现壁球小游戏伸缩型,使得游戏可以适应窗口大小的不同变化:

# 这是一个窗口大小更改的事件,事件发生后,返回event.size元祖,包含新窗口的宽度和高度
# .size[0]表示宽度,也可以用event.w
# .size[1]表示高度,也可以用event.h
# 返回参数仅在事件发生时有用
Pygame.VIDEORESIZE
import pygame, sys

pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
# 将游戏的屏幕设置成大小可调模式
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1) * int(speed[0] / abs(speed[0]))
            elif event.key == pygame.K_RIGHT:
                speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
            elif event.key == pygame.K_UP:
                speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
            elif event.key == pygame.K_DOWN:
                speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1) * int(speed[1] / abs(speed[1]))
        # 让程序相应VIDEORESIZE这个事件,并且依据事件更改窗体的大小
        elif event.type == pygame.VIDEORESIZE:
            size = width, height = event.size[0],event.size[1]
            screen = pygame.display.set_mode(size, pygame.RESIZABLE)
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = - speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = - speed[1]

    screen.fill(BLACK)
    screen.blit(ball, ballrect)
    pygame.display.update()
    fclock.tick(fps)

运行代码,调节窗口大小,游戏屏幕也会随之改变。

3、Pygame窗口标题和图标设置:

4、Pygame窗口感知和刷新运用:

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments