创造掉球

时间:2015-08-01 17:22:46

标签: android

当按下播放按钮开始游戏(活动)时,我想创建一个从屏幕顶部掉落的球的实例(球稍后会击中某个东西)。我不知道该怎么做。有人可以帮忙吗?

到目前为止我正在使用的是什么:

public class GameActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Turn title off
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // set Game to fullscreen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        View ballView = new BallView(this);
        setContentView(ballView);
        // ballView.setBackgroundColor(Color.TRANSPARENT);
    }
}

public class BallView extends View {

    // Ball attributes
    private float ballRadius = 30;
    private float ballX = 50;
    private float ballY = 50;
    private RectF ballBounds;
    private Paint ballColor;
    // For game elements
    private int score = 0;

    public BallView(Context context){
        super(context);
        // Initialize game elements
        ballBounds = new RectF();
        ballColor = new Paint();
        this.setFocusableInTouchMode(true);
    }

    public void onDraw(Canvas canvas){
        // Draw ball
        ballBounds.set(ballX - ballRadius, ballY - ballRadius, ballX + ballRadius, ballY + ballRadius);
        ballColor.setColor(Color.RED);
        canvas.drawOval(ballBounds, ballColor);
    }
}

1 个答案:

答案 0 :(得分:0)

根据您的意图描述,您应该使用OpenGL或内置物理和碰撞检测的libgdx这样的框架。

但是要回答你的问题,你试试这个简单的例子:

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
import android.view.ViewTreeObserver;

public class BallView extends View{

    // Ball attributes
    private float ballRadius = 30;
    private float ballX = 50;
    private float ballY = 50;
    private float ballSpeed = 10.0f;
    private RectF ballBounds;
    private Paint ballColor;
    boolean doBallAnimation = false;
    // For game elements
    private int score = 0;
    ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
    long startTime, prevTime; // Used to track elapsed time for animations and fps

    public BallView(Context context){
        super(context);
        // Initialize game elements
        ballBounds = new RectF();
        ballColor = new Paint();
        this.setFocusableInTouchMode(true);

        getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener(){
                    @Override
                    public void onGlobalLayout(){
                        getViewTreeObserver().removeOnGlobalLayoutListener(this);

                        ballY = 0;
                        ballX = (getWidth()- ballRadius) / 2.0f;

                        doBallAnimation = true;
                        animator.start();
                    }
                }
        );

        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
            @Override
            public void onAnimationUpdate(ValueAnimator arg0){
                long nowTime = System.currentTimeMillis();
                float secs = (float)(nowTime - prevTime) / 1000f;
                prevTime = nowTime;

                if((ballY + ballSpeed) > (getHeight() - (ballRadius)))
                {
                    animator.cancel();
                    return;
                }

                ballY += ballSpeed;

                // Force a redraw to see the ball in its new position
                invalidate();
            }
        });
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setDuration(3000);
    }

    public void onDraw(Canvas canvas){
        // Draw ball
        if(doBallAnimation)
        {
            ballBounds.set(ballX - ballRadius, ballY - ballRadius, ballX + ballRadius, ballY + ballRadius);
            ballColor.setColor(Color.RED);
            canvas.drawOval(ballBounds, ballColor);
        }
    }
}