草庐IT

Android AndEngine : sprite. detachSelf() 不删除 Sprite

coder 2023-12-07 原文

我正在制作小型气球游戏。气球随机弹出并在一段时间后消失。当我点击它们时,我想让它们消失并显示 +1 而不是气球。当我点击气球时,我想取消附加气球 Sprite 。 我的问题是当我在代码中调用 sprite.detachSelf() 时, Sprite 只是消失了,但实际上 Sprite 并没有被删除。它只会变得不可见。当我再次点击那个地方时,气球会出现,即使气球消失后它也会显示 +1。这意味着我认为气球没有正确脱离。

这是我的代码:

@Override
protected Scene onCreateScene() {

    //this.mEngine.registerUpdateHandler(new FPSLogger());
    scene = new Scene();

    backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion,
            getVertexBufferObjectManager());
    backgroundSprite.setSize(CAMERA_WIDTH, CAMERA_HEIGHT);
    scene.attachChild(backgroundSprite);
    scene.unregisterTouchArea(backgroundSprite);

    text = new Text(0, 0, font, "Score : 00",
            getVertexBufferObjectManager());
    scene.attachChild(text);

    textTime = new Text(displayMetrics.widthPixels - 220, 0, font,
            "00 : 60", getVertexBufferObjectManager());
    scene.attachChild(textTime);

    timer = new TimerClock(1, new TimerClock.ITimerCallback() {
        TimerClock t = timer;
        public void onTick() {
            System.out.println("timer inside");
            if (time > 0) {
                time = time - 1;
                System.out.println("timer inside : " + time);
                scene.detachChild(textTime);
                textTime = new Text(displayMetrics.widthPixels - 220, 0,
                        font, "00 : " + time,
                        getVertexBufferObjectManager());
                if (time < 10) {
                    textTime.setColor(1, 0, 0);
                }
                scene.attachChild(textTime);
                deleteSpriteSpawnTimeHandler(sprite);

            }
            else{
                scene.unregisterUpdateHandler(this.t);
            }

        }
    });
    this.mEngine.registerUpdateHandler(timer);

    createSpriteSpawnTimeHandler();
    return scene;
}

private void deleteSpriteSpawnTimeHandler(final IEntity ball) {
    TimerHandler spriteTimerHandler1;
    final Engine e = mEngine;
    this.getEngine().registerUpdateHandler(
            spriteTimerHandler1 = new TimerHandler(0.5f, true,
                    new ITimerCallback() {
                        @Override
                        public void onTimePassed(
                                final TimerHandler spriteTimerHandler1) {
                            spriteTimerHandler1.reset();

                            deleteSprite(ball);
                        }
                    }));
}

private void gameOverSpawnTimeHandler() {
    TimerHandler spriteTimerHandler1;
    final Engine e = mEngine;
    this.getEngine().registerUpdateHandler(
            spriteTimerHandler1 = new TimerHandler(60, true,
                    new ITimerCallback() {


                        @Override
                        public void onTimePassed(
                                final TimerHandler spriteTimerHandler1) {
                            spriteTimerHandler1.reset();

                            timeDue = 0;
                            scene.detachChild(textComment);
                            textComment = new Text(CAMERA_WIDTH / 2 - 100,
                                    CAMERA_HEIGHT / 2, font,
                                    "Game Over...!!!",
                                    getVertexBufferObjectManager());
                            textComment.setColor(1.0f, 0.0f, 0.0f);
                            scene.attachChild(textComment);

                            SharedPreferences myPrefs = getApplicationContext().getSharedPreferences("myPrefs",
                                            MODE_WORLD_READABLE);
                            SharedPreferences.Editor prefsEditor = myPrefs.edit();

                            String score1 = myPrefs.getString("SCORE1", "0");
                            String score2 = myPrefs.getString("SCORE2", "0");

                            int scoreInt1 = Integer.parseInt(score1);
                            int scoreInt2 = Integer.parseInt(score2);

                            System.out.println("session in" + score1 + " "
                                    + score2);
                            currScore = totalScore;

                            if (currScore > scoreInt1 && currScore > scoreInt2) {
                                prefsEditor.clear();
                                prefsEditor.commit();
                                prefsEditor.putString("SCORE1", String.valueOf(currScore));
                                prefsEditor.putString("SCORE2", String.valueOf(scoreInt1));
                                prefsEditor.commit();
                            } else if (currScore < scoreInt1 && currScore > scoreInt2) {
                                prefsEditor.clear();
                                prefsEditor.commit();
                                prefsEditor.putString("SCORE1", String.valueOf(scoreInt1));
                                prefsEditor.putString("SCORE2", String.valueOf(currScore));
                                prefsEditor.commit();
                            } else {

                            }

                        }
                    }));
}

private void createSpriteSpawnTimeHandler() {
    TimerHandler spriteTimerHandler;

    final Engine e = mEngine;
    this.getEngine().registerUpdateHandler(
            spriteTimerHandler = new TimerHandler(0.75f, true,
                    new ITimerCallback() {
                        @Override
                        public void onTimePassed(
                                final TimerHandler spriteTimerHandler) {
                            spriteTimerHandler.reset();

//                              scene.detachChild(backgroundSprite);
//                              scene.attachChild(backgroundSprite);

                            // Random Position Generator
                            final float xPos = MathUtils.random(50.0f,
                                    (CAMERA_WIDTH - 50.0f));
                            final float yPos = MathUtils.random(75.0f,
                                    (CAMERA_HEIGHT - 75.0f));
                            gameOverSpawnTimeHandler();
                            if (timeDue > 0) {
                                createSprite(xPos, yPos);
                            }else{
                                //scene.unregisterUpdateHandler(spriteTimerHandler);
                            }
                        }
                    }));
}

private void createSpriteTextSpawnTimeHandler() {
    TimerHandler spriteTimerHandler;

    final Engine e = mEngine;
    this.getEngine().registerUpdateHandler(
            spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, true,
                    new ITimerCallback() {
                        @Override
                        public void onTimePassed(
                                final TimerHandler spriteTimerHandler) {
                            spriteTimerHandler.reset();

                            if (totalScore > 50 && totalScore < 60) {
                                textComment = new Text(150, 100, font,
                                        "Ohhhh...you are doing good.",
                                        getVertexBufferObjectManager());
                                textComment.setColor(1.0f, 0.0f, 0.0f);
                                scene.attachChild(textComment);
                            }
                            deleteSpriteSpawnTimeHandler(textComment);

                            // e.getScene().detachChild(backgroundSprite);
                            // e.getScene().attachChild(backgroundSprite);
                        }
                    }));
}

private void createSprite(final float pX, final float pY) {

    sprite = new Sprite(pX, pY, this.mrball, getVertexBufferObjectManager()) {
        Engine e = mEngine;
        TextureRegion gball = mgball;
        float x = pX;
        float y = pY;
        private int score = totalScore;
        private Text textComment;;

        @Override
        public boolean onAreaTouched(
                org.andengine.input.touch.TouchEvent pSceneTouchEvent,
                float pTouchAreaLocalX, float pTouchAreaLocalY) {

            if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) {
                this.e.getScene().detachChild(this);
                if (timeDue > 0) {
                    mBrushDrawingSound.play();
                    totalScore = totalScore + 1;
                    String score = "Score : " + totalScore;
                    scene.detachChild(text);
                    text = new Text(0, 0, font, score,
                            getVertexBufferObjectManager());
                    scene.attachChild(text);

                    //sprite.detachSelf();
                    createSpriteTextSpawnTimeHandler();

                    textScorePlus = new Text(x, y, font, "+1",
                            getVertexBufferObjectManager());
                    scene.attachChild(textScorePlus);
                    scene.unregisterTouchArea(textScorePlus);

                    deleteSpriteSpawnTimeHandler(textScorePlus);
                }
            } else if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP) {
            }

            // e.getScene().unregisterTouchArea(sprite);
            return true;
        }
    };
    spriteBalloon.add(sprite);
    sprite.setSize(100, 100);
    sprite.setAlpha(0.8f);
    Random randomGenerator = new Random();
    red = randomGenerator.nextInt(255);
    green = randomGenerator.nextInt(255);
    blue = randomGenerator.nextInt(255);
    sprite.setColor(red, green, blue);
    scene.registerTouchArea(sprite);
    scene.attachChild(sprite);
    deleteSpriteSpawnTimeHandler(sprite);
}

private void deleteSprite(IEntity pBall) {
    IEntity gball = pBall;
    scene.detachChild(gball);;
}

最佳答案

当你附着的时候,你需要分离;当你scene.registerTouchArea(sprite)时,你需要scene.unregisterTouchArea(sprite)

关于Android AndEngine : sprite. detachSelf() 不删除 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12724893/

有关Android AndEngine : sprite. detachSelf() 不删除 Sprite的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  6. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  7. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  8. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  9. ruby - 我可以删除 Ruby 中的方法别名吗? - 2

    假设我有一段Ruby代码,我想在其中为一个方法设置别名(我不知道为什么;让我们假设我有一个很好的理由)。classStringalias_method:contains?,:include?end我可以在本节之后删除这个别名吗? 最佳答案 remove_method在大多数情况下应该有效。但是,如果您的alias_method覆盖了现有方法,您可能需要通过单独的alias_method调用来保存原始方法。#assuming:contains?isalreadyamethodalias_method:original_contains

  10. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

随机推荐