libGDX - Опит за прилагане на сблъсък между 2 спрайта

какво казва заглавието основно

Малко предистория за текущата игра: Играчът винаги се движи отляво надясно, ако екрана се докосне, той скача, ако се плъзне, той се втурва напред. Добавих плочка (обект Платформа) и сега се опитвам да накарам моя играч да спре да се движи, ако я удари.

Играчът започва в долния ляв ъгъл на екрана, а платформата е в горния десен ъгъл. Това, което се случва е, че играчът спира, когато достигне средата на екрана, а не действителната платформа. Може ли някой да погледне моя код и да види дали може да разбере защо? Ще бъде високо оценено.

public class Platform extends GameObject {
private Rectangle playerRect;
private Rectangle platformRect;
private Player player;
private boolean isOverlapping;

public Platform(Sprite spr) {
    super(spr);
    player = Player.getInstance(null); // Initialises the Player class (a Singleton)
// Set position of sprite
    setxPos(getWidth() - 400);
    setyPos(getHeight() / 2 - 100);
    spr.setX(getxPos()); 
    spr.setY(getyPos()); 

}

public void update() {
// Rectangle of Player
    playerRect = new Rectangle(player.getxPos(), player.getyPos(), player
            .getSprite().getWidth() + player.getxPos(), player.getSprite()
            .getHeight() + player.getyPos());
// Rectangle of Platform
    platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth()
            + getxPos(), getSprite().getHeight() + getxPos());

// Make Player stop moving if the two rectangles collide
    isOverlapping = playerRect.overlaps(platformRect);
    if (isOverlapping) {
        player.setxSpeed(0);

    }
}
    }

Задържам се на това за известно време, благодаря предварително за всяка информация


person DeuceDeuce    schedule 23.11.2014    source източник


Отговори (2)


е това, което можете да видите, ако правоъгълниците са там, където мислите, и ако играчът спре, като се сблъска или по друг начин опита нещо, поставям го в актуализация, но можете да поставите където и да е другаде, рисувайте и т.н.

Надявам се, че разбирате.

Променлив клас.

   private ShapeRenderer sRDebugRectangelPlayer = new ShapeRenderer();
   private ShapeRenderer sRDebugRectangelPlatform = new ShapeRenderer();

   private Rectangle playerRect = new Rectangle();
   private Rectangle platformRect = new Rectangle();

Вашият метод

public Platform(Sprite spr) {
super(spr);
player = Player.getInstance(null); // Initialises the Player class (a Singleton)
// Set position of sprite
setxPos(getWidth() - 400);
setyPos(getHeight() / 2 - 100);
spr.setX(getxPos()); 
spr.setY(getyPos()); 

//add

// Rectangle of Player
playerRect = new Rectangle(player.getxPos(), player.getyPos(),
                           player.getSprite().getWidth(),
                           player.getSprite().getHeight());

// Rectangle of Platform
platformRect = new Rectangle(getxPos(), getyPos(), 
                             getSprite().getWidth(), 
                             getSprite().getHeight());
}

Вашият метод

public void update() {

playerRect.setPosition(player.getxPos(), player.getyPos());
platformRect.setPosition(getxPos(), getyPos());



// Make Player stop moving if the two rectangles collide

isOverlapping = playerRect.overlaps(platformRect);

if (isOverlapping) {
        player.setxSpeed(0);
}
}

//добавете за тест в актуализация или теглене

sRDebugRectangelPlayer.begin(ShapeType.Filled);
sRDebugRectangelPlayer.identity();

sRDebugRectangelPlayer.rect(player.getxPos(), player.getyPos(),
                           player.getSprite().getWidth(),
                           player.getSprite().getHeight());

sRDebugRectangelPlayer.end();

//добавяне за тестова актуализация или теглене

sRDebugRectangelPlatform.begin(ShapeType.Filled);
sRDebugRectangelPlatform.identity();

sRDebugRectangelPlatform.rect(getxPos(), getyPos(), 
                             getSprite().getWidth(), 
                             getSprite().getHeight());

sRDebugRectangelPlatform.end();
person Angel Angel    schedule 23.11.2014
comment
Благодаря за отговора. Опитах вашия код, но не виждам никакви правоъгълници и сега спрайтът не спира (няма откриване на сблъсък). Все още не съм постигнал успех с рисуването на правоъгълник в Android хаха - person DeuceDeuce; 24.11.2014
comment
няма значение, сложих го в draw() и работи. Благодаря много! редактиране: правоъгълниците са на правилното място, но сблъсъкът не е открит хаха - person DeuceDeuce; 24.11.2014
comment
добре, трябваше да инициализирам правоъгълниците в метода update(), сега всичко работи. Благодаря отново - person DeuceDeuce; 24.11.2014
comment
@DeuceDeuce Радвам се, че работихте, но не можете да го направите инициализирано в конструктора? и актуализирано в актуализацията, защото в противен случай ще ги създавате при всяка актуализация и мисля, че би било по-малко ефективно, по-добре вярвайте, че актуализирате само позиции, - person Angel Angel; 24.11.2014
comment
@DeuceDeuce и не ги създавайте при всяко обаждане, актуализирайте го само моето мнение, съжалявам за моя английски - person Angel Angel; 24.11.2014

конструктор на класа Rectangle изисква x, y, ширина, височина

Но вие му предоставяте координати на противоположни ъгли.

Сменете

// Rectangle of Player
playerRect = new Rectangle(player.getxPos(), player.getyPos(), player
        .getSprite().getWidth() + player.getxPos(), player.getSprite()
        .getHeight() + player.getyPos());

// Rectangle of Platform
platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth()
        + getxPos(), getSprite().getHeight() + getxPos());

с

// Rectangle of Player
playerRect = new Rectangle(player.getxPos(), player.getyPos(),
                           player.getSprite().getWidth(),
                           player.getSprite().getHeight());

// Rectangle of Platform
platformRect = new Rectangle(getxPos(), getyPos(), 
                             getSprite().getWidth(), getSprite().getHeight());

Надявам се това да помогне.

person Tanmay Patil    schedule 23.11.2014
comment
Благодаря за отговора, все още имам същия проблем. - person DeuceDeuce; 23.11.2014