Flash Game-点击按钮开始游戏

Posted

技术标签:

【中文标题】Flash Game-点击按钮开始游戏【英文标题】:Flash Game-Start game on button click 【发布时间】:2018-02-01 02:54:06 【问题描述】:

您好,我是第一次尝试学习 Actionscript。我正在尝试制作像 Flappy Bird 这样的游戏。现在我的游戏在没有开始菜单的情况下运行良好。但是现在我按下开始按钮后无法开始游戏。 我收到一个错误:

1046:类型未找到或不是编译时常量:BtnPlay。

但我创建了一个名为“BtnPlay”的按钮实例,并且还链接到 Actionscript。

这是我的时间线

我正在使用外部脚本来控制游戏。

我想要的是-

    点击开始按钮后开始游戏。 点击后隐藏按钮。 在游戏结束时再次显示按钮并隐藏游戏角色(鸟)。

我的动作脚本也在下面。

    package
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event; //used for ENTER_FRAME event

public class Main extends MovieClip

    //constants
    const gravity:Number = 1.5;            //gravity of the game
    const dist_btw_obstacles:Number = 300; //distance between two obstacles
    const ob_speed:Number = 8;             //speed of the obstacle
    const jump_force:Number = 15;          //force with which it jumps

    //variables
    var player:Player = new Player();      
    var lastob:Obstacle = new Obstacle();  //varible to store the last obstacle in the obstacle array
    var obstacles:Array = new Array();     //an array to store all the obstacles
    var yspeed:Number = 0;                 //A variable representing the vertical speed of the bird
    var score:Number = 0;                  //A variable representing the score

    public function Main()
        init();
    

    function init():void 
        //initialize all the variables
        player = new Player();
        lastob = new Obstacle();
        obstacles = new Array();
        yspeed = 0;
        score = 0;

        //add player to center of the stage the stage
        player.x = stage.stageWidth/2;
        player.y = stage.stageHeight/2;
        addChild(player);

        //create 3 obstacles ()
        createObstacle();
        createObstacle();
        createObstacle();

        //Add EnterFrame EventListeners (which is called every frame) and KeyBoard EventListeners
        addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
    

    private function key_up(event:KeyboardEvent)
        if(event.keyCode == Keyboard.SPACE)
            //If space is pressed then make the bird
            yspeed = -jump_force;
        
    

    function restart()
        if(contains(player))
            removeChild(player);
            for(var i:int = 0; i < obstacles.length; ++i)
                if(contains(obstacles[i]) && obstacles[i] != null)
                removeChild(obstacles[i]);
                obstacles[i] = null;
            
            obstacles.slice(0);
            init();
    

    function onEnterFrameHandler(event:Event)
        //update player
        yspeed += gravity;
        player.y += yspeed;

        //restart if the player touches the ground
        if(player.y + player.height/2 > stage.stageHeight)
            restart();
        

        //Don't allow the bird to go above the screen
        if(player.y - player.height/2 < 0)
            player.y = player.height/2;
        

        //update obstacles
        for(var i:int = 0;i<obstacles.length;++i)
            updateObstacle(i);
        

        //display the score
        scoretxt.text = String(score);
    

    //This functions update the obstacle
    function updateObstacle(i:int)
        var ob:Obstacle = obstacles[i];

        if(ob == null)
        return;
        ob.x -= ob_speed;

        if(ob.x < -ob.width)
            //if an obstacle reaches left of the stage then change its position to the back of the last obstacle
            changeObstacle(ob);
        

        //If the bird hits an obstacle then restart the game
        if(ob.hitTestPoint(player.x + player.width/2,player.y + player.height/2,true)
           || ob.hitTestPoint(player.x + player.width/2,player.y - player.height/2,true)
           || ob.hitTestPoint(player.x - player.width/2,player.y + player.height/2,true)
           || ob.hitTestPoint(player.x - player.width/2,player.y - player.height/2,true))
            restart();
        

        //If the bird got through the obstacle without hitting it then increase the score
        if((player.x - player.width/2 > ob.x + ob.width/2) && !ob.covered)
            ++score;
            ob.covered = true;
        
    

    //This function changes the position of the obstacle such that it will be the last obstacle and it also randomizes its y position
    function changeObstacle(ob:Obstacle)
        ob.x = lastob.x + dist_btw_obstacles;
        ob.y = 100+Math.random()*(stage.stageHeight-200);
        lastob = ob;
        ob.covered = false;
    

    //this function creates an obstacle
    function createObstacle()
        var ob:Obstacle = new Obstacle();
        if(lastob.x == 0)
        ob.x = 800;
        else
        ob.x = lastob.x + dist_btw_obstacles;
        ob.y = 100+Math.random()*(stage.stageHeight-200);
        addChild(ob);
        obstacles.push(ob);
        lastob = ob;
    



如果有任何错误,我深表歉意。我对动作脚本完全陌生。任何帮助表示赞赏。谢谢

【问题讨论】:

只是好奇:为什么要自学outdated 技术? @RuudHelderman 您的链接是关于浏览器插件的。他不是在学习为插件编写代码,而是在使用 AS3 语言,该语言也可以编译为原生/移动应用程序。只要 2020 年 12 月之后的浏览器不再需要它,他就可以了。 @ratulkeot 我在您的代码中没有看到任何可能导致此类错误的BtnPlay。还将所有内容都放在一个框架上(可以是多个图层)。使用 addChild(someMC)someMC.visible = true; 之类的命令而不是跳帧(避免像在一个帧中创建的 var 对不同的帧没有任何意义的问题,因为每个帧都像一个新的空白页) @RuudHelderman 只是好奇:为什么不在research 对问题发表评论? 您发布了所有需要发布的代码以外的代码(您如何以及在何处创建按钮 BtnPlay 的实例),哇。 【参考方案1】:

看看这个示例设置(看看它对你有帮助):

package

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event; //used for ENTER_FRAME event

public class Main extends MovieClip

    //variables

    var btnPlay:BtnPlay = new BtnPlay(); //Var name must be different from Class name

    //These don't need "new" until when used (initialized)
    var player:Player; var lastob:Obstacle; var obstacles:Array;


    public function Main()
    
        if (stage)  init();  //# Check if Stage is ready
        else  addEventListener(Event.ADDED_TO_STAGE, init); 

    

    public function init():void 
    
        btnPlay.x = stage.stageWidth/4; //testing position
        btnPlay.y = stage.stageHeight/4; //testing position
        addChild(btnPlay); //now add button to Stage
        btnPlay.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler)‌​;
    

    public function mouseUpHandler(evt:MouseEvent):void 
    
        btnPlay.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler)‌​;
        btnPlay.visible = false; //hide button from system
        initGame(); //add characters etc

        ////# Use "MovieClip(this.root)." to control existing Stage items that were not added by code
        //gotoAndPlay(2); //why go to frame 2 now?
        MovieClip(this.root).gotoAndStop(2); //or try: MovieClip(root).gotoAndStop(2);

    

    function initGame():void 
    
        //initialize all the variables
        player = new Player();
        lastob = new Obstacle();
        obstacles = new Array();

        yspeed = score = 0;

        //add player to center of the stage the stage
        player.x = stage.stageWidth/2;
        player.y = stage.stageHeight/2;
        addChild(player);

        //create 3 obstacles ()
        for(var i:int = 1; i <= 3; i++)  createObstacle(); 

        //Add EnterFrame EventListeners (which is called every frame) and KeyBoard EventListeners
        addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
    

    function restart()
    
        //# reset object positions for new game instead making "new" instances of same thing (each adds to memory usage)

        if( MovieClip(this.root).contains(player) )
        
            //removeChild(player); //why remove fom Stage but then re-create and re-add more in memory?

            player.x = stage.stageWidth/2; player.y = stage.stageHeight/2; //reset starting position
            score = yspeed = 0; //reset values to zero
            btnPlay.visible = true; //show Play button

            for(var i:int = 0; i < obstacles.length; ++i)
            
                if(contains(obstacles[i]) && obstacles[i] != null)
                removeChild(obstacles[i]);
                obstacles[i] = null;
            
            obstacles.slice(0);

            //create 3 obstacles
            for(var i:int = 1; i <= 3; i++)  createObstacle(); 

            //init(); //you already created first time, just re-use not create more new ones.
        
    

 //end Class

 //end Package

【讨论】:

谢谢。代码看起来更干净。但我收到一个错误Line 37 1084: Syntax error: expecting rightparen before er. @ratulkeot 告诉我从你写它的地方看它的样子。另外我忘了在函数restart 中添加btnPlay.visible = true;,所以请检查新的更新。

以上是关于Flash Game-点击按钮开始游戏的主要内容,如果未能解决你的问题,请参考以下文章

请问怎么用易语言的模拟鼠标点击呢?比如点击一个网页游戏的开始游戏

魔兽世界点了开始游戏后又回到启动界面

Unity - 单击重新启动按钮后如何重新启动乐谱?

(转)CocosCreator零基础制作游戏《极限跳跃》添加游戏主场景控制脚本

WBS需求分析

Cocos Creator实现左右跳游戏,提供完整游戏代码工程