本文中的程序来源于《Beginning Game Development with Python and Pygame》一书第72页,注释部分为PosPro原创(PosPro正在尝试通过直接通过在Python代码中增加注释来完成程序分析和进行教学)。
本程序的目标是:建立一个窗口,通过键盘上的方向键改变背景图位置。
以下为书中给出的代码,运行后可以通过键盘方向键调整背景图片位置,按一次调整一次,多次按同一个方向键,最终可以把背景图移出窗口范围。然而PosPro认为,作者本意并非如此,因为若仅仅要实现此功能的话,无需监控KEYUP事件。
(PS: 如果完全删除KEYUP部分的话,move_x无法归零,由于x还是会累积之前的move_x结果,而且是在每次执行while循环之后都累加,所以只需要点一下某一个方向键,背景图就会如同冰场上的冰块一样,唰地划出去,效果也很炫)
#-*- coding=utf-8 -*-
# 若无上句,即便是在注释中有中文,也会报错,且这一句必须放在第一句!!
#本程序来源于《Beginning Game Development with Python and Pygame》 P72
#注释 by PosPro
#### 程序目标:####
#建立一个窗口,通过键盘上的方向键可以改变背景图位置
#
#### 程序框架:####
#1 引入所需模块
#2 初始化
#3 一个循环构成程序核心
### 代码重复部分未做详细注释,详情可参考前一篇博客
#1 引入所需模块
import pygame
from pygame.locals import *
from sys import exit
#2 初始化
pygame.init()
SCREEN_SIZE=(640,480)
screen=pygame.display.set_mode(SCREEN_SIZE,0,32)
background_image_filename='sushiplate.jpg'
backgrd = pygame.image.load(background_image_filename).convert()
x,y=0,0
move_x, move_y=0,0
#3 一个循环构成程序核心
while True:
for event in pygame.event.get():
if event.type==QUIT:
exit()
#若按下的是方向键,则根据具体方向将背景图位移一个像素
if event.type==KEYDOWN:
if event.key==K_LEFT:
move_x=-1
elif event.key==K_RIGHT:
move_x=+1
elif event.key==K_UP:
move_y=-1
elif event.key==K_DOWN:
move_y=+1
#Pospro认为,作者的本意是:在按键弹起后,背景图复位,但其实并未达到此效果
elif event.type==KEYUP:
if event.key==K_LEFT:
move_x=0
elif event.key==K_RIGHT:
move_x=0
elif event.key==K_UP:
move_y=0
elif event.key==K_DOWN:
move_y=0
x+=move_x
y+=move_y
###由于x的值是累加的(因为move_x只有0,1两种可能),所以连续按向上键之后
###背景图会最终完全离开窗口!!!
###PosPro认为,这恐怕不是作者想要的效果,因为这样的话KEYUP部分就失去了意义
screen.fill((0,0,0))
screen.blit(backgrd,(x,y))
pygame.display.update()
第二部分代码为PosPro调整后的——运行后的效果是:放开方向键,背景图就回到原位的效果(橡皮筋效果)
import pygame
from pygame.locals import *
from sys import exit
#2 初始化
pygame.init()
SCREEN_SIZE=(640,480)
screen=pygame.display.set_mode(SCREEN_SIZE,0,32)
background_image_filename='sushiplate.jpg'
backgrd = pygame.image.load(background_image_filename).convert()
x,y=0,0
move_x, move_y=0,0
SLIDE_VAL=10 ##稍微增加一些偏移量以便使效果更明显
#3 一个循环构成程序核心
while True:
x,y=0,0
##增加了上面这一句,便可以产生放开方向键,背景图就回到原位的效果(橡皮筋效果)
for event in pygame.event.get():
if event.type==QUIT:
exit()
#若按下的是方向键,则根据具体方向将背景图位移SLIDE_VAL个像素
if event.type==KEYDOWN:
if event.key==K_LEFT:
move_x=-SLIDE_VAL
elif event.key==K_RIGHT:
move_x=+SLIDE_VAL
elif event.key==K_UP:
move_y=-SLIDE_VAL
elif event.key==K_DOWN:
move_y=+SLIDE_VAL
elif event.type==KEYUP:
if event.key==K_LEFT:
move_x=0
elif event.key==K_RIGHT:
move_x=0
elif event.key==K_UP:
move_y=0
elif event.key==K_DOWN:
move_y=0
x+=move_x
y+=move_y
screen.fill((0,0,0))
screen.blit(backgrd,(x,y))
pygame.display.update()
第三部分代码是对第二部分的优化:因为我们可以发现move_x, move_y这个变量完全可以省略。
#-*- coding=utf-8 -*-
# 若无上句,即便是在注释中有中文,也会报错,且这一句必须放在第一句!!
#本程序来源于《Beginning Game Development with Python and Pygame》 P72
#注释 by PosPro
#### 程序目标:####
#建立一个窗口,通过键盘上的方向键可以改变背景图位置
#
#### 程序框架:####
#1 引入所需模块
#2 初始化
#3 一个循环构成程序核心
### 代码重复部分未做详细注释,详情可参考前一篇博客
#1 引入所需模块
import pygame
from pygame.locals import *
from sys import exit
#2 初始化
pygame.init()
SCREEN_SIZE=(640,480)
screen=pygame.display.set_mode(SCREEN_SIZE,0,32)
background_image_filename='sushiplate.jpg'
backgrd = pygame.image.load(background_image_filename).convert()
x,y=0,0
SLIDE_VAL=10 ##稍微增加一些偏移量以便使效果更明显
#3 一个循环构成程序核心
while True:
##增加了上面这一句,便可以产生放开方向键,背景图就回到原位的效果(橡皮筋效果)
for event in pygame.event.get():
if event.type==QUIT:
exit()
#若按下的是方向键,则根据具体方向将背景图位移SLIDE_VAL个像素
if event.type==KEYDOWN:
if event.key==K_LEFT:
x=-SLIDE_VAL
elif event.key==K_RIGHT:
x=+SLIDE_VAL
elif event.key==K_UP:
y=-SLIDE_VAL
elif event.key==K_DOWN:
y=+SLIDE_VAL
elif event.type==KEYUP:
if event.key==K_LEFT:
x=0
elif event.key==K_RIGHT:
x=0
elif event.key==K_UP:
y=0
elif event.key==K_DOWN:
y=0
screen.fill((0,0,0))
screen.blit(backgrd,(x,y))
pygame.display.update()