【问题标题】:1067: Implicit coercion of a value of type theplayclass to an unrelated type main1067:将类型为 theplayclass 的值隐式强制转换为不相关的类型 main
【发布时间】:2013-06-30 04:16:54
【问题描述】:

我需要帮助,因为我想创建一个显示分数的游戏结束屏幕。但是,有一个错误阻止我将分数从 theplayclass.as 转移到 thegameoverclass.as。有没有办法将值传递给另一个影片剪辑而不会导致任何错误。

我参考了这个网站的源代码:http://www.emanueleferonato.com/2008/12/17/designing-the-structure-of-a-flash-game-as3-version/

这是错误

C:\Users\xxx\Downloads\Migrate\test\theplayclass.as,第 54 行,第 41 列 1067:将类型为 theplayclass 的值隐式强制转换为不相关的类型 main。

main.as

 package  
 {

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

public class main extends MovieClip
{
    public var playClass:theplayclass;
    public var gameOverClass:thegameoverclass;

    public function main() 
    {
        showWin();

    }

    public function showWin()
    {           
        playClass = new theplayclass(this);
        addChild(playClass);            
    }

    public function showGameOver()
    {
        gameOverClass = new thegameoverclass(this);
        addChild(gameOverClass);

        removeChild(playClass);
        playClass = null;
    }
    }
}

playclass.as

 package  
 {
import flash.display.MovieClip;
import flash.events.*;

public class theplayclass extends MovieClip 
{
    private var mainClass:main;
    var gameScore:Number;
    var gameOverScore:thegameoverclass;

    public function theplayclass(passedClass:main)
    {           
        mainClass = passedClass;

        scoreText.text ="0";

        gameScore = 0;



        win.addEventListener(MouseEvent.CLICK, showwinFunction);
        next.addEventListener(MouseEvent.CLICK, showgameoverFunction);

        addEventListener(Event.ADDED_TO_STAGE, addToStage);
        addEventListener(Event.ENTER_FRAME, changeScore);

    }

    public function addToStage(e:Event):void
    {
        this.x = 0;
        this.y = 0;
    }

    private function showwinFunction(e:MouseEvent):void
    {
        gameScore+=50;
    }

    private function changeScore(e:Event):void
    {
        scoreText.text =""+gameScore;
    }


    public function showgameoverFunction(e:MouseEvent)
    {
        mainClass.showGameOver();

        gameOverScore = new thegameoverclass(this);
        gameOverScore.setTextScore(gameScore);

    }

    }
 }

thegameoverclass.as

package  
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.*;

public class thegameoverclass extends MovieClip 
{
    var mainClass:main;
    var scorePoints:Number;

    public function thegameoverclass(passedClass:main) 
    {
        mainClass = passedClass;
        finalScore.text = "test";
    }

    public function setTextScore(textToSet:Number)
    {
        finalScore.text = ""+scorePoints;
    }

    }

  }

【问题讨论】:

  • thegameoverclass 的 mainClass 没有被使用,为什么不移除呢?或者 theplayclass 包含一个变量 mainClass,你想将它用于 thegameover 构造函数吗?
  • @Pan 我想使用gameoverclass构造函数。 playclass 下的变量 mainClass 无法删除,因为我需要将 main 中的方法传递给 playclass。无论如何,在我从gameoverclass中删除mainClass并删除gameoverclass和playerclass中的所有参数后,我有错误#1009,说它无法访问空对象引用的属性或方法。
  • Pan 有点指出了原始错误的原因,但要说清楚:在 PlayerClass 中,您将游戏显示在屏幕上:gameOverScore = new thegameoverclass(this); 但应该是这样:gameOverScore = new thegameoverclass(mainClass); .错误表明它无法将您的 PlayerClass 转换为 Main 类。
  • @SunilD。谢谢它帮助!现在下一个挑战是如何设置确保游戏结束类显示来自玩家类的分数,因为当我播放电影剪辑时,它在游戏结束场景中显示 NaN。

标签: actionscript-3 oop reference pass-by-reference coercion


【解决方案1】:

关于你的最新一期(在游戏结束屏幕上看到 NaN 的分数),看看游戏结束时你的代码在做什么:

  • 播放器类调用Main.showGameOver()
  • 玩家类在屏幕上制作新游戏
  • 玩家类在新游戏结束屏幕上设置最终分数

在 Main.showGameOver() 中:

  • 您制作了一个新的游戏结束屏幕并将其添加到舞台,但现在这与您的 Player 类中的游戏不同
  • 这个新的屏幕游戏从未设置过最终得分(因此得分为NaN

解决此问题的一种方法:

  • 从您的 Player 类中删除所有对游戏结束屏幕的引用
  • 修改 main 中的 showGameOver() 方法,使其接受分数
  • 修改 Player 类,以便使用 Main.showGameOver() 传递最终分数
  • 修改 Main 中的 showGameOver() 方法,使其在游戏结束屏幕上设置分数

您修改后的代码可能如下所示:

播放器类:

public function showgameoverFunction(e:MouseEvent)
{
    mainClass.showGameOver(gameScore.toString());
}

主类:

public function showGameOver(finalScore:String)
{
    gameOverClass = new thegameoverclass(this);
    gameOverClass.setScoreText(finalScore);
    addChild(gameOverClass);
    removeChild(playClass);
    playClass = null;
}

【讨论】:

  • 谢谢!它有效:) 我确实按照您的步骤操作,但我通过将所有参数从字符串更改为整数进行了一些编辑。接下来,我在 gameoverclass.as 中更改了名为 setTextScore 的方法以接受参数。无论如何,非常感谢您的帮助。我从你身上学到了很多。顺便说一句,是否可以让 play 类将游戏分数发送到 gameover 类,而不是将分数发送到 main 类和 gameover 类?
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2011-10-19
  • 2016-09-24
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多