如何将对象编码到“动作”面板中的舞台上?

时间:2015-08-19 17:57:37

标签: actionscript-3 flash fla

我正试图在我的乒乓球游戏中引入一个新球,有点像加电。我在第一帧的“动作”面板中编写了所有代码。新球应出现在舞台上,并像原始球一样随机开始移动。虽然我使用的是代码段而不是.as文件。因此,我的所有代码都在“动作”面板中(按f9访问)。

我还希望我的动态文本框与舞台颜色合并,以便您无法看到白色背景。

我无法向您展示fla的外观,因为我的声誉不到10,但动态文本框不会合并到背景中,而是会有白色环绕。当球上升时,这会隐藏球。

import flash.events.Event;
import flash.ui.Mouse;

//hide mouse
Mouse.hide();






init(); //initialises everything

var bSpeedX:int = -3.5;
var bSpeedY:int = -2.5;


// assign a maximum speed to the AI 
var compPaddleSpeed:int = 3.5; 

var pScore:int = 0;
var cScore:int = 0;




// Updates the score
function scoreUpdate():void {
    playerScore.text = ("Player Score: " + pScore);
    computerScore.text = ("AI Score: " + cScore);


}




function init():void //tells flash not to return values
{ 

    stage.addEventListener(Event.ENTER_FRAME, loop);

}   
/*we want the ySpeed to be larger if there 
is a greater difference between the y 
positions of the ball and paddle, so I started with 
(gameBallY-padY). To convert this difference 
into a number between -1 and 1, I divided 
this number by 25, which 
is half the height of the paddle. Finally, I wanted 
the ySpeed to be more powerful than 
just -1 to 1, and after a bit of trial and error 
I decided to times by 5 at the end 
to change the total magnitude of the new ySpeed.*/



//defying the laws of Physics
function calculategameBallAngle(padY:Number, gameBallY:Number):Number
{
    var ySpeed:Number = 5 * ((gameBallY-padY) / 25 );
    return ySpeed;
}





//main loop 
function loop(e:Event):void

{   
    //makes the paddle track the mouse
    playerPaddle.y = mouseY;

    //paddle AI
    if(compPaddle.y < gameBall.y - 10){ 
        compPaddle.y += compPaddleSpeed;//make it go up
    } else if(compPaddle.y > gameBall.y + 10){ 
        compPaddle.y -= compPaddleSpeed;//make it go down
    }

    //Collisions
    if( playerPaddle.hitTestObject(gameBall) == true ){
    if(bSpeedX < 0){
        bSpeedX *= -1;
        bSpeedY = calculategameBallAngle(playerPaddle.y, gameBall.y);
    }

} else if(compPaddle.hitTestObject(gameBall) == true ){ 
    if(bSpeedX > 0){
        bSpeedX *= -1;
        bSpeedY = calculategameBallAngle(compPaddle.y, gameBall.y);
    }

}


    //makes the gameBall move 
    gameBall.x += bSpeedX; //each frame, we add the bSpeedX to the ball's x position.
    gameBall.y += bSpeedY; //same for the bSpeedY to the ball's y postion.



    // checks to see if the ball misses the paddle 
    if(gameBall.x <= gameBall.width/2){
       gameBall.x = gameBall.width/2;
       bSpeedX *= -1;
       cScore ++;
       scoreUpdate();


    //keeps the ball within the stage
    } else if(gameBall.x >= stage.stageWidth-gameBall.width/2){
        gameBall.x = stage.stageWidth-gameBall.width/2;
        bSpeedX *= -1;
        pScore ++;
        scoreUpdate();


    }

    if(gameBall.y <= gameBall.height/2){
        gameBall.y = gameBall.height/2;
        bSpeedY *= -1;
    }

    else if(gameBall.y >= stage.stageHeight-gameBall.height/2){
        gameBall.y = stage.stageHeight-gameBall.height/2;
        bSpeedY *= -1;
    }
 //-------------------------------------------------------



    //keeps the player paddle within the stage
    //check if paddle is above top of the screen 
    if(playerPaddle.y - playerPaddle.height/2 < 0){
        playerPaddle.y = playerPaddle.height/2;
    } else if(playerPaddle.y + playerPaddle.hieght/2 > stage.stageHeight){
        playerPaddle.y = stage.stageHeight - playerPaddle.height/2;


    //check if paddle is below bottom of the screen
    } else if(playerPaddle.y + playerPaddle.height/2 > stage.stageHeight){
     playerPaddle.y = stage.stageHeight - playerPaddle.height/2;
  }

    }

1 个答案:

答案 0 :(得分:0)

如果您只想用新的球替换具有不同格纹和/或速度的球,您可以将球类导出到动作脚本:

Library>RMB on your symbol>Properties>ActionScript Linkage>Export for ActionScript

Class:字段下输入您的班级名称,例如“MyBallClass”,然后点击OK

现在你可以在你的代码中构造这个球并替换旧的这样的球:

var newBall:MyBallClass = new MyBallClass();
addChild(newBall);
newBall.x = gameBall.x; newBall.y = gameBall.y;
gameBall = newBall;

此外,您可以定义像var speedModifier:Number = 1;这样的新变量,用于:

gameBall.x += bSpeedX * speedModifier;
gameBall.y += bSpeedY * speedModifier;

当你换球时也要改变它。

如果你想同时拥有多个球你真的应该考虑在OOP中构建它。除了前一个示例之外,还有最简单的示例 您可以创建MyBallClass.as文件并在其中写入:

package  
{
    import flash.display.Sprite;
    import flash.geom.Point;

    public class MyBallClass extends Sprite
    {
        public var speedFactor:Number;
        public var speed:Point = new Point(-3.5, -2.5);
        public function MyBallClass(x:Number, y:Number, speedFactor:Number = 1) 
        {
            this.x = x; this.y = y;
            this.speed = speed;
        }
    }
}

现在你可以在游戏中为所有球创建容器。

var balls:Vector<MyBallClass> = Vector<MyBallClass>([]);

并在循环中为所有这些物理运行物理。

一般来说,主要代码看起来像这样:

var balls:Vector.<MyBallClass> = Vector.<MyBallClass>([]);

addBall(...)//place first ball.

function loop(e:Event):void {
    processBalls();
    if(wantToAddNewSuperSpeedBall) addBall(x,y,3);
    ...
}

function processBalls() {
    for (var i:int = 0; i < balls.length; i++) {
        detecCollision(balls[i]);
        moveBall(balls[i]);
        //any code that process a single ball...
    }
}

function addBall(x:Number, y:Number, speedFactor:Number = 1) {
    var newBall:MyBallClass = new MyBallClass(x,y, speedFactor);
    addChild(newBall);
    balls.push(newBall);
}

function moveBall(ball:MyBallClass) {
    ball.x += ball.speed.x * ball.speedFactor;
    ball.y += ball.speed.y * ball.speedFactor;
}

所以你应该修改所有影响球行为的函数来处理作为参数传递的球,不仅仅是一个特定的实例,然后将它们用于所有球。

本主题还有更多要介绍的内容,这可能不是最好的方法,但我试图让它易于使用。有很多OOP指南,所以如果你阅读它们,你可以更好地了解正在发生的事情。 我希望以某种方式帮助你。