2013-07-29 4 views
0
private void gotoPos() 
{ 
    spaceX = x2 - x; 
    spaceY = y2 - y; 
    if (Math.abs(spaceX) >= Math.abs(spaceY)) { 
     xSpeed = Math.round(spaceX * (3/Math.abs(spaceX))); 
     ySpeed = Math.round(spaceY * (3/Math.abs(spaceX))); 
    } 

С помощью этого кода я хочу переместить объект в положение x2 и y2. x и y - текущая позиция объекта. spaceX - это пространство, которое находится между объектом и положением x, на которое оно должно идти. То же самое для spaceY.Android Math не работает

Но я не хочу, чтобы объект перемещался более чем на 3 пикселя за ничью.

Пример: положение объекта: х = 35, у = 22

Точка он должен перейти к: x2 = 79, y2 = 46

пространство между ними: SpaceX = 79-35 = 44, Спейси = 46-22 = 24

SpaceX больше, то Спейси так:

xSpeed ​​= 44 * (3/44) = 3, ySpeed ​​= 24 * (3/44) = 1,63 = 2

Но это не так. Когда я запускаю приложение, объект не переходит к x2 и y2. Если я изменю xSpeed ​​= spaceX; ySpeed ​​= spaceY;

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

Полный код:

public class Sprite 
{ 
private boolean walking = true; 
private int actionWalk = 0; 
private Random rnd; 
private int checkIfAction; 
private int nextAction = 0; 
static final private int BMP_COLUMNS = 4; 
static final private int BMP_ROWS = 4; 
private int[] DIRECTION_TO_SPRITE_SHEET = { 1, 0, 3, 2 }; 
public int x=-1; 
private int y=-1; 
public int xSpeed; 
private int ySpeed; 
private int width; 
private int height; 
private int bottomSpace; 
private Bitmap bmp; 
private GameView theGameView; 
private int currentFrame=0; 
private int x2, y2; 
private boolean isTouched; 
private int spaceX, spaceY; 

D

public Sprite(GameView theGameView, Bitmap bmp) 
{ 
    this.theGameView = theGameView; 
    this.bmp = bmp; 
    this.width = bmp.getWidth()/BMP_COLUMNS; 
    this.height = bmp.getHeight()/BMP_ROWS; 
    rnd = new Random(); 
    xSpeed = 0; 
    ySpeed = 0; 
} 

public void shareTouch(float xTouch, float yTouch) 
{ 
    x2 = (int) xTouch; 
    y2 = (int) yTouch; 
    isTouched = true; 
} 
    private void gotoPos() 
{ 
    spaceX = x2 - x; 
    spaceY = y2 - y; 
    if (Math.abs(spaceX) >= Math.abs(spaceY)) { 
     xSpeed = Math.round(spaceX * (3/Math.abs(spaceX))); 
     ySpeed = Math.round(spaceY * (3/Math.abs(spaceX))); 
    } 
    else { 
     xSpeed = spaceX; 
     ySpeed = spaceY; 
    } 
} 

D

private void bounceOff() 
{ 
    bottomSpace = theGameView.getHeight() - y; 
    if (x > theGameView.getWidth() - (width * theGameView.getDensity()) - xSpeed - bottomSpace/2 || x + xSpeed < bottomSpace/2) 
    { 
     xSpeed = -xSpeed; 
    } 
    x = x + xSpeed; 
    if (y > theGameView.getHeight() - (height * theGameView.getDensity()) - ySpeed || y + ySpeed < theGameView.getHeight()/2) 
    { 
     ySpeed = -ySpeed; 
    } 
    y = y + ySpeed; 
    currentFrame = ++currentFrame % BMP_COLUMNS; 
} 

d

public void onDraw(Canvas canvas) 
{ 
    if (x == -1) 
    { 
     x = (theGameView.getWidth()/2); 
     y = (theGameView.getHeight()/2 + theGameView.getHeight()/4); 
    } 
    if (isTouched == true) 
    { 
     gotoPos(); 
    } 
    /*  if (nextAction == 100) 
    { 
    action(); 
    nextAction = 0; 
    } 
    nextAction += 1;*/ 
    bounceOff(); 
    int sourceX, sourceY; 
    if (walking == true) 
    { 
     sourceX = currentFrame * width; 
    } 
    else 
    { 
     sourceX = 0; 
    } 
    sourceY = getAnimationRow() * height; 
    Rect source = new Rect(sourceX, sourceY, sourceX + width, sourceY + height); 
    Rect destine = new Rect(x, y, (int) (x + (width * theGameView.getDensity())), (int) (y + (height * theGameView.getDensity()))); 
    canvas.drawBitmap(bmp, source, destine, null); 
} 

d

private int getAnimationRow() 
{ 
    double directionDouble = (Math.atan2(xSpeed, ySpeed)/(Math.PI/2) + 2); 
    int spriteDir = (int) Math.round(directionDouble) % BMP_ROWS; 
    return DIRECTION_TO_SPRITE_SHEET[spriteDir]; 
} 

}

+0

какая у вас задержка между рамками чертежа? – user902383

+0

опубликовать полные коды .. Это может произойти из-за метода 'onCreate'. В нем должна быть какая-то ошибка. –

+0

20 Fps so 50 миллисекунд – Stupe

ответ

1

Простая задача: использовать целочисленную арифметику и не понимают этого:

spaceX * (3/Math.abs(spaceX)) 

Результат будет 0 почти во всех случаях как 3/x с x > 3 является 0 все время.

Чтобы ваша программа работала либо с арифметикой с плавающей запятой, либо переписала ваши формулы, чтобы они работали должным образом.

Для использования с плавающей точкой arithetic вы должны изменить к

spaceX * (3.0/Math.abs(spaceX)) 

при условии, что вы переменная spaceX также с плавающей точкой.

Также вы можете использовать

(spaceX * 3)/Math.abs(spaceX) 

, если вы хотите, чтобы остаться с целыми числами (то, что я полагаю).

+0

Большое спасибо – Stupe

0

заданных точек Vector2d (х, у) и б Vector2d (х2, у2) -

Создание вектора В от к б путем вычитания б из a как и вы. Нормализовать вектор V в единичный вектор и умножить его на нужное расстояние. Затем добавьте полученный вектор в точку a.

На обновление:

a.add(b.subtract(a).norm().multiply(d)); 

В зависимости от реализации вектора, изменить должным образом приведенный выше код псевдо.

0

В коде есть логическая ошибка: что делать, если Math.abs(spaceX) < Math.abs(spaceY))? Тогда ваш объект не двигался вообще.

То, что вы вычисляете, 'x-distance/y-distance', обычно считается углом, а не скоростью. Скорость - это «расстояние/время». Вы можете рассчитать расстояние, и вы должны выбрать разумную скорость для своего объекта. Поскольку вы знаете свой fps-20, вы можете рассчитать, сколько пикселей ваш объект должен перемещать в каждом кадре.

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