Android 改变物体下落的速度

Android 改变物体下落的速度,android,Android,我正在制作一款Android游戏,在增加分数时遇到了一些问题 有2个物体,一个放在屏幕中央,一个物体落在屏幕的底部。 当物体掉下来通过屏幕中间的物体时,它增加一个点。 当我将下落物体的速度设置为skullY+=5或skullY+=10时,一切正常,分数被加到分数中,但如果我将速度更改为skullY+=7或skullY+=12,则速度会更快,通过时不会增加分数 这就是我目前遇到的问题 这是我的活动代码: //BOX AND SKULL X AND Y private float boxX, bo

我正在制作一款Android游戏,在增加分数时遇到了一些问题

有2个物体,一个放在屏幕中央,一个物体落在屏幕的底部。

当物体掉下来通过屏幕中间的物体时,它增加一个点。

当我将下落物体的速度设置为skullY+=5skullY+=10时,一切正常,分数被加到分数中,但如果我将速度更改为skullY+=7skullY+=12,则速度会更快,通过时不会增加分数

这就是我目前遇到的问题

这是我的活动代码:

 //BOX AND SKULL X AND Y
private float boxX, boxY;
private float skullX, skullY;
private float skullX1, skullY1;

//BOX SKULL PICTURES
private ImageView box;
private ImageView skull, skull1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_play_state);
    decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

    frame = (RelativeLayout) findViewById(R.id.frame);

    txtTimer = (TextView) findViewById(R.id.txtTimer);
    txtScore = (TextView) findViewById(R.id.txtScore);

    box = (ImageView) findViewById(R.id.box);
    skull = (ImageView) findViewById(R.id.skull);
    skull1 = (ImageView) findViewById(R.id.skull1);

    startCountDownTimer();
}

public void startTimer() {
    timer = new Timer();
    initializeTimerTask();
    timer.schedule(timerTask, 100, 20);
}

public void stoptimertask() {
    if (timer != null) {
        timer.cancel();
        timer = null;
    }
}

public void initializeTimerTask() {
    timerTask = new TimerTask() {
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    goDownBoxAndSkull();
                }
            });
        }
    };
}


//FUNCTIONS FOR BOX AND SKULL TO GO DOWN
public void goDownBoxAndSkull() {

    //SKULL FUNCTIONS
    //SCORE CHECK TO SET NEW SPEED
    if (scoreCount >= 0 && scoreCount < 5) {

        skullY += 5;

        if (skullY > frame.getHeight()) {
            newXposition = (int) box.getX();

            skullY = -150.0f;
            skullX = newXposition;
        }
        if (skullX < 0) {
            skullX = 0;
        }
        skull.setX(skullX);
        skull.setY(skullY);
    }

    if (scoreCount >= 5 && scoreCount < 1000) {
        skull1.setVisibility(View.VISIBLE);

        skullY += 10;
        skullY1 += 10;

        if (skullY > frame.getHeight()) {
            newXposition = (int) box.getX();

            skullY = -150.0f;
            skullX = newXposition;
        }
        if (skullX < 0) {
            skullX = 0;
        }

        if (skullY1 > frame.getHeight()) {
            newXposition = (int) box.getX();

            skullY1 = -150.0f;
            skullX1 = newXposition;
        }
        if (skullX1 < 0) {
            skullX1 = 0;
        }
        skull.setX(skullX);
        skull.setY(skullY);

        skull1.setX(skullX1);
        skull1.setY(skullY1);
    }

    //CHECK IF BOX PASSED SKULL TO ADD SCORE
    if (skull.getY() == box.getY()) {
        scoreCount++;
        txtScore.setText("SCORE: " + String.valueOf(scoreCount));
    }
    if (skull1.getY() == box.getY()) {
        scoreCount++;
        txtScore.setText("SCORE: " + String.valueOf(scoreCount));
    }



    //BOX FUNCTIONS
    if (tapped == true) {
        boxX -= 5;
    } else {
        boxX += 5;
    }

    //BOX GOING TO LEFT
    if (boxX < 0) {
        boxX = 0;
    }

    //BOX GOING TO RIGHT
    if (boxX > frame.getWidth() - box.getWidth())
    {
        boxX = frame.getWidth() - box.getWidth();
    }
    box.setX(boxX);
}

 //COUNTDOWN TIMER TO START
public void startCountDownTimer()
{
    new CountDownTimer(3000, 1000) {
        public void onTick(long millisUntilFinished) {
            txtTimer.setText("GAME WILL START IN \n" + millisUntilFinished / 1000);
        }
        public void onFinish() {
            startTimer();

            txtScore.setText("SCORE: " + String.valueOf(scoreCount));
            txtTimer.setVisibility(View.GONE);
            txtScore.setVisibility(View.VISIBLE);
            box.setVisibility(View.VISIBLE);
            skull.setVisibility(View.VISIBLE);

            //SET RANDOM START POSITION FOR SKULL
            newXposition = r.nextInt(frame.getWidth());
            skullX = newXposition;
            skull.setX(skullX);

            //SET BOX IN THE MIDDLE
            boxX = frame.getWidth() / 2;
            boxY = frame.getHeight() / 2;
            box.setX(boxX);
            box.setY(boxY);
         }
    }.start();
}
//盒子和头骨X和Y
私人浮动boxX,方形;
私人浮雕头骨,头骨;
私人浮标skullX1、skullY1;
//方块头骨图片
专用图像查看框;
private ImageView头骨,头骨1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u play\u state);
decorView=getWindow().getDecorView();
decorView.setsystemivilibility(
View.SYSTEM\u UI\u FLAG\u布局\u稳定
|View.SYSTEM\u UI\u FLAG\u布局\u隐藏\u导航
|View.SYSTEM\u UI\u FLAG\u布局\u全屏显示
|View.SYSTEM\u UI\u FLAG\u HIDE\u导航
|View.SYSTEM\u UI\u FLAG\u全屏显示
|视图。系统\用户界面\标志\沉浸式\粘性);
frame=(RelativeLayout)findViewById(R.id.frame);
txtTimer=(TextView)findViewById(R.id.txtTimer);
txtScore=(TextView)findViewById(R.id.txtScore);
box=(ImageView)findViewById(R.id.box);
头骨=(图像视图)findViewById(R.id.头骨);
skull1=(ImageView)findViewById(R.id.skull1);
startCountDownTimer();
}
公共无效startTimer(){
定时器=新定时器();
initializeTimerTask();
时间表(timerTask,100,20);
}
公共无效stoptimertask(){
如果(计时器!=null){
timer.cancel();
定时器=空;
}
}
public void initializeTimerTask(){
timerTask=新的timerTask(){
公开募捐{
handler.post(新的Runnable(){
公开募捐{
goDownBoxAndSkull();
}
});
}
};
}
//盒子和头盖骨向下移动的功能
公共无效仓库箱和骷髅(){
//颅骨功能
//设置新速度的分数检查
如果(scoreCount>=0&&scoreCount<5){
skullY+=5;
如果(skullY>frame.getHeight()){
newXposition=(int)box.getX();
skullY=-150.0f;
skullX=新位置;
}
如果(头骨<0){
skullX=0;
}
骷髅座(skullX);
骷髅。赛蒂(骷髅);
}
如果(scoreCount>=5&&scoreCount<1000){
skull1.setVisibility(View.VISIBLE);
skullY+=10;
头骨1+=10;
如果(skullY>frame.getHeight()){
newXposition=(int)box.getX();
skullY=-150.0f;
skullX=新位置;
}
如果(头骨<0){
skullX=0;
}
if(skullY1>frame.getHeight()){
newXposition=(int)box.getX();
skullY1=-150.0f;
skullX1=新位置;
}
如果(skullX1<0){
skullX1=0;
}
骷髅座(skullX);
骷髅。赛蒂(骷髅);
skull1.setX(skullX1);
skull1.setY(skull1);
}
//检查框是否通过以添加分数
if(skull.getY()==box.getY()){
scoreCount++;
setText(“分数:+String.valueOf(scoreCount));
}
if(skull1.getY()==box.getY()){
scoreCount++;
setText(“分数:+String.valueOf(scoreCount));
}
//盒函数
如果(抽头==真){
boxX-=5;
}否则{
boxX+=5;
}
//盒子往左走
如果(boxX<0){
boxX=0;
}
//盒子往右转
if(boxX>frame.getWidth()-box.getWidth())
{
boxX=frame.getWidth()-box.getWidth();
}
box.setX(boxX);
}
//开始倒计时
public void startCountDownTimer()
{
新的倒计时(3000,1000){
公共void onTick(长毫秒未完成){
setText(“游戏将在\n”+millisuntillfinished/1000后开始);
}
公共无效onFinish(){
startTimer();
setText(“分数:+String.valueOf(scoreCount));
txtTimer.setVisibility(View.GONE);
txtScore.setVisibility(View.VISIBLE);
box.setVisibility(View.VISIBLE);
头骨。设置可见性(视图。可见);
//设置头骨的随机起始位置
newXposition=r.nextInt(frame.getWidth());
skullX=新位置;
骷髅座(skullX);
中间设置盒
boxX=frame.getWidth()/2;
boxY=frame.getHeight()/2;
box.setX(boxX);
长方体(长方体);
}
}.start();
}

代码很宽,但如果我理解,请在此处添加分数:

if (skull.getY() == box.getY()) {
        scoreCount++;
        txtScore.setText("SCORE: " + String.valueOf(scoreCount));
    }
    if (skull1.getY() == box.getY()) {
        scoreCount++;
        txtScore.setText("SCORE: " + String.valueOf(scoreCount));
    } 
在第一种情况下,使用increment,使每一个都是方框位置的倍数,从而满足
=
条件

在第二种情况下,它们不是倍数,这可能导致永远不满足条件

只需执行以下操作即可解决:

if (skull.getY() >= box.getY() && skull.scoreCounted == false) {
        skull.scoreCounted = true;
        scoreCount++;
        txtScore.setText("SCORE: " + String.valueOf(scoreCount));
    }
    if (skull1.getY() >= box.getY() && skull1.scoreCounted == false) {
        skull.scoreCounted = true;
        scoreCount++;
        txtScore.setText("SCORE: " + String.valueOf(scoreCount));
    }
编辑:假设您有一个
skull.scoreCounted
公共布尔标志,您可以使用它来了解该框的点是否已被考虑


代码有点不清楚,我无法确定比较应该是
=
还是
=先生,实际上是因为我设置了
=
条件。当我使用
skull.getY()>=box.getY()
时,分数会继续增加吗