平台游戏.在下一帧中跳到下一个级别



我为安卓设备创建了一个有 20 个关卡的平台游戏。每个关卡都有不同的步行平台和具有不同属性的新敌人。 我有第一帧有 20 个按钮,第一个按钮转到第一级(第 2 帧),第二个按钮转到第二级(第 3 帧),一直持续到第 21 帧的最后一层。 我把我所有的代码都写在第2帧(1级)玩家移动,敌人属性,硬币,生命等中。 当玩家死亡或玩家完成阶段时,我转到第 1 帧并准备单击第 2 层按钮,转到第 3 帧中的第二阶段。 那么,我的代码的哪一部分必须转移到第二级?

这是我在第二帧中的部分代码。 (我只显示一个敌人(Medouza)和我移动玩家的控件,因为这是一个大代码)

stop();
l_btn.addEventListener(TouchEvent.TOUCH_BEGIN,lbtisdown);
l_btn.addEventListener(TouchEvent.TOUCH_END,lbtisup);
r_btn.addEventListener(TouchEvent.TOUCH_BEGIN,rbtisdown);
r_btn.addEventListener(TouchEvent.TOUCH_END,rbtisup);
j_btn.addEventListener(TouchEvent.TOUCH_BEGIN,jbtisdown);
k_btn.addEventListener(TouchEvent.TOUCH_BEGIN,kbtisdown);
stop_btns.addEventListener(TouchEvent.TOUCH_END,allup);
stop1_btn.addEventListener(TouchEvent.TOUCH_END,jkup);
fire_btn.addEventListener(TouchEvent.TOUCH_BEGIN,fbtisdown);
function lbtisdown(e:TouchEvent)
{
ldown = true;
}
function lbtisup(e:TouchEvent)
{
ldown = false;
}
function rbtisdown(e:TouchEvent)
{
rdown = true;
}
function rbtisup(e:TouchEvent)
{
rdown = false;
}
function kbtisdown(e:TouchEvent)
{
kdown = true;
}
function jbtisdown(e:TouchEvent)
{
if (! jdown && onground && ! dizbl)
{
runJump();
}
jdown = true;
}
function fbtisdown(e:TouchEvent)
{
fdown = true;
}
var movers = new Array(bg.ground.platkat0,bg.ground.plator0,bg.ground.platkat1,bg.ground.plator1,bg.ground .plator2,bg.ground.plator3);
var movedirs = new Array(0,1,0,1,1,1);
var movelimits = new Array([-57.5,60],[1853,2021],[-57.5,243],[1935,2072],[2548,2877],[2982,3073]);
var medouzaArr = new Array();
function addMedouza(med)
{
medouzaArr.push(med);
med.medouza.gotoAndStop(1);
med.xvel = 0;
med.yvel = 0;
med.hitpoints = 20;
med.startAttack = 0;
med.fireAttack = 3;
med.sp = Math.random() * .7 + .7;
med.dir = Math.floor(Math.random() * 2);
med.locksp = med.sp;
}
this.addEventListener(Event.ENTER_FRAME,FramesEvents);
function FramesEvents(e:Event)
{
completeStage();
moveplatforms();
moveMedouza();
phys();
controls();
windowcamera();
}
function moveMedouza()
{
for (var k1=0; k1<medouzaArr.length; k1++)
{
var m = medouzaArr[k1];
m.x +=  m.xvel;
m.xvel *=  .3;
m.y +=  m.yvel;
m.yvel +=  GRA;
if (m.x > savvito.x)
{
m.scaleX = -1;
}
if (m.x < savvito.x)
{
m.scaleX = 1;
}
if (m.startAttack > 4)
{
m.fireAttack = 1 + Math.floor(Math.random() * 2);
m.startAttack = 0;
}
if (m.fireAttack == 0)
{
m.medouza.gotoAndStop(1);
}
if (m.fireAttack == 1)
{
m.medouza.gotoAndStop(2);
}
if (m.fireAttack == 2)
{
m.medouza.gotoAndStop(3);
}
if (m.medouza.currentFrame == 1 && m.medouza.medouza_iddle.currentFrame == m.medouza.medouza_iddle.totalFrames)
{
m.startAttack +=  1;
}
if (m.medouza.currentFrame == 2 && m.medouza.medouza_jump.currentFrame == m.medouza.medouza_jump.totalFrames)
{
m.fireAttack = 0;
var e = bg.addChild(new enemy1());
e.x = m.x;
e.y = m.y;
}
if (m.medouza.currentFrame == 3 && m.medouza.medouza_attack.currentFrame == m.medouza.medouza_attack.totalFrames)
{
m.fireAttack = 0;
}
if (m.medouza.currentFrame == 3 && m.medouza.medouza_attack.currentFrame == 12)
{
var s = bg.addChild(new parentsmos());
smoshArr.push(s);
s.x = m.x;
s.y = m.y;
if (m.scaleX == 1)
{
s.scaleX = 1;
}
if (m.scaleX == -1)
{
s.scaleX = -1;
}
}
if (savvito.hitTestObject(m.med_hit) && ! savvito.hit && ! die)
{
herohitpoints++;
savvito.hit = true;
savvito.hitcv = 0;
if (savvito.x < m.x)
{
xvel = -8;
}
else
{
xvel = +8;
}
yvel = -6;
}
if (savvito.hero.currentFrame == 4 && savvito.hero.attack.hitTestObject(m.med_box) && savvito.hero.attack.currentFrame == 6)
{
m.hitpoints -=  15 + KnifeDamage;
enemieslifebar.enemiesgreenlife.gotoAndStop(m.hitpoints);
if (m.scaleX == 1)
{
m.x = 700;
}
if (m.scaleX == -1)
{
m.x = 100;
}
}
upPushMedouza(m);
if (m.hitpoints <= 0)
{
addBonusCoins();
bg.stageClear.x = m.x;
bg.stageClear.y = m.y + 7;
medouzaArr.splice(k1,1);
bg.removeChild(m);
return;
}
}
}
function completeStage()
{
if (savvito.hitTestObject(bg.stageClear)&&numKey >= 5)
{
j_btn.removeEventListener(TouchEvent.TOUCH_BEGIN,jbtisdown);
stageDone.gotoAndStop(2);
kdown = false;
ldown = false;
rdown = false;
jdown = false;
dizbl = false;
for (var rk1=0; rk1<medouzaArr.length; rk1++)
{
var rm = medouzaArr[rk1];
medouzaArr.splice(rk1,1);
bg.removeChild(rm);
return;
}
if (medouzaArr.length == 0)
{
goto2();
}
fl_CountDownTimerInstance.removeEventListener(TimerEvent.TIMER, fl_CountDownTimerHandler);
fl_CountDownTimerInstance.stop();
fl_Countstart.removeEventListener(TimerEvent.TIMER, fl_CountDownstart);
}
}
function goto2()
{
medouzaArr.length = 0;
movers.length = 0;
movedirs.length = 0;
movelimits.length = 0;
fl_TimerInstancew.start();
if (fl_SecondsElapsedw > 5 && herohitpoints <= 29)
{
channel1.stop();
this.addEventListener(Event.ENTER_FRAME,empty1);
fl_TimerInstancew.removeEventListener(TimerEvent.TIMER, fl_TimerHandlerw);
fl_TimerInstancew.stop();
}
if (fl_SecondsElapsedw == 3 && herohitpoints < 29)
{
savecoins.data.banksavecoins = coinscount + buycoins;
savecoins.flush();
}
}
function empty1(e:Event)
{
this.removeEventListener(Event.ENTER_FRAME,FramesEvents);
gotoAndStop(2);
}

我只会将所有游戏代码放在第 1 帧上。

还要在第 1 帧上制作一个名为levelsMC的新影片剪辑,它是所有关卡帧的容器(使用舞台时间轴中的"剪切帧"并将它们粘贴到关卡 MC 时间轴中),

现在,您的代码可以只说级别 2 =levelsMC.gotoAndStop(2);或级别 3levelsMC.gotoAndStop(3);...

由于代码级别 MC都在第 1 帧上,因此您不必传输(重新复制)任何代码。

您的工作逻辑是:

我有一个按钮的第一个框架(水平按钮),

  • 我有一个具有帧号的变量nextLevel(整数)。我更新为nextLevel = 2;
  • 第一个按钮告诉级别MC转到第一级(使用levelsMC.gotoAndStop(2);)或可以使用levelsMC.gotoAndStop(nextLevel);
  • 第二个按钮转到第二级(使用levelsMC.gotoAndStop(3);)
  • 并一直持续到第 21 帧(levelsMC.gotoAndStop(21);)中的最后一个级别。

  • 我把我所有的代码都写在第 1 帧中,为了显示从第 1 级开始,我说 :
    startScreenMC.visible = false;levelsMC.visible = true;

  • 当玩家完成阶段时,我将下一个级别数字(整数)更新为+1,我准备单击到levelButton,其中单击/点击功能 简单地告诉levelsMC得到帧x(其中x下一个级别金额),如下所示:
    levelsMC.gotoAndStop( nextLevel );

PS:查看AS3 linkage教程。可以更轻松地创建硬币或字符的 MC,并在需要时将其addChild级别 MC。然后代码通过路径访问它,如levelsMC.coin = visible = false;等。

相关内容

最新更新