AS3 - 滚球游戏一直显示错误#1009

时间:2014-03-12 21:32:09

标签: actionscript-3

我是新手,所以我确信有一个简单的解决方案可以解决这个问题,但我无法解决这个问题以挽救我的生命。

我试图创建一个将球滚入洞中的游戏,然后你的分数会增加,然后你会进入下一个级别。无论我做什么,当第一个球进入第一洞时,游戏会自行窒息并停止运行,即使我(想)我告诉它前进到下一帧。

我的代码在这里 -


import flash.events.Event;

var accelX:Number;
var accelY:Number;
var l2=false;
var finalscore:int = 0

var fl_Accelerometer:Accelerometer = new Accelerometer();
fl_Accelerometer.addEventListener(AccelerometerEvent.UPDATE, fl_AccelerometerUpdateHandler);


function fl_AccelerometerUpdateHandler(event:AccelerometerEvent):void
{
accelX = event.accelerationX;
accelY = event.accelerationY;
}

ball1.addEventListener(Event.ENTER_FRAME, movecircle);


function movecircle(evt:Event){

ball1.x -= accelX*30;
ball1.y += accelY*30;

if (l2==false) {
    if (ball1.hitTestObject(right1)) {
        result1.text="Yes!";
        ball1.alpha=0;
        l2=true;}
    else if (ball1.hitTestObject(wrong1))
            {result1.text="No!";}

if(ball1.x > (stage.stageWidth-ball1.width/2)){
    ball1.x = stage.stageWidth-ball1.width/2;   }
if(ball1.x < (0+ball1.width/2)){
    ball1.x = 0+ball1.width/2;  }
if(ball1.y > (stage.stageHeight-ball1.width/2)){
   ball1.y = stage.stageHeight-ball1.width/2;   }
if(ball1.y < (0+ball1.width/2)){
    ball1.y = 0+ball1.width/2;}
}

}

如果有人想看看,可以从我的Dropbox下载.fla文件 - https://dl.dropboxusercontent.com/u/3610599/whirlyball.fla

任何人都可以帮我吗?就像我说的那样,我是新手,我确定我犯了很多错误,但我一直试图解决这个问题一个星期而且还没有能够。

我提前真诚地感激。

1 个答案:

答案 0 :(得分:0)

我想我明白你要做什么。最好的解决方案可能是进行一些重构,使其更具动态性,从而解决每个游戏级别的跳帧问题。

首先,我将分享我在早期学习并在每个Flash项目开始时所做的事情 - 创建一个动作层,锁定它(你永远不会想要将对象意外地放入其中),将所有动作脚本放在这一层上。 (如果你绝对需要,只将脚本放在其他图层上)

要使下面的代码有效,您需要执行以下操作:

  1. 创建项目的副本。打开它,删除所有框架(我们将复制我们需要的内容)
  2. 创建一个名为Actions的图层,包含4个帧,所有关键帧。锁定它
  3. 创建一个名为Images的图层,包含4帧,所有关键帧
  4. 你真的只有4种游戏状态(介绍,开始画面,游戏,结果)。因此,我们将从您的项目中复制图层到我们刚刚制作的图层。使用上面提到的每个游戏状态的第一帧并复制到新项目的图像层,每个空关键帧一个。全部复制是右键单击=&gt;选择全部,右键单击=&gt;复制。在下一个空框架上切换到图像图层,然后粘贴(右键单击=&gt;粘贴到位)。对于第3帧,只需复制球类游戏的第一个实例
  5. 将下面的代码块复制到相应的操作层框架中。
  6. 在第3帧中,删除球对象id,右对象ID和错误对象id末尾的'1'。他们现在应该是'球','正确','错'
  7. 在第3帧中,将问题文本对象命名为'question'
  8. 在第3帧中,打开右对象和错误对象的影片剪辑,并将文本对象命名为“textfield”。 (最后三个变化如下所述)
  9. 行动框架1:

    stop();
    var k = setTimeout(callback, 2000);
    
    function callback():void {
      nextFrame();
    };
    

    行动框架2

    stop();
    start.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame);
    function fl_ClickToGoToNextFrame(event:MouseEvent):void
    {
        nextFrame();
    }
    

    行动框架3

    import flash.events.Event;
    
    stop();
    var questions = ["Enter question 1 here", "Enter question 2 here", "Enter question 3 here"];
    var rightAnswers = ["Right1", "Right2", "Right3"];
    var wrongAnswers = ["Wrong1", "Wrong2", "Wrong3"];
    var level = 0;
    setupLevel();
    
    
    var accelX:Number;
    var accelY:Number;
    var finalscore:int = 0
    
    var fl_Accelerometer:Accelerometer = new Accelerometer();
    fl_Accelerometer.addEventListener(AccelerometerEvent.UPDATE, fl_AccelerometerUpdateHandler);
    
    
    
    function fl_AccelerometerUpdateHandler(event:AccelerometerEvent):void
    {
        accelX = event.accelerationX;
        accelY = event.accelerationY;
    }
    
    function setupLevel(){
        ball.addEventListener(Event.ENTER_FRAME, movecircle);
    
        //reset ball
        ball.x = 215;
        ball.y = 452;
        ball.alpha = 1; 
    
        question.text = questions[level];
        right.textfield.text= rightAnswers[level];
        wrong.textfield.text = wrongAnswers[level];
    }
    
    
    function movecircle(evt:Event){
    
        ball.x -= accelX*30;
        ball.y += accelY*30;
    
        if (ball.hitTestObject(right)) {
            ball.removeEventListener(Event.ENTER_FRAME, movecircle); //prevent unwanted triggers
    
            result1.text="Yes!";
            ball.alpha=0;
    
            setTimeout(gotoNextLevel,2000)
        }
        else if (ball.hitTestObject(wrong)){
            result1.text="No!";}
    
        if(ball.x > (stage.stageWidth-ball.width/2)){
            ball.x = stage.stageWidth-ball.width/2; }
        if(ball.x < (0+ball.width/2)){
            ball.x = 0+ball.width/2;    }
        if(ball.y > (stage.stageHeight-ball.width/2)){
           ball.y = stage.stageHeight-ball.width/2; }
        if(ball.y < (0+ball.width/2)){
            ball.y = 0+ball.width/2;}
    
    }
    
    function gotoNextLevel() {
        //goto next frame and stop
        level++;
        if(level >= questions.length){
            nextFrame();
        }
        else{
            setupLevel();
        }
    }
    

    行动框架4

    stop ();
    
    outputScore.text = String(finalscore);
    

    简而言之,我们在这里所做的是将所有这些状态用于最初是单独帧的实际游戏,并将它们组合成一个帧。然后,我们通过使用该帧的actionscript顶部的数组来存储问题和答案,从而使整个事物变得动态。我们将这些文本字段ID添加到孔图像中,以便我们可以访问该文本并在新级别上更改它。我们将球改成'球',因为我们现在不需要跟踪多个球,我们只有一个我们一直在重置的球。每次用户选择正确时,游戏都会重置状态并使用下一级别的问题和答案。这种情况一直持续到使用所有问题为止。

    希望这有帮助! (我会发布图片但它不会让我直到我得到一些声誉= P)