2013-05-29 2 views
0

Это примерно в третий раз, когда я задал такой вопрос. Я уже прочитал все подобные вопросы, и предыдущая помощь была полезной, но на этот раз я хочу добавить новую функцию в это приложение. У меня есть приложение, которое заставляет мяч перемещаться по кругу.Перемещение объекта по кругу из случайного местоположения

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

Кто-нибудь знает, что я делаю неправильно?

public class DrawingTheBall extends View { 

Bitmap bball; 

int randX, randY; 
double theta; 


public DrawingTheBall(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    bball = BitmapFactory.decodeResource(getResources(), R.drawable.blueball); 

    randX = 1 + (int)(Math.random()*500); 
    randY = 1 + (int)(Math.random()*500); 
    theta = 45; 
} 

    public void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 

    Rect ourRect = new Rect(); 
    ourRect.set(0, 0, canvas.getWidth(), canvas.getHeight()/2); 
    float a = 50; 
    float b = 50; 
    float r = 50; 

    int x = 0; 
    int y = 0; 

    theta = theta + Math.toRadians(2); 


    Paint blue = new Paint(); 
    blue.setColor(Color.BLUE); 
    blue.setStyle(Paint.Style.FILL); 

    canvas.drawRect(ourRect, blue); 

    if(x < canvas.getWidth()){ 

     x = randX + (int) (a +r*Math.cos(theta)); 
    }else{ 
     x = 0; 
    } 
    if(y < canvas.getHeight()){ 

     y = randY + (int) (b +r*Math.sin(theta)); 
    }else{ 
     y = 0; 
    } 
    Paint p = new Paint(); 
    canvas.drawBitmap(bball, x, y, p); 
    invalidate(); 
} 

}

ответ

2

ли вы на самом деле означает, чтобы генерировать новые случайные значения для randX и Ренди на каждом проходе корыта OnDraw()? Если я правильно Вас понял, то этот бит должен быть перемещен в конструктор:

int randX = 1 + (int)(Math.random()*500); 
int randY = 1 + (int)(Math.random()*500); 

редактирование: Кроме того, удалить «ИНТ» s, как так:

randX = 1 + (int)(Math.random()*500); 
randY = 1 + (int)(Math.random()*500); 

Таким образом, будет присваивать значение вашего вместо этого, вместо создания локальных переменных (которые никогда не читаются). Если это не имеет смысла, дайте более ясное объяснение:

class foo { 
    int x = 1;  // this is a class-level variable 
    public foo() { 
     bar1(); 
     System.out.println(x); // result: 1 
     bar2(); 
     System.out.println(x); // result: 2 
    } 
    public void bar1() { 
     int x = 2; // This instantiated a new 
        // local variable "x", it did not 
        // affect the global variable "x" 
    } 
    public void bar2() { 
     x = 2;  // This changed the class var 
    } 
} 
Смежные вопросы