所有游戏中最经典的游戏“宇宙入侵者”。已有成百上千种翻版,其中有些就是用D i r e c t o r
制作的。下面的例子只是非常简单的一个游戏。图1 是正在玩游戏时的情景。
图1 在这个“入侵者”游戏里,入侵者是一些样子十分可笑的位图
这个入侵者游戏比前面几个游戏都复杂。它分为四个行为:一个用于入侵者的角色,一
个用于战舰,一个用于入侵者所发射的子弹,一个用于战舰所发射的子弹。
1 制作入侵者角色
游戏主要由入侵者的运动所控制,它们集体从舞台的一侧横向移到另一侧。当它们碰到
舞台某个侧边时,就向下掉,离舞台的底边更近一步。
控制这种运动只需要一个行为,再把这个行为赋予舞台上的每一个入侵者角色就可以了。
不过,还要使用g H i t Wa l l 和g H i t B o t t o m 两个全局变量。当至少一个角色碰到舞台的侧边或底边
时,相应的全局变量就被设为T R U E ,然后由帧剧本来处理这个情况。
该行为开始时,方向和速度都被设为2 ,表示入侵者每帧向右移动两个像素。它还记录角
色的演员编号。在演员表里,每个入侵者有两个演员,它们基本相同,只是脚的方向反过来,
给人以“进军”的感觉。入侵者行为在各帧交替使用这两个演员。。
global gHitWall, gHitBottom
property pDirection, pMemNum
on beginSprite me
-- start moving 2 pixels to right
pDirection = 2
pMemNum = sprite(me.spriteNum)。memberNum
end
on exitFrame me
-- freeze if not on play frame
if the frameLabel "Play" then exit
if pDirection = 0 then
-- no direction, must have been hit
sprite(me.spriteNum)。memberNum = 0 -- remove sprite
else
-- move
sprite(me.spriteNum)。locH = sprite(me.spriteNum)。locH + pDirection
-- hit a wall?
if pDirection 0 and sprite(me.spriteNum)。locH 460 then
gHitWall = TRUE
else if pDirection 0 and sprite(me.spriteNum)。locH 20 then
gHitWall = TRUE
end if
-- toggle to other member to create animation
if sprite(me.spriteNum)。memberNum = pMemNum then
sprite(me.spriteNum)。memberNum = pMemNum + 1
else
sprite(me.spriteN图老师um)。memberNum = pMemNum
end if
-- fire 1 out of 200 times
if random(200) = 1 then
sendSprite(sprite 55, #fire, sprite(me.spriteNum)。loc)
end if
end if
end
on exitFrame 处理程序还以1 / 2 0 0 的机会引发入侵者发射子弹。它向角色5 5 —即入侵者的
子弹—发送一个# f i r e 消息。
如果哪个角色与舞台侧边的距离太近,on exitFrame 处理程序就把全局变量g H i t Wa l l 设为
&nb