2014-10-25 2 views
1

Я пытаюсь использовать метод перекрытий, чтобы определить, сталкиваются ли два спрайта, но по какой-то причине он просто не работает. Он всегда возвращает false, даже когда я отчетливо вижу, как спрайты сталкиваются друг с другом.Метод перекрытия прямоугольника libgdx

Самое смешное, что это не первый случай, когда это случается со мной. Я не знаю, почему метод перекрытий не работает.

Вот мой класс Hero, у которого есть метод под названием isCollided.

package world_objects; 

import helpers.Values; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.math.Rectangle; 

/* Created by David Lasry : 10/25/14 */ 
public class Hero{ 
    public enum HeroState { 

     Walking_Forward, 
     Walking_Left, 
     Walking_Right, 
     Dead 
    } 
    public HeroState state; 
    private Rectangle body; 
    private float x,y; 
    public Hero() { 
     x = Values.SCREEN_WIDTH/5; 
     y = Values.SCREEN_HEIGHT/5; 
     body = new Rectangle(x, y, Values.Hero_Width, Values.Hero_Height); 
     state = HeroState.Walking_Forward; 
    } 
    public Rectangle getBody() { 
     return body; 
    } 
    public boolean isCollided(Rectangle rect) { 
     Gdx.app.log("Collision Detected", ""+body.overlaps(rect)); 
     return rect.overlaps(body); 
    } 
    public HeroState getState() { 
     return state; 
    } 
    public float getX() { 
     return x; 
    } 
    public float getY() { 
     return y; 
    } 
    public void setX(float x) { 
     this.x = x; 
    } 
    public void setY(float y) { 
     this.y = y; 
    } 
} 

Как вы можете видеть, я попытался отладить его, выяснив, что такое возвращаемое значение. Каждый раз это ложь, даже когда это должно быть правдой.

Что я могу сделать? Есть ли альтернативный метод, который я могу использовать?

Edit: После отладки немного и пытается выяснить значения двух объектов (Hero, Object) в режиме реального времени, я придумал этот снимок экрана: http://i.gyazo.com/852fea520b060870a4cb5731c21fa833.png. Значение двух объектов в этом же положении находится (X/Y находится в нижнем левом углу):

**Hero X/Y: 64.5,283.40985** 
**Hero WIDTH/HEIGHT: 25,50** 
**Square X/Y: 76.25,0.0** 
**Square WIDTH/HEIGHT: 47.5,309.13348** 

Как вы можете видеть, значение совершенно нормальны. Я не понимаю, где проблема.

+1

Вы должны использовать отладчик. Поместите там точку останова и проверьте значения для обоих прямоугольников, когда они должны перекрываться. Метод работает. – Barodapride

+0

@David Lasry смотрите это, например, http://stackoverflow.com/questions/26332199/libgdx-animation-inside-of-a-rectangle-collison-detection-rectangles/26356382#26356382 –

+0

Я просто посмотрел на координаты прямоугольников и они в порядке! Значения верны, но все равно это не сработает ... –

ответ

0

Я сделал несколько тестов, и все работает так, как ожидалось. Здесь ниже Классе я использовал для тестирования:

Значение держит значения для экрана высоты/ширины и размер актера

public class Values { 
    public static final int SCREEN_HEIGHT = 240; 
    public static final int SCREEN_WIDTH = 400; 
    public static float Hero_Width = 20; 
    public static float Hero_Height = 30; 
} 

Это Hero, похожий на ваш вариант я только что удалил то, что не требуется специально для испытания.

public class Hero { 

    private Rectangle body; 
    private float x, y; 

    public Hero() { 
     x = Values.SCREEN_WIDTH/5; 
     y = Values.SCREEN_HEIGHT/5; 
     body = new Rectangle(x, y, Values.Hero_Width, Values.Hero_Height); 

    } 

    public boolean isCollided(Rectangle rect) { 
     Gdx.app.log("Collision Detected", "" + body.overlaps(rect)); 
     return rect.overlaps(body); 
    } 
} 

*** Герой * в соответствии со значениями, которые я выбрал бы:

body = new Rectangle(80,48,20,30); 

Тогда я сделал 3 теста с этим тестирования кода:

Hero hero = new Hero(); 
Rectangle rectangle = new Rectangle(10, 10, 100, 100); 
// is true 
boolean isCollided = hero.isCollided(rectangle); 

Rectangle rectangle2 = new Rectangle(10, 10, 40, 40); 
// is false 
boolean isCollided2 = hero.isCollided(rectangle2); 

Rectangle rectangle3 = new Rectangle(50, 30, 40, 20); 
// is true 
boolean isCollided3 = hero.isCollided(rectangle3); 

I предположим, что есть некорректные значения, переданные методу isCollide. Как и другие комментарии, попробуйте отладить, какие значения прямоугольника указаны при вызове этого метода. Так или иначе, объект Hero или тест прямоугольник не похожи на вас.

Если это не повлияет на вашу проблему, рассмотрите публикацию дополнительного описания/кода в исходном сообщении.

+0

Я также попытался сделать что-то вроде этого (создав два прямоугольника и проверить, перекрываются ли они) и это сработало. Метод работал. После очередной проверки я понял, что блоки (другие прямоугольники, а не герой) в порядке. Они «коллидируемые», что означает, что они не являются проблемой. Проблема с моим героем, но я не могу точно определить точную проблему. –

2

Проблема, вероятно, в этом - как Ангел Ангел предложил в комментариях - когда вы создаете своего героя, он имеет свои значения местоположения x, y. Тело героя (прямоугольник) также имеет свои собственные значения x, y. Когда он перемещается, вы, вероятно, только обновляете значения x, y героя, а не значения x, y тела или наоборот. Если вы посмотрите на значения с помощью отладчика, вы увидите, что именно происходит.Я предполагаю, что вы посмотрели на неправильные значения и сделали некоторые неправильные предположения, что метод не работает. Я гарантирую вам, что метод перекрытия очень прост и работает. Если вы не знаете, как использовать отладчик, это идеальное время для изучения. Он будет окупиться много раз в будущем, когда вы продолжите разработку своей игры. Если вам не нравится писать тысячи вызовов System.out, чтобы найти каждую маленькую ошибку, с которой вы сталкиваетесь, научитесь использовать отладчик сейчас! Если бы вы знали, как использовать отладчик, эта ошибка могла быть исправлена ​​в течение нескольких минут и без необходимости писать вопрос в переполнении стека.

+0

Большое вам спасибо! Позиция прямоугольника не обновлялась. Теперь пришло время узнать, как использовать отладчик :) –

Смежные вопросы