这是我第一次在StackOverflow上发布内容,而这只是因为我觉得这是其中一次,我无法从庞大的互联网上找到我需要的东西!
我目前正在制作一个Android应用程序,这是一个游戏,我有一个球是一个imageview,每次我点击球,它移动到一个随机的位置,我已经建立了这个方法:
private void changePos() {
RelativeLayout gameLayout = findViewById(R.id.gameFrame);
int frameHeight = gameLayout.getHeight();
int frameWidth = gameLayout.getWidth();
Random ballLocationY = new Random();
int ballY = ballLocationY.nextInt(frameHeight);
Random ballLocationX = new Random();
int ballX = ballLocationX.nextInt(frameWidth);
gameLayout.setY(ballY);
gameLayout.setX(ballX);
}
所以我正在努力的是每次点击减少计时器。 我想要做的是每按一下球一定比例减少计时器。
基本上每次用户点击球时,计时器从0开始向上计数并以秒和毫秒计数,并且在3秒时标记游戏结束。
这是我正在玩的方法:
Runnable updateThreadTimer = new Runnable() {
@Override
public void run() {
timeInMilliseconds = System.Clock.uptimeMillis() - startTime();
updateTime = timeSwapBuff + timeInMilliseconds;
int secs = (int) (updateTime / 1000);
countDownText.setText("" + String.format("%2d", secs) + ":"
+ String.format("%3d", timeInMilliseconds));
mHandler.postDelayed(this, 0);
if (secs == 3 && timeInMilliseconds >= 3000) {
timeSwapBuff += timeInMilliseconds;
mHandler.removeCallbacks(updateThreadTimer);
}
}
}
必要的变量:
long startTime = 0L, timeInMilliseconds = 0L, timeSwapBuff = 0L, updateTime = 0L;
Handler mHandler = new Handler();
然后我在Overridden onCreate方法中有这个:
ball.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
changePos();
startTime = SystemClock.uptimeMillis();
mHandler.postDelayed(updateThreadTimer, 0);
}
return true;
}
}
所以我得到的是一个计时器,每次点击按钮都会重置为0,然后重新开始。并且计时器以秒和毫秒显示:0:0000,这是我想要的,但我希望每次点击减少一定比例并更新时间。 因此,让我们说计数器以3秒的限制开始,在点击几次球之后,计时器最终会下降,如果计时器超过那个时间,游戏就会失败。
显然,为了直截了当,我已经简化了很多代码。 我想知道是否有人对如何处理我遇到的问题有任何建议。
如果问题没有得到正确处理,我还要道歉,这是第一次发帖,如果有任何问题,请留下建议。继续!
而且我还想再提一次,我已经四处寻找这样的解决方案了,而且我放在一起的代码来自很多不同的来源,所以我觉得我很喜欢完成了我的研究,无法找到任何东西,因此我转向StackOverflow!
答案 0 :(得分:0)
所以我想我会回答我自己的问题,因为我现在已经解决了这个问题,也希望这可以解决一些问题。
我重新编写了代码的某些部分并抓住了Runnable方法,而是采用了一种使用CountDownTimer类的方法。
private long currentTime;
private long maxTimer = 3000;
private double fivePercent = .05;
private CountDownTimer myTimer = null;
protected void onCreate(Bundle savedInstanceState) {
// Some code...
// Assign 3000 to currentTime
currentTime = maxTimer;
ball.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
if (myTimer != null) {
// Cancel timer
myTimer.cancel();
// Calculating 5 % from maxTimer
long a = (long) (maxTimer * fivePercent);
maxTimer -= a;
// Storing new maxTimer in currentTime
currentTime = maxTimer;
}
myTimer = new CountDownTimer(currentTime, 1) {
@Override
public void onTick(long millisUntilFinished) {
countDownText.setText("Time: " + String.valueOf(millisUntilFinished));
currentTime = millisUntilFinished;
}
@Override
public void onFinish() {
Intent intent = new Intent(getApplicationContext(), ResultsActivity.class);
GameActivity.this.startActivity(intent);
}
}.start();
changePos();
scoreLabel.setText("Score: " + score++ + "");
}
return true;
}
});
}
我已经简化了代码以用于演示目的,但基本上我所做的是创建一个CountDownTimer,每当我点击球时,CountDownTimer将被取消,并调用一个新的,然后创建一个新的CountDownTimer它将计算5%并将结果放入新的CountDownTimer。