赞
踩
======================= 大爽歌作,made by big shuang =======================
要让游戏界面动起来,需要实现两点
这块说一下,光实现一的话理论上页面也算动起来了,但是如果界面内容不变,每次新的页面和旧的界面看起来是一样的,给人的观看感觉跟没有动没有区别
所以必须要实现2,来更改界面内容,给人“动”起来的感觉
实现定时刷新页面,很简单
写一个方法用于循环刷新,再定时调用
此部分代码写在原来代码最后的win.mainloop
之前就好
FPS = 500 # 刷新页面的毫秒间隔
def game_loop():
win.update()
# ===用于展示刷新,后续会删掉===
import time
print(time.ctime())
# ===========================
win.after(FPS, game_loop)
win.update()
win.after(FPS, game_loop) # 在FPS 毫秒后调用 game_loop方法
此时运行发现命令行中会有如下输出,说明这个页面确实是每隔500ms刷新了一次
Thu Nov 28 23:32:50 2019
Thu Nov 28 23:32:51 2019
Thu Nov 28 23:32:51 2019
Thu Nov 28 23:32:52 2019
Thu Nov 28 23:32:52 2019
Thu Nov 28 23:32:53 2019
Thu Nov 28 23:32:53 2019
但是由于我之前说的,每次刷新后页面的内容是没有变化的,给观众的感觉还是更没动一样
所以需要配合每次刷新,移动俄罗斯方块的位置
对于某个俄罗斯方块,要绘制出来需要知道它的位置和类型,以及内部的各个方格。
这三个数据可以用字典存起来,这里我们规定格式如下
a_block = {
'kind': 'O', # 对应俄罗斯方块的类型
'cell_list': SHAPES['O'], # 对应俄罗斯方块的各个方格
'cr': [3, 3] # 对应横纵坐标,以左上角为原点,水平向右为横坐标轴正方向,竖直向下为纵坐标轴正方向
}
此时一个这样的字典其实就可以看做一个俄罗斯方块对象
然后我们再建一个专门的方法draw_block_move
,来绘制俄罗斯方块的移动
其实移动也比较简单,就是清掉旧位置已经绘制的俄罗斯方块,再在新位置绘制新的俄罗斯方块就好
然后修改下game_loop
方法
更新修改部分如下
# 在draw_blank_board(canvas)语句下面添加如下语句 def draw_block_move(canvas, block, direction=[0, 0]): """ 绘制向指定方向移动后的俄罗斯方块 :param canvas: 画板 :param block: 俄罗斯方块对象 :param direction: 俄罗斯方块移动方向 :return: """ shape_type = block['kind'] c, r = block['cr'] cell_list = block['cell_list'] # 移动前,先清除原有位置绘制的俄罗斯方块,也就是用背景色绘制原有的俄罗斯方块 draw_cells(canvas, c, r, cell_list) dc, dr = direction new_c, new_r = c+dc, r+dr block['cr'] = [new_c, new_r] # 在新位置绘制新的俄罗斯方块就好 draw_cells(canvas, new_c, new_r, cell_list, SHAPESCOLOR[shape_type]) a_block = { 'kind': 'O', # 对应俄罗斯方块的类型 'cell_list': SHAPES['O'], # 对应俄罗斯方块的各个方格 'cr': [3, 3] # 对应横纵坐标,以左上角为原点,水平向右为横坐标轴正方向,竖直向下为纵坐标轴正方向 } draw_block_move(canvas, a_block) # 修改原来的game_loop方法如下 def game_loop(): win.update() down = [0, 1] draw_block_move(canvas, a_block, down) win.after(FPS, game_loop)
此时的完整代码已上传github,点击查看,运行代码就发现界面中的俄罗斯方块动起来了,动画如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。