Заставьте мяч отскочить и в конце концов придете отдыхать - PullRequest
2 голосов
/ 27 января 2012

Я написал код для перемещения шара по экрану с помощью датчика ориентации. Я хотел, чтобы мяч подпрыгивал, когда он касался нижней части экрана, вроде как под действием силы тяжести. Может ли кто-нибудь помочь с реализацией физики в моем существующем коде? Изменение скорости, похоже, не работает. Вот мой класс мяча:

package perseus.gfx.test;

import everything

public class Ball extends View  {   
RectF lol;
Paint paint, lpaint;
Bitmap bitmap;
Canvas canvas;
private float ballx = 150; 
private float bally = 140;
private double speedx = 0;  
private double speedy = 0; //ignore  
private double accx, accy=0;
private float rad = 20;
private float mult = 0.5f;
private double xv, yv, xS, yS;
int width, height;
int xmax, ymax;
int xmin, ymin;

public Ball(Context context) {
    super(context);
    lol = new RectF();
    paint = new Paint();
    paint.setColor(Color.CYAN);
    lpaint = new Paint();
    lpaint.setColor(Color.GRAY);                
}
public void moveBall()  {

    xv = accx * mult;
    yv = accy * mult;

    xS = xv * mult;
    yS = yv * mult;

    ballx -= xS;
    bally -= yS;

    // Collision detection
    if (ballx + rad > xmax) {

         ballx = xmax-rad;
    }         
    else if (ballx - rad < 0) {

         ballx = rad;
    }
    if (bally + rad > 2*ymax/3) //Shouldn't take up the whole screen 
    {  

        bally = 2*ymax/3 - rad;
    } 

    else if (bally - rad < 0) {

         bally =  rad;
    }                           

    try {
        Thread.sleep(20);
    }   catch(InterruptedException e) {}

    invalidate();   
}
@Override
public void onMeasure(int widthM, int heightM)
{
    width = View.MeasureSpec.getSize(widthM);
    height = View.MeasureSpec.getSize(heightM);
    xmax = width-1;
    ymax = height-1;
    xmin = 0;
    ymin = 0;
    setMeasuredDimension(width, height);
    bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    canvas = new Canvas(bitmap);


}
@Override
public void onDraw(Canvas canvas)
{
    canvas.drawBitmap(bitmap, 0, 0, paint);
    lol.set(ballx - rad, bally-rad, ballx + rad, bally+rad);
    canvas.drawLine(0, 2*height/3, width, 2*height/3, lpaint);
    canvas.drawOval(lol, paint);
    canvas.drawText(xv + " " + yv, 0, height/2, lpaint);
    canvas.save();
    moveBall();
    canvas.restore();

}
}

1 Ответ

1 голос
/ 27 января 2012

Таким образом, ключ состоит в том, чтобы просто добавить немного трения, просто удалить крошечное ускорение (отрицательное!) На каждом шаге в moveBall (). Например.

    float friction = -0.001;

    xv = accx * mult + friction;
    yv = accy * mult + friction;

Затем отрегулируйте переменное трение в соответствии с вашими потребностями. Для столкновения необходимо инвертировать скорость, например, отскок внизу:

    bally = -bally;
...