平台游戏。下一帧跳转到下一级

Platform game. Jump to next level in next frame

我为 android 设备创建了一个具有 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 的新 MovieClip,它是所有关卡帧的容器(使用舞台时间轴中的 "cut frames" 并将它们粘贴到关卡 MC 中时间轴),

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

因为 codelevelsMC 都在第 1 帧上,所以您不必传输(重新复制)任何代码。

你的工作逻辑是:

I have the first frame with one button ( levelButton ),

  • I have a variable nextLevel (integer) that has frame number. I update as nextLevel = 2;
  • The first button tells levelsMC go to first level (using levelsMC.gotoAndStop(2);) or can use levelsMC.gotoAndStop(nextLevel);
  • the second button go to second level (using levelsMC.gotoAndStop(3);)
  • and goes on until the final level in frame 21 (levelsMC.gotoAndStop(21);).

  • I write all of my code in frame 1 and to show from level 1 onwards I say :
    startScreenMC.visible = false; and levelsMC.visible = true;

  • When the player complete the stage I update nextLevel number (integer) as +1 and i'm ready to click to levelButton, where click/tap function simply tells levelsMC to got frame x (where x is nextLevel amount) like this :
    levelsMC.gotoAndStop( nextLevel );

PS:查看 AS3 linkage 教程。使创建硬币或字符的 MC 变得更容易,并且在需要时只需 addChildlevelsMC。然后代码通过 levelsMC.coin = visible = false; 等路径访问它