2014-02-11 30 views
0

我對Flash很新,目前我正在嘗試開發一款小遊戲。但我的對手不再突然工作了。我不得不承認,我剛剛從我的教授那裏複製了對撞機部分,我不知道他們是如何工作的。 當我插入位於舞臺的整個背景的「BG」時,它工作得很好。現在我想讓我的角色與遊戲中的每個平臺發生衝突。 嗯,它工作過。突然它有問題。爲什麼?! :/閃光對撞機不能工作

的Char_Collider_feet在我Character_Control 的Platform_Collider是在BG的MovieClip它位於舞臺...

錯誤信息:「空對象引用Error」錯誤1009 我知道我方法,但我不能找到它的原因,特別是因爲它在我的其他項目的工作......(好吧我不使用文檔類有)

主要

package 
{ 
import flash.events.KeyboardEvent; 
import flash.events.MouseEvent; 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.ui.Keyboard; 



public class Main extends MovieClip 
{ 
public var char:Character_Control; 
public var figure:MovieClip; 
public var BG:MovieClip; 
public var Platform:Platform_Collider; 

var allKeys:Object = new Object(); 
var oCollider; 


    public function Main() 
    { 
     this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
     this.stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
     this.stage.addEventListener(Event.ENTER_FRAME, update); 
     this.stage.addEventListener(Event.ENTER_FRAME, Gravity); 
     Start(); 
    } 



    //Creates Chars and Objects 
    public function Start() 
    { 
     char = new Character_Control(150,450); 
     stage.addChild(char); 
    } 


    //Key pressed 
    function keyPressed(e:KeyboardEvent) 
    { 
     allKeys[e.keyCode] = true; 
    } 

    //Key released 
    function keyReleased(e:KeyboardEvent) 
    { 
     if(allKeys[e.keyCode] != null) 
     allKeys[e.keyCode] = false 
     char.stopMove(); 
    } 


    //Sends keyCode to Character_Control 
    function update(e:Event) 
    { 
     //Walk 
     if(allKeys[Keyboard.LEFT]) 
     {char.Move("walk_left");} 
     else if(allKeys[Keyboard.RIGHT]) 
     {char.Move("walk_right");} 

     //Jump 
     if(allKeys[Keyboard.SPACE]) 
     {char.Move("jump");} 

     //Idle 
     char.Move("idle"); 
    } 


    //Tests Collision with Background 
    function Gravity(_event:Event) 
    { 
      //Insert Object which hits "char" 
      oCollider = char.hitBGCollider(BG); 

      if (oCollider) 
      { 
       char.Fall(true); 
       trace("I collide!"); 
      } 
      else 
      { 
       char.Fall(false); 
       trace("I fall!"); 
      } 
    } 


} 
} 

Characte r_Control

package 
{ 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.geom.*; 


public class Character_Control extends MovieClip 
{ 
public var figure:MovieClip; 

var speed:int = 5; 
var currentSpeed:int = 0; 
var jumpPower:int = 5; 
var gravity:Number = 0.9; 
var isJumping:Boolean = false; 
var aCollider:Array = new Array(); 


    public function Character_Control(posx:Number,posy:Number) 
    { 
     this.x = posx; 
     this.y = posy; 
     this.addEventListener("RegisterCharColliderFeet", RegisterCharColliderFeet); 
     this.addEventListener(Event.ENTER_FRAME, update); 
    } 

    //Controls Jumps 
    public function update(e:Event) 
    { 
     if(figure.currentAnim=="jumpUP") 
     { 
      figure.y -=jumpPower; 
     } 
     else if(figure.currentAnim=="jumpDOWN") 
     { 
      figure.y +=jumpPower; 
     } 
    } 


    //Moves Character, after Keyboard input received 
    public function Move(_action:String) 
    { 
     switch(_action) 
     { 
      case "walk_left": 
      figure.scaleX = -1; 
      currentSpeed = 5; 
      figure.x -= currentSpeed*scaleX; 
      if(figure.currentAnim=="nothing" || figure.currentAnim=="idle") 
      { 
       figure.setAnimation("walk"); 
       isJumping = false; 
      } 
      break; 

      case "walk_right": 
      figure.scaleX = 1; 
      currentSpeed = 5; 
      figure.x += currentSpeed*scaleX; 
      if(figure.currentAnim=="nothing" || figure.currentAnim=="idle") 
      { 
       figure.setAnimation("walk"); 
       isJumping = false; 
      } 
      break; 

      case "jump": 
      if(!isJumping) 
      { 
       figure.setAnimation("jump"); 
       isJumping = true; 
      } 
      break; 

      case "idle": 
      if(figure.currentAnim=="nothing") 
      { 
       figure.setAnimation("idle"); 
       isJumping = false; 
      } 
      break; 

      default: 
      figure.setAnimation("idle"); 
      break; 
     } 
    } 

    //Stopps Move after Key Released 
    public function stopMove() 
    { 
     if (figure.currentAnim=="walk") 
     {figure.setAnimation("idle");} 
    } 




    //For Char_Collider_fett 
    public function RegisterCharColliderFeet(_event:Event) 
    { 
     aCollider.push(_event.target); 
     _event.target.visible = false; 
    } 



    //Tests Collision with the Object received 
    public function hitBGCollider(_oTest:MovieClip):Char_Collider_feet 
    { 
     var posTest:Point = new Point(); 

     for each (var oCollider:Char_Collider_feet in aCollider) 
     { 
      posTest.x = oCollider.x; 
      posTest.y = oCollider.y; 
      posTest = figure.localToGlobal(posTest); 
      if (_oTest.hitTestPoint(posTest.x,posTest.y,true)) 
      { 
       return oCollider; 
      } 
     } 
     return null; 
    } 


    //Falls every Frame until Collision 
    public function Fall(collision:Boolean) 
    { 
     if (collision) 
     { 
      gravity *= 1.1; 
      figure.y +=2*gravity; 
     } 
    } 

} 
} 

回答

0

我不知道你使用的是什麼樣的發動機,但它看起來像問題是在這裏

public var BG:MovieClip; 
public var Platform:Platform_Collider; 

我認爲應該是怎樣的?

public var BG:Platform_Collider; 

所以這個現在看起來like'll工作

char.hitBGCollider(BG); 
+0

沒有,同樣的問題:/不知它不會找到我的對撞機,但不知道爲什麼... – Fuby

+0

還可以,但你要討論這個問題在引擎的論壇上。因爲我認爲這是你的引擎的一個具體問題。也許你需要那樣的東西? 'public var BG:Platform_Collider = new Platform_Collider(這裏可能需要一些參數);' –

+0

你的引擎是什麼意思? Flash CS5,動作腳本3 ....以及有趣的是它與公共變量BG:MovieClip;但沒有了,所以我嘗試了不同的東西......它在我的其他項目上的作品雖然... – Fuby