当前位置: 首页 > 知识库问答 >
问题:

与精灵碰撞

饶滨海
2023-03-14

这就是正在发生的事情,游戏不断停止,因为两个圆圈相互碰撞,我正在尝试通过确保ID是正方形ID来防止这种情况,我试图让圆圈碰撞在一起,而忽略碰撞,但它没有这样做,我不知道如何确切地阻止它相互碰撞,只允许它与正方形碰撞。

基本上我想阻止这个圆与另一个圆碰撞,并允许它与正方形碰撞。

任何帮助都会很好谢谢

游戏引擎引擎类

  //collision detection class
   iter = p_group.listIterator(); 
        Sprite spr = null;
        while (iter.hasNext()) {
            spr = (Sprite)iter.next();

            //remove from list if flagged
            if (!spr.getAlive()) {
                iter.remove();
                continue;
            }

            //is collision enabled for this sprite?
            if (spr.getCollidable()) {

                //has this sprite collided with anything?
                if (spr.getCollided()) {

                    //is the target a valid object?
                    if (spr.getOffender() != null) {

                        /*
                         * External func call: notify game of collision
                         * (with validated offender)
                         */
                        collision(spr);

                        //reset offender
                        spr.setOffender(null);
                    }

                    //reset collided state
                    spr.setCollided(false);

                }
            }
        }

这是我在扩展game.engine.engine包的game类中检查冲突的地方。

游戏类

          // all the circles were are set up the same, theres four
          // circletopleft, circletopright, circlebottomleft
          // circle bottom left collides with circle top right
          // theres no diffence between the code of the circles they are all the same
         /*ball*/circleBottomLeft.setCollidable(true);
                circleBottomLeft.setIdentifier(CIRCLEID_3);
                    addToGroup(circleBottomLeft);


                    //init ball sprite
                circleBottomRight.position = new Float2(550, h-550);
                circleBottomRight.setVelocity(new Float2(10.0f, -9.0f));

                    //keep ball inside secreen boundary
                Point size4 = circleBottomRight.getSize();
                circleBottomRight.addAnimation(new ReboundBehavior(new RectF
                    (0 , 0 , w-size4.x, h-size4.y),size4,circleBottomRight.getVelocity()) );

        /*ball*/circleBottomRight.setCollidable(true);
                circleBottomRight.setIdentifier(CIRCLEID_4);
                    addToGroup(circleBottomRight);


}


       //collision class extended from game.engine.Engine
    public void collision(Sprite sprite) {
    // TODO Auto-generated method stub
    final int oneMin = 60;
    final int twoMin = 120;
    final int threeMin = 180;
    final int fourMin = 240;
    final int fiveMin = 300;
    Sprite other = sprite.getOffender();
    Float2 vel = sprite.getVelocity();

    switch (sprite.getIdentifier()) {
    case CIRCLEID_1:    

     vel = sprite.getVelocity();
     other.position.y += 1;
    case CIRCLEID_2:

         vel = sprite.getVelocity();
         other.position.y += 1;
    case CIRCLEID_3:    
         vel = sprite.getVelocity();
         other.position.y += 1;
    case CIRCLEID_4:    
         vel = sprite.getVelocity();
         other.position.y += 1;

        break;
    }

    switch (other.getIdentifier()) {

    case oneMin:
        if (this.getElapsedTime() == oneMin) {

            vel.y = -1;
            sprite.setVelocity(vel);
            sprite.position.y += vel.y*2;

        }
        break;
    case twoMin:
        if (this.getElapsedTime() == twoMin) {
            vel.y = -1;
            sprite.setVelocity(vel);
            sprite.position.y += vel.y*2;

        }
        break;
    case threeMin:
        if (this.getElapsedTime() == threeMin) {
            vel.y = -1;
            sprite.setVelocity(vel);
            sprite.position.y += vel.y*2;

        }
        break;
    case fourMin:
        if (this.getElapsedTime() == fourMin) {
            vel.y = -1;
            sprite.setVelocity(vel);
            sprite.position.y += vel.y*2;

        }
        break;
    case fiveMin:
        if (this.getElapsedTime() == fiveMin) {
            vel.y = -1;
            sprite.setVelocity(vel);
            sprite.position.y += vel.y*2;

        }
        break;  

        case SQUARE_ID:
            //make sure its not touched
            if (other.getIdentifier() == SQUARE_ID &&
                other.getIdentifier() == CIRCLEID_1 ||
            other.getIdentifier() == CIRCLEID_2 || 
            other.getIdentifier() == CIRCLEID_3 ||
            other.getIdentifier() == CIRCLEID_4) {
                stop();
                Log.d("Game", "Collided, I collided with something");
                if (p_paused) {
                    Message msg = handler.obtainMessage();
                    msg.arg1 = 1;
                    handler.sendMessage(msg);

当顶部的两个圆碰撞时,它一直停着(游戏开始417秒时发生了碰撞,它没有碰到正方形。当左下方的圆与右上方的圆发生碰撞时,就会发生这种情况

共有1个答案

程举
2023-03-14
if ( other.getCollided()  == true   && circleTopLeft.getCollided()     == true ||
            other.getCollided()  == true   && circleTopRight.getCollided()    == true || 
            other.getCollided()  == true   && circleBottomRight.getCollided() == true ||
            other.getCollided()  == true   && circleBottomLeft.getCollided()  == true ) {

通过调用它,我能够正确地检查碰撞。

 类似资料:
  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我正在与Pygame一起练习,试图学习类,对象等的一些基本用法。 现在,在http://programarcadegames.com/的帮助下,我正在制作一个基本的平台 我有一个精灵播放器和精灵平台。这些平台也可以是移动平台,它应该在碰撞时移动玩家,但是当玩家移动到其他平台时,会发生一些奇怪的传送,我现在没有看到问题。 基本上,当被推时,玩家在逻辑上没有被移动(至少对我来说是这样)。 非常感谢任何

  • 在get_hit=pyGame.sprite的第82行,我检查sprite碰撞的移动时,它会给出错误提示:“:File”c:\Users\pc\VS_PYTHON_PY\pyGame.PY“。”。spritecollide(Player,敌方,True)文件“C:\python py\lib\site packages\pygame\sprite.py”,第1682行,位于spritecrolli

  • 我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 问题内容: 在pygame中,有没有一种方法来寻找某一方之间的碰撞 一个精灵和另一个精灵的特殊一面?例如,如果 精灵A的顶部与精灵B的底部碰撞,返回True。 我肯定有办法做到这一点,但我找不到任何特别的方法 在文档中。 谢谢! 问题答案: 在PyGame中没有函数来获取侧面碰撞。 但你可以试着用 pygame.Rect.CollipePoint公司 测试是否,,, ,,,, 在里面 (pygam