【问题标题】:Cocos2d-android detecting randomly created sprites or rectsCocos2d-android 检测随机创建的精灵或矩形
【发布时间】:2014-01-15 17:53:50
【问题描述】:

我正在 Eclipse 上开发一个 android 游戏,其中一个精灵在多个平台上跳跃以达到顶峰,但我遇到了困难。这是我的情况:我有一个移动的角色精灵(在这种情况下我将其命名为 Sprite1),当我的应用程序启动时,我正在随机位置创建另外 3 个精灵(平台)。应用程序启动时,平台已成功创建。但是没有检测到它们与 Sprite1 之间的碰撞。我尝试了很多解决方案,现在我被困了几天。任何帮助或建议将不胜感激。

我尝试在创建平台时制作矩形,然后使用矩形来检测碰撞,但它们仍然没有碰撞。我使用 Java 语言。 :)

我用它来创建精灵并检测碰撞:

创建平台精灵(这是我随机生成平台的方式,如果这里有错误,我确定我只是复制错误,因为创建或平台精灵正常工作。):

public void addRandomPlatform(){
    Random rand = new Random();
    randPlat = CCSprite.sprite("platform2.png");
    randPlat.setPosition(actualX, actualY);
        actualY -= (int)(randPlat.getContentSize().height*4);
        addChild(randPlat,2);
}

然后我只是在我的应用启动时调用此方法。

检测碰撞:

playerRect = CGRect.make(player.getPosition().x - (player.getContentSize().width /   4.0f),//- (player.getContentSize().width / 2.0f),
                     player.getPosition().y - (player.getContentSize().height / 2.0f),
                 player.getContentSize().width/3.0f,
                 player.getContentSize().height/8.0f);

if(CGRect.intersects(playerRect, randPlat))
    {
       *my codes for stopping the jump*
}

我希望这很清楚。提前致谢!

【问题讨论】:

  • 请添加一些代码。你如何创建精灵,碰撞检测是如何工作的?你用 Box2D 吗?
  • 哦,等等,让我编辑我的帖子并包含一些代码。我不使用 Box2D。感谢您的回复!

标签: java android eclipse cocos2d-android


【解决方案1】:

看起来 randRect 是 CCSprite,而不是 CGRect。您应该以与创建 playerRect 相同的方式创建一个 CGRect(随机平台)。

另外,为什么将播放器的宽度/高度分别除以 3 和 8?我认为这不是您想要的,它导致 playerRect 仅是实际精灵宽度的三分之一和高度的 1/8。

【讨论】:

  • 我尝试在平台随机创建后创建矩形,但仍未检测到碰撞。我将 playerRect 的高度除以 8,因为我只希望检测到播放器的下部(角色的脚)。我有一个案例,当玩家向下(从跳跃)并且他的头部与平台相交时,它停止跳跃。通过减小矩形的高度来解决这个问题。
  • 尝试将两个矩形的 x、y、宽度和高度记录到 Logcat。如果这不能帮助您找到问题,请在两个矩形相交时(在视图上)发布(记录的)值,而不是在代码中。
  • 我尝试记录平台和矩形的 x、y、宽度和高度。 x 和 y 相同,但关于高度和宽度,我无法确定它们的大小是否相同,因为我在获取精灵大小时使用 platform.getScaleX() 和 getScaleY() 而 rect.size.width 和 .size .height 为矩形。
【解决方案2】:
    @Override
    public boolean ccTouchesEnded(MotionEvent event) {
  CGPoint point =  ranSprite.getPosition();// THE POSITION MUST BE YOUR RANDOM SPRITES POSITIONS

        List<CCNode> childsList = this.getChildren();

        for(CCNode childSprite : childsList){

            if(childSprite.getTag() == Constants.PLAYER_TAG   && childSprite.getBoundingBox().contains(point.x, point.y)){


                // Do what ever you want

}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多