zoukankan      html  css  js  c++  java
  • 【2】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(屏幕绘制机制)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=androidShare&utm_source=qq

     

    备注:我开始在运行壁球游戏(全屏型)代码时,出现壁球超出屏幕范围外的问题,然后在 设置->显示 里,更改文本、应用和其他项目的大小,改为100%就正常了:)

    Pygame屏幕绘制机制

    1.Pygame屏幕绘制机制简介

    屏幕控制:
    pygame.display

    用来控制Pygame游戏的屏幕
    pygame有且只有一个屏幕
    屏幕左上角为(0,0)
    以像素为单位
    -----------------------------------------------
    屏幕控制需求:
    游戏全屏
    游戏屏幕大小可调节
    游戏屏幕无边框
    更改游戏标题栏内容
    更改游戏图标......
    -----------------------------------------------
    屏幕控制的重要函数:
    屏幕尺寸和模式:
    pygame.display.set_mode()
    pygame.display.Info()
    窗口标题和图标:
    pygame.display.set_caption()
    pygame.display.set_icon()
    pygame.display.get_caption()
    窗口感知和刷新:
    pygame.display.get_active()
    pygame.display.flip()
    pygame.display.update()
    -----------------------------------------------
    OpenGL和硬件加速:(略)
    pygame.display

    可以采用OpenGL支持显示
    可以采用硬件加速显示
    绘制加速将带来更流畅的运行效果

    ===================================================================================

    2.Pygame屏幕尺寸和模式设置

    屏幕模式函数:
    pygame.display.set_mode(r=(0,0),flags=0)

    r是游戏屏幕的分辨率,采用(width, height)方式输入
    flags用来控制显示类型,可用|组合使用,常用显示标签如下:
    pygame.RESIZABLE 窗口大小可调
    pygame.NOFRAME 窗口没有边界显示
    pygame.FULLSCREEN 窗口全屏显示
    注意:每种显示方式要配合相应的处理机制


    屏幕设置为大小可调:
    注意:大小可调时要有尺寸变化的响应
    对扩张显示界面的刷新
    对扩张/缩小显示界面的游戏响应

    屏幕设置为无边框:
    注意:无边框时要增加其他退出方式

    屏幕设置为全屏:
    注意:全屏时要考虑系统分辨率,否则将会按照用户设定被拉伸
    -------------------------------------------------------------
    屏幕信息函数:

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


    (1)壁球小游戏(全屏型)
    注意:采用系统分辨率进行全屏
    源代码:
     1 # 壁球小游戏(全屏型)
     2 import pygame,sys
     3  
     4 pygame.init()
     5 vInfo = pygame.display.Info()   #窗口全屏显示
     6 size = width, height = vInfo.current_w, vInfo.current_h
     7 speed = [1,1]
     8 BLACK = 0, 0, 0
     9 #print(pygame.display.Info())
    10 #screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
    11 #screen = pygame.display.set_mode(size, pygame.NOFRAME)  #窗口无边框
    12 screen = pygame.display.set_mode(size, pygame.FULLSCREEN)  #窗口全屏显示
    13  
    14 pygame.display.set_caption("Pygame壁球")
    15 ball = pygame.image.load("PYG02-ball.gif")
    16 ballrect = ball.get_rect()
    17 fps = 300
    18 fclock = pygame.time.Clock()
    19  
    20 while True:
    21     for event in pygame.event.get():
    22         if event.type == pygame.QUIT:
    23             sys.exit()
    24         elif event.type == pygame.KEYDOWN:
    25             if event.key == pygame.K_LEFT:
    26                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
    27             elif event.key == pygame.K_RIGHT:
    28                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
    29             elif event.key == pygame.K_UP:
    30                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
    31             elif event.key == pygame.K_DOWN:
    32                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
    33             elif event.key == pygame.K_ESCAPE:
    34                 sys.exit()
    35     ballrect = ballrect.move(speed)
    36     if ballrect.left < 0 or ballrect.right > 
    37         speed[0] = - speed[0]
    38     if ballrect.top < 0 or ballrect.bottom > height:
    39         speed[1] = - speed[1]
    40  
    41     screen.fill(BLACK)
    42     screen.blit(ball, ballrect)
    43     pygame.display.update()
    44     fclock.tick(fps)
    壁球小游戏(全屏型)


    (2)壁球小游戏(伸缩型)

    Pygame.VIDEORESIZE
    这是一种窗口大小更改的事件
    事件发生后,返回event.size元组,包含新窗口的宽度和高度
    .size[0]宽度,也可以用event.w
    .size[1]高度,也可以用event.h
    返回参数仅在事件发生时有用
    源代码:
     1 # 壁球小游戏(伸缩型)
     2 import pygame,sys
     3  
     4 pygame.init()
     5 size = width, height = 600, 400
     6 speed = [1,1]
     7 BLACK = 0, 0, 0
     8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
     9 #screen = pygame.display.set_mode(size, pygame.NOFRAME)  #窗口无边框
    10 #screen = pygame.display.set_mode(size, pygame.FULLSCREEN)  #窗口全屏显示
    11  
    12 pygame.display.set_caption("Pygame壁球")
    13 ball = pygame.image.load("PYG02-ball.gif")
    14 ballrect = ball.get_rect()
    15 fps = 300
    16 fclock = pygame.time.Clock()
    17  
    18 while True:
    19     for event in pygame.event.get():
    20         if event.type == pygame.QUIT:
    21             sys.exit()
    22         elif event.type == pygame.KEYDOWN:
    23             if event.key == pygame.K_LEFT:
    24                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
    25             elif event.key == pygame.K_RIGHT:
    26                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
    27             elif event.key == pygame.K_UP:
    28                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
    29             elif event.key == pygame.K_DOWN:
    30                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
    31             elif event.key == pygame.K_ESCAPE:
    32                 sys.exit()
    33         elif event.type == pygame.VIDEORESIZE:
    34             size = width, height = event.size[0], event.size[1]
    35             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
    36     ballrect = ballrect.move(speed)
    37     if ballrect.left < 0 or ballrect.right > 
    38         speed[0] = - speed[0]
    39     if ballrect.top < 0 or ballrect.bottom > height:
    40         speed[1] = - speed[1]
    41  
    42     screen.fill(BLACK)
    43     screen.blit(ball, ballrect)
    44     pygame.display.update()
    45     fclock.tick(fps)
    壁球小游戏(伸缩型)

    ===================================================================================

    3.Pygame窗口标题和图标设置

    pygame.display.set_caption(title, icontitle=None)
    title设置窗口的标题内容
    icontitle设置图表化后的小标题
    小标题可选,部分系统没有


    pygame.display.get_caption()
    返回当前设置窗口的标题及小标题内容
    返回结构为(title,icontitle)
    该函数与游戏交互逻辑配合,可以根据游戏情节修改标题内容


    pygame.display.set_icon(surface)
    设置窗口的图标效果
    图标是一个Surface对象
    在下述链接中下载图标图片:
    https://python123.io/PY15/PYG03-flower.png
    https://python123.io/PY15/PYG03-withered-flower.png

    源代码:
     1 # 壁球小游戏(图标型)
     2 import pygame,sys
     3  
     4 pygame.init()
     5 size = width, height = 600, 400
     6 speed = [1,1]
     7 BLACK = 0, 0, 0
     8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
     9  
    10 icon = pygame.image.load("PYG03-flower.png")
    11 pygame.display.set_icon(icon)
    12 pygame.display.set_caption("Pygame壁球")
    13 ball = pygame.image.load("PYG02-ball.gif")
    14 ballrect = ball.get_rect()
    15 fps = 300
    16 fclock = pygame.time.Clock()
    17  
    18 while True:
    19     for event in pygame.event.get():
    20         if event.type == pygame.QUIT:
    21             sys.exit()
    22         elif event.type == pygame.KEYDOWN:
    23             if event.key == pygame.K_LEFT:
    24                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
    25             elif event.key == pygame.K_RIGHT:
    26                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
    27             elif event.key == pygame.K_UP:
    28                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
    29             elif event.key == pygame.K_DOWN:
    30                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
    31             elif event.key == pygame.K_ESCAPE:
    32                 sys.exit()
    33         elif event.type == pygame.VIDEORESIZE:
    34             size = width, height = event.size[0], event.size[1]
    35             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
    36     ballrect = ballrect.move(speed)
    37     if ballrect.left < 0 or ballrect.right > 
    38         speed[0] = - speed[0]
    39     if ballrect.top < 0 or ballrect.bottom > height:
    40         speed[1] = - speed[1]
    41  
    42     screen.fill(BLACK)
    43     screen.blit(ball, ballrect)
    44     pygame.display.update()
    45     fclock.tick(fps)
    壁球小游戏(图标型)

    ===================================================================================

    4.Pygame窗口感知和刷新运用

    屏幕控制的重要函数:

    pygame.display.get_active()
    当窗口在系统中显示(屏幕绘制/非图标化)时返回True,否则返回False
    该函数可以用来判断是否游戏窗口被最小化
    进一步,判断后可以暂停游戏,改变响应模式等

    pygame.display.flip()
    重新绘制整个窗口

    pygame.display.update()
    仅重新绘制窗口中有变化的区域,相比.flip()执行更快


    源代码:
     1 # 壁球小游戏(感知型)
     2 import pygame,sys
     3  
     4 pygame.init()
     5 size = width, height = 600, 400
     6 speed = [1,1]
     7 BLACK = 0, 0, 0
     8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
     9  
    10 icon = pygame.image.load("PYG03-flower.png")
    11 pygame.display.set_icon(icon)
    12 pygame.display.set_caption("Pygame壁球")
    13 ball = pygame.image.load("PYG02-ball.gif")
    14 ballrect = ball.get_rect()
    15 fps = 300
    16 fclock = pygame.time.Clock()
    17  
    18 while True:
    19     for event in pygame.event.get():
    20         if event.type == pygame.QUIT:
    21             sys.exit()
    22         elif event.type == pygame.KEYDOWN:
    23             if event.key == pygame.K_LEFT:
    24                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
    25             elif event.key == pygame.K_RIGHT:
    26                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
    27             elif event.key == pygame.K_UP:
    28                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
    29             elif event.key == pygame.K_DOWN:
    30                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
    31             elif event.key == pygame.K_ESCAPE:
    32                 sys.exit()
    33         elif event.type == pygame.VIDEORESIZE:
    34             size = width, height = event.size[0], event.size[1]
    35             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
    36     if pygame.display.get_active():
    37         ballrect = ballrect.move(speed)
    38     if ballrect.left < 0 or ballrect.right > 
    39         speed[0] = - speed[0]
    40     if ballrect.top < 0 or ballrect.bottom > height:
    41         speed[1] = - speed[1]
    42  
    43     screen.fill(BLACK)
    44     screen.blit(ball, ballrect)
    45     pygame.display.update()
    46     fclock.tick(fps)
    壁球小游戏(感知型)
    
    
    


     
  • 相关阅读:
    一周试用yii开发一个带各种该有功能的web程序(三)
    制作centos的U盘启动盘
    VMware下centos6.3minimal搭建网络环境
    [原]SQLite的学习系列之获取数据库版本
    Android Studio NDK 学习之接受Java传入的字符串
    [原]Ubuntu 14.04编译Android Kernel
    [原]运行编译好的Android模拟器
    [原]编译Android源码过程中遇到的问题
    [原]Android打包之Gradle打包
    [原]Android打包之跨平台打包
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/8005028.html
Copyright © 2011-2022 走看看