您好我是第一次尝试学习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;
}
}
}
如果有任何错误,我道歉。我对动作全新。任何帮助表示赞赏。谢谢
答案 0 :(得分: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