2015-06-09 1 views
1

Создание Android-игры 2d.
... У персонажа есть препятствия, где он не должен идти.
Basicaly она реализуется как:Холст Android. содержит (x, y) для овала?

RectF obstacle1 = new RectF(100, 150, 200, 300); 
Paint paint = new Paint(); 
barPaint.setColor(Color.argb(130, 255, 255, 255)); 
canvas.drawRect(obstacle1, paint); 

// stopping the character in case of getting to the obstacle 

if (obstakle1.contains(currentXCoordinate, currentYCoordinate) { 
    theCharacter.stop(); 
} 
//... 

и отлично работает для прямоугольных - в виде препятствий.

Но я должен использовать овальные препятствия.
Если я сделать то же самое и просто нарисовать овал:

RectF ovalObstacle = new RectF(100, 400, 500, 800); 
Paint paint = new Paint(); 
barPaint.setColor(Color.argb(130, 255, 255, 255)); 
// drawing oval 
canvas.drawOval(ovalObstacle, paint); 

// stopping the character in case of getting to the obstacle  
if (ovalObstacle.contains(currentXCoordinate, currentYCoordinate) { 
    theCharacter.stop(); 
} 

персонаж остановится, когда он достигнет RectF, а не сам по себе (светлый круг на PrintScreen) овальный (print screen

Есть способ использовать что-то вроде метод содержит (х, у) для овала? чтобы выяснить, когда персонаж достигнет овал или сам круг?

или как осуществить это?

ответ

0

Следующая проверка Метод ли точка находится в овале или нет.

public boolean pointInEllipse(Point test, Point center, int width, int height) { 
     int dx = test.x - center.x; 
     int dy = test.y - center.y; 
     return (dx * dx)/(width * width) + (dy * dy)/(height * height) <= 1; 
    } 

Я получил ссылку от here

enter image description here

+0

правый, но ширина вы имеете в виду, что радиус в x и высота - это радиус в y –

+0

здесь ширина относится к полуосновной оси, а высота относится к полу малая ось. – Kartheek

+0

Спасибо, хорошая идея. Работает, но с 2-кратным увеличением радиуса. Выяснить, что не так –

0

Вам нужно использовать Phytagoras.

float delPos=(player.x-obstacle.x)*(player.x-obstacle.x)+ 
      (player.y-obstacle.y)*(player.y-obstacle.y); 
if(delPos<=radius*radius) 
{ 
    //collision 
} 

Не использовать Math.sqrt(), потому что это слишком медленно!

Этот метод не предназначен для овалов, но его легче использовать круглый hitbox. сделать вашу жизнь проще !!!

для эллипса его, как

boolean collision=(player.x - obstacle.x)²/obstacle.width/2² + 
        (player.y - obstacle.y)²/obstacle.height/2² <=1; 
if(collision) 
{ 
    //collision 
} 
+0

спасибо, будет пытаться это –

+0

работает, но для радиуса большего, чем он на самом деле. Что вы подразумеваете под переменной радиуса? Я это овальный, если бы это был радиус1 * радиус2? –

+0

нет, верхний - только для круга, как я сказал, нижний для эллипса –

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