4.3. 编程实现
(续上)
在原书的案例中,这个捕鱼游戏程序的代码量是最多的,为了降低初学者的学习难度,原书分4个阶段编写这个游戏程序,并为每个阶段建一个版本。
接下来,按照前面介绍原书的编程思路和分阶段多版本的思想来编写这个游戏程序。
- 搭建游戏框架
首先建立一个名为“bydr”(捕鱼达人的拼音首字母)的文件夹作为该入游戏的项目目录,在该目录中建立“fonts”、“images”、“music”文件夹用于存放游戏中使用的各种资源文件,然后将这个游戏的图像和声音素材文件复制到这些目录中。
接着,在“bydr”项目目录中创建一个 version1.jl文件。在第 1 个阶段,将搭建捕鱼游戏的基本框架,包括加载资源文和建立鱼的参数配置表,创建游戏窗口和显示背景图像,建立面向鼠标指针旋转的大大炮角色,等等。
(1) 加载游戏资源和建立鱼的参数配置表
新建一个空白源文件并以game_res.jl 作为文件名保存到根目录中。 在这个源文件中编写代码加载游戏中使用的图像和声音资源。
1 music="音乐珊瑚.mp3" 2 bg_img = "珊瑚海岸.jpg" 3 panel_img = "panel.png" 4 cannon_img = "cannon.png" 5 bullet_img = "bullet.png" 6 fishing_net_img = "fishing_net.png" 7 gold_coin_imgs = """["gold_coin_000.png","gold_coin_001.png","gold_coin_002.png","gold_coin_003.png","gold_coin_004.png","gold_coin_005.png","gold_coin_006.png","gold_coin_007.png","gold_coin_008.png","gold_coin_009.png"]""" 8 silver_coin_imgs = """["sil-ver_coin_000.png","silver_coin_001.png","silver_coin_002.png","silver_coin_003.png","silver_coin_004.png","silver_coin_005.png","silver_coin_006.png","gold_coin_007.png","silver_coin_008.png","silver_coin_009.png"]""
注意gold_coin_imgs和silver_coin_imgs,原书python代码是赋值序列帧大图的图片名称,这里将序列帧大图拆分出单个图片,以数组字符串形式赋值给这两个变量。
然后按照原书表31-2中的数据建立一个复合结构的字典变量fishes_config,并按以下形式将各种鱼的参数组织好。
fishes_config =""" { "小黄鱼":{"max":50, "alive":0, "turn":1, "life":1, "score":1, "speed":40, "file":["fish1_01.png","fish1_02.png","fish1_03.png","fish1_04.png","fish1_05.png","fish1_06.png","fish1_07.png","fish1_08.png"], "rows":8}, #添加其他鱼的参数 …… }
在上面代码中,字典变量fishes_config 中各个键名表示的用途如原书表 31-3 所示。
需要说明的是,在本文中,上表的file键,为字符串数组,记录了将序列帧大图拆分出来的单个图片名称。rows是序列帧大图中网格的行数,已不需要,但暂时保留。
(2) 创建游戏窗口和显示背景图像等。
在这version1.jl文件中,创建一些全局变量、游戏窗口、显示得分的标签和大炮角色等,并在游戏窗口的draw()方法中绘制出游戏画面。在编辑器窗口中输人下面的代码。
1 game_include("game_res.jl") 2 game_include("actor_plus.jl") 3 import JSON 4 5 # Height of the game window 6 HEIGHT = 668 7 # Width of the game window 8 WIDTH = 1024 9 # Background color of the game window 10 BACKGROUND = bg_img 11 #全局变量 12 fishes, bullets, nets, coins = [], [], [], [] 13 score, game_time, auto_play = 0, 0, false 14 dictFishes=JSON.parse(fishes_config) 15 panel = Actor(panel_img;pos=(130,597)) 16 cannon = Actor(cannon_img, pos=(507,610)) 17 score_label=TextActor("000000","Arial-Black",font_size=24, col-or=Int[255,255,255,255]) 18 score_label.pos=(165,635) 19 20 # The draw function is called by the framework. All we do here is draw the Actor 21 function draw(g::Game) 22 clear() 23 draw(panel) 24 draw(score_label) 25 draw(cannon) 26 end
(3) 在游戏窗口的on_mouse_move()方法中让大炮面向鼠标指针转动。
function on_mouse_move(g::Game, pos) x, y = pos point(cannon,x,y) end
至此,这个游戏程序的第1个版本完成。运行程序,就可以看到窗口中显示背景图、大炮等;同时,随着鼠标指针的移动,大炮角色也跟着转动。