2014-02-18 3 views
2

Я хочу сделать небольшую игру для Android-устройств. Все работы ... кроме столкновений с игроком и объектами. Я сделал что-то не так? Я пробовал много методов проверки столкновения. E. g. пересекается, пересекает, содержит и функцию с самодельным испытанием на столкновение.Android Rect Collision

Edit: Моя проблема в том, что ничего не происходит :)

DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); 
    int width = metrics.widthPixels; 
    int height = metrics.heightPixels; 

    private Bitmap player, enemy; 
    private int speedrun=1, x= 0, y = height - height/5, i=1, yg=height - height/5 + 40, xe= 920, xp =width/2 - width/4; 
    private Rect p, e; 
    public static int speed=0; 

//other code 

@Override 
    protected void onDraw(Canvas c) 
    { 
     c.drawColor(Color.CYAN); 
     handelPlayer(); 
     p = new Rect(xp, y, 0, 0); 
     wayrect = new Rect(x, yg, 0, 0); 
     wayrect2 = new Rect(x + width, yg, 0, 0); 
     e = new Rect(xe, yg - 250, 0, 0); 
     c.drawBitmap(enemy, e.left, e.top, null); 
     c.drawBitmap(player, p.left, p.top, null); 
    } 

    public void handelPlayer() 
    { 
     x -= speed*speedrun; 
     xe -= speed*speedrun; 
     if (x + width < 0) 
      x = 0; 
     if (xe < -100) 
      xe = 920; 
     if (MainActivity.touch == 1) 
     { 
      y -= 100;//jump 
      MainActivity.touch = 0; 
      i = 1; 
     } 
     if (y <= height - height/5) 
      y += 3 * i/10; //gravity 
     i++; 

     if (p.intersect(e)) //collosision 
      speedrun = 0; 
    } 
+0

Что пошло не так? –

+0

попробуйте изменить 'p.intersect (e)' на 'Rect.intersects (p, e)'. 'intersect' изменит прямоугольник' p' на пересечение, а 'Rect.intersects (Rect a, Rect b)' просто тест, который, я думаю, является тем, что вы ищете. –

+0

Не забудьте проголосовать за ответ, который вы приняли, если найдете его полезным;) – Agostino

ответ

1

Прежде всего, ваши прямоугольники идет от верхней части плеера растрового изображения в точке (0,0), верхний левый угол вашего устройства. Я понимаю, что вы имели в виду: p = new Rect(xp, y, xp + player.getWidth(), y + player.getHeight()); и то же самое с e, см. Код ниже.

Во-вторых, p.intersect(e) изменяет прямоугольник p на пересечение, если они пересекаются, поэтому вместо этого вы должны использовать Rect.intersects(p, e).

В-третьих, вы проверяете столкновение по старым значениям позиции, так как вы не обновляли прямоугольники после того, как вы изменили позицию.

Быстрое исправление может быть, чтобы переместить тест на пересечение с верхней handelPlayer (минорной ноте: handlePlayer бы правильный способ это заклинание), как это:

protected void onDraw(Canvas c) 
{ 
    c.drawColor(Color.CYAN); 
    handelPlayer(); 
    p = new Rect(xp, y, xp + player.getWidth(), y + player.getHeight());; 
    wayrect = new Rect(x, yg, 0, 0); // These rectangles also has their right bottom corner at (0,0), which might cause problems 
    wayrect2 = new Rect(x + width, yg, 0, 0); 
    e = new Rect(xe, yg - 250, xe + enemy.getWidth(), yg - 250 + enemy.getHeight()) ; 
    c.drawBitmap(enemy, e.left, e.top, null); 
    c.drawBitmap(player, p.left, p.top, null); 
} 


public void handelPlayer() 
{ 
    if (Rect.intersects(p, e)){ //collision 
     speedrun = 0; 
    } 

    x -= speed*speedrun; 
    xe -= speed*speedrun; 
    if (x + width < 0) 
     x = 0; 
    if (xe < -100) 
     xe = 920; 
    if (MainActivity.touch == 1) 
    { 
     y -= 100;//jump 
     MainActivity.touch = 0; 
     i = 1; 
    } 
    if (y <= height - height/5) 
     y += 3 * i/10; //gravity 
    i++; 


} 

Там может быть другая проблема, хотя , поскольку вы еще не описали, что именно происходит.

+0

Я пробовал исправленную версию, но это не исправлено! Моя проблема в том, что ничего не происходит ... поэтому тест на столкновение всегда возвращает флэс! – lolxdfly

+0

В чем проблема? Что происходит/не происходит? –

+0

nothig бывает :) Игрок не останавливается, если сталкивается с другой текстурой! – lolxdfly