gpt4 book ai didi

actionscript-3 - TouchEvent.TOUCH_BEGIN, onTouchBegin 在几次重新加载后卡住

转载 作者:行者123 更新时间:2023-12-04 12:52:27 25 4
gpt4 key购买 nike

我正在构建一个 Adob​​e Air AS3 IOS 和 Android 应用程序,其中我在舞台中央有一个电影剪辑。当您开始触摸此影片剪辑时,您可以在舞台各处移动它。
这就是我这样做的方式:

            Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
MC_M1.alpha = 1;
MC_M1.addEventListener(Event.ENTER_FRAME, ifHitAct);
MC_M1.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
MC_M1.x = 0.516 * gameIntro.stageWidthToUse;
MC_M1.y = 0.75 * gameIntro.stageHeightToUse;
MC_M1.height = 0.2 * gameIntro.stageHeightToUse;
MC_M1.width = MC_M1.height / 1.4;
gameIntro.STAGE.stage.addChildAt(MC_M1,1);

function onTouchBegin(event:TouchEvent)
{
trace("TouchBegin");
if (touchMoveID != 0)
{
trace("It Did Not");
return;
}
touchMoveID = event.touchPointID;

gameIntro.STAGE.stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
gameIntro.STAGE.stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
}
function onTouchMove(event:TouchEvent)
{
if (event.touchPointID != touchMoveID)
{
return;
}
//trace("Moving")
MC_M1.x = event.stageX;
MC_M1.y = event.stageY;
}
function onTouchEnd(event:TouchEvent)
{
if (event.touchPointID != touchMoveID)
{
return;
}
//trace("Ending");
touchMoveID = 0;
gameIntro.STAGE.stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
gameIntro.STAGE.stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd);
}

当玩家真正失去游戏时,我实际上在做的是以下几点:
MC_M1.removeEventListener(Event.ENTER_FRAME , ifHitAct);
MC_M1.removeEventListener(TouchEvent.TOUCH_BEGIN , onTouchBegin);
gameIntro.STAGE.stage.removeChild(MC_M1);
MC_M1.alpha = 0;
isDead = 1;
replayButToUse.x = 0.127 * gameIntro.stageWidthToUse;
replayButToUse.y = 0.91 * gameIntro.stageHeightToUse;
replayButToUse.addEventListener(MouseEvent.CLICK, gotoIntro);

这一切都发生在一个名为:introClassToUse 的类中。
所以当用户松开时,他会得到一个重播按钮,当他点击它时,他会回到同一个类并重新加载所有内容,使用以下代码:
function gotoIntro(event:MouseEvent):void
{

replayButToUse.removeEventListener(MouseEvent.CLICK, gotoIntro);
replayButToUse.alpha = 0;
replayButToUse.removeEventListener(MouseEvent.CLICK, gotoIntro);
stop();
var reload:introClassToUse = new introClassToUse();

}

所以一切都会重新加载,游戏重新开始。我的问题是,当我倾向于重玩游戏超过 2-3 次时,我面临着一种非常奇怪的行为。 MC_M1 只是停止收听任何触摸事件,但继续收听 ENTER_FRAME 事件,其中我一直触摸 MC_M1 但它似乎没有响应。我什至用我的 iPhone 远程调试了它,对于前几次回放,我可以看到 trace("TouchBegin");它的结果是向我显示 TouchBegin,但经过几次重播后,触摸事件就卡住了。我错过了什么?

非常感谢任何帮助,我是 AS3 的新手,我需要学习,这样我才能管理更多

编辑 1:

我在任何框架上都没有代码,我只有很多 AS 类。
fla 文件链接到名为 gameIntro 的 AS 类。在这个类中,我链接了以下内容:
- STAGE 是 Stage 类型的对象。
- gameIntro.STAGE = 舞台
稍后,当用户单击播放按钮时,我调用类 introClassToUse。这个类具有所有的游戏功能。上面的所有代码都在 introClassToUse 中。当用户松开并单击重播按钮时,他将转到“goToIntro”功能,我记得 introClassToUse。
一切正常,实现了其他几个计时器,唯一的问题是在几次重播后,MC_M1 只是卡住了
每次用户丢失并在我回调 introClassToUse 时重新添加它们时,我都会删除 MC_M1,因为我尝试使用 .visible 属性,它根本不起作用(这就是我使用 gameIntro.STAGE 的原因.stage.removeChild(MC_M1)

最佳答案

我知道这个问题很老,但也许有人仍然想知道这里发生了什么(比如我)。
您的代码中有很多问题,但我认为您的问题的根源从这里开始:

function gotoIntro(event:MouseEvent):void{
//...
var reload:introClassToUse = new introClassToUse();
}
  • 如果简单地创建一个实例对您的程序没有任何作用,并且在这种情况下您甚至不需要将其分配给变量,这通常是不受欢迎的行为。
  • 您提到此代码位于您的 introClassToUse类(class)。这基本上意味着您正在旧的游戏中创建新的游戏实例,这似乎是完全错误的。

  • 您应该考虑在您的类定义中只使用实例属性并创建 new introClassToUse()在外部类(class)中;

    您没有包含有关您的代码的许多重要细节,例如
  • 整个类(class)结构的样子 - 例如,您不能像 MC_M1.addEventListener(Event.ENTER_FRAME, ifHitAct); 这样放置行在您的类(class)范围内,因此显然您在某些功能中有此功能,我们不知道何时何地调用它。
  • 声明和分配变量的位置和方式。很难判断您的 MC_M1是实例或类的属性,是内部/公共(public)/私有(private)/...
  • 您是否将库符号链接(symbolic link)到您的类或从 stage 获取它? .

  • 可能有很多事情可以给你这样的结果。根据您所写的内容,我复制了与您所描述的类似的行为,但使用了鼠标事件和虚拟松散条件。每次您将 mc 部分放在鼠尾草的右边缘之外时,这都会结束游戏,显示重新启动按钮并在您单击它时重新开始(基本上它主要是您的代码)。它可以正常工作大约 10 秒,然后你就不能再移动 mc 了。帧事件仍在跟踪,但触摸/鼠标没有。

    怎么可能?我怀疑你可以只删除某个地方的听众,并将隐形 mc 卡在新的听众上。这很容易被忽视,特别是如果你使用静态属性。同样,我们甚至不知道您的电影剪辑来自哪里,所以我们只能猜测您的代码发生了什么,但我试图举个简单的例子,这就是我的做法。问题可能出在完全不同的地方,但您可以猜测所有情况。

    项目的文档类 - GameIntro.as
    package 
    {
    import flash.display.Sprite;

    public class GameIntro extends Sprite
    {
    //Document class. this need to be compiled with strict mode off.
    public function GameIntro() {

    GameIntro.STAGE = stage;
    GameIntro.stageWidthToUse = stage.stageWidth;
    GameIntro.stageHeightToUse = stage.stageHeight;

    var intro:IntroClassToUse = new IntroClassToUse();
    stage.addChild(intro);
    }

    }
    }

    IntroClassToUse.as
    package
    {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    /**
    * You need to have library symbol linked to this class in .fla with two mcs -
    * mcFromLibrarySymbol (dragable) and repButton (reapatButton)
    */
    public class IntroClassToUse extends MovieClip
    {
    var t = 0; //timer ticks
    var fc:uint = 0; //frames counter
    var isDead = 0;
    var mc;
    static var repButton;
    var logicContex:Timer = new Timer(30);

    public function IntroClassToUse() {
    trace("toUse", GameIntro.stageWidthToUse);
    mc = mcFromLibrarySymbol;
    if(!repButton) repButton = repButtonX;
    logicContex.addEventListener(TimerEvent.TIMER, logicInterval);
    logicContex.start();
    init();
    }

    internal function init() {
    trace("init");
    mc.alpha = 1;
    mc.addEventListener(Event.ENTER_FRAME, onFrame);
    mc.addEventListener(MouseEvent.MOUSE_DOWN, onMDown);
    mc.x = 0.516 * GameIntro.stageWidthToUse;
    mc.y = 0.75 * GameIntro.stageHeightToUse;
    mc.height = 0.2 * GameIntro.stageHeightToUse;
    mc.width = mc.height / 1.4;
    GameIntro.STAGE.stage.addChildAt(mc, 1);
    }

    internal function onLoose() {
    trace("onLoose");
    mc.removeEventListener(Event.ENTER_FRAME , onFrame);
    mc.removeEventListener(MouseEvent.MOUSE_DOWN, onMDown);
    GameIntro.STAGE.stage.removeChild(mc);
    mc.alpha = 0;
    isDead = 1;
    repButton.x = 0.127 * GameIntro.stageWidthToUse;
    repButton.y = 0.91 * GameIntro.stageHeightToUse;
    repButton.addEventListener(MouseEvent.CLICK, onReplay);
    repButton.alpha = 1;
    }

    internal function onReplay(e:MouseEvent):void {
    trace("onReplay");
    repButton.removeEventListener(MouseEvent.CLICK, onReplay);
    repButton.alpha = 0;
    stop();
    new IntroClassToUse();
    }

    internal function onMDown(e:MouseEvent):void {
    trace("mouseDow");
    GameIntro.STAGE.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMMove);
    GameIntro.STAGE.stage.addEventListener(MouseEvent.MOUSE_UP, onMUp);
    }

    internal function onMMove(e:MouseEvent):void {
    mc.x = e.stageX;
    mc.y = e.stageY;
    }

    //you loose the game if you release you mc with part of it over rigth stage edge.
    internal function onMUp(e:MouseEvent):void {
    trace("mouseUp");
    GameIntro.STAGE.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMMove);
    GameIntro.STAGE.stage.removeEventListener(MouseEvent.MOUSE_UP, onMUp);
    trace("Stage:", GameIntro.STAGE.numChildren);
    if (mc.x + mc.width > GameIntro.STAGE.stageWidth) onLoose();
    }

    internal function onFrame(e:Event):void {
    trace("frames", fc++);
    }

    internal function logicInterval(e:TimerEvent):void {
    if (t++ < 300 || !isDead) return;
    init();
    mc.alpha = 0;
    mc.removeEventListener(MouseEvent.MOUSE_DOWN, onMDown);
    isDead = 0;
    }
    }

    }

    关于actionscript-3 - TouchEvent.TOUCH_BEGIN, onTouchBegin 在几次重新加载后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980900/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com