所以我正在制作一个游戏,用户将四只手放在屏幕上,在屏幕上的那些触摸上产生四个圆圈,并在这些上方指示偏移。指示器在特定圆圈上熄灭,并且用户需要触摸以增加其分数并返回到他们从其抬起手指的圆圈。我有四个变量来处理每个手指的得分,原因是稍后使用它们作为统计数据,游戏的递增部分按原样运行。但是,我的问题是在递减时,有时每个圆圈的分数会正确递减,但大多数时候它没有正确地进行。
以下是我目前遇到问题的代码段:
public void scoreDeducter(OrthographicCamera cam, float elapsedTime,
int currentIndex) {
//the for loop iterating over the 4 circles on the screen
for (int placerIndex = 0; placerIndex < placerCoordinates.length; placerIndex++) {
Vector3 placerVector = new Vector3(
placerCoordinates[placerIndex].x,
placerCoordinates[placerIndex].y, 0);
cam.unproject(placerVector);
//the currentIndex is where the indicator has gone green and so to avoid
//the score to decrement for that pointer we don't execute the inner loop
//as we would like to increment score on touch up.
if (currentIndex != placerIndex) {
//goes through the various touch coordinates currently on the screen
for (int pointer = 0; pointer < 5; pointer++) {
Vector3 touchVector = new Vector3(Gdx.input.getX(pointer),
Gdx.input.getY(pointer), 0);
//we unproject the pointer's coordinates x and y
cam.unproject(touchVector);
//this is the distance between the placer (circle) and the touch on the screen
//for the pointer
float distance = placerVector.dst(touchVector.x,
touchVector.y, 0);
int radius = 20;
//checks whether this pointer has been touched
boolean isCurrentTouched = Gdx.input.isTouched(pointer);
//boolean isCurrentTouched = Gdx.input.isTouched();
//if the distance is less than the circle's radius and is touched
//then we know that the person hasn't made an error, therefore we skip the
//pointer to 5, without making any further checks whether it is touched or not.
if (distance < radius && isCurrentTouched) {
pointer = 5;
}
//otherwise should the pointer's value be 4 and the if statement
//condition above fails we decrement the score off a circle as they
//lifted their finger on the placer where the indicator hasn't gone green
else if (pointer == 4) {
if (elapsedTime >= 5.0f && !isCurrentTouched) {
if (placerIndex == 0 && f1Score != 0) {
f1Score = f1Score - 1;
}
if (placerIndex == 1&& f2Score != 0) {
f2Score = f2Score - 1;
}
if (placerIndex == 2 && f3Score != 0) {
f3Score = f3Score - 1;
}
if (placerIndex == 3 && f4Score != 0) {
f4Score = f4Score - 1;
}
}
}
}
}
}
}
然后在我的GameRenderer类中以render方法呈现:
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
System.out.println("f1 score: " + world.getFingerPlacer().getF1Score()
+ " f2 score: " + world.getFingerPlacer().getF2Score()
+ " f3 score: " + world.getFingerPlacer().getF3Score()
+ " f4 score: " + world.getFingerPlacer().getF4Score());
// System.out.println("f1 Errors: " + f1Errors + " f2 Errors: " +
// f2Errors + " f3Errors: " + f3Errors + " f4Errors: " + f4Errors);
// System.out.println("The score: "+
// world.getFingerPlacer().getTotalScore());
if ((!world.getFingerPlacer().arePlacersFilled() && !world
.getIndicator().areIndicatorsFilled()) && Gdx.input.isTouched()) {
world.getFingerPlacer().addFingerPlacers();
world.getIndicator().generateCoords();
}
if (world.getFingerPlacer().arePlacersFilled()
&& world.getIndicator().areIndicatorsFilled()) {
// we sort the lists so that the indicators match with the
// corresponding placers
world.bubblesort(world.getFingerPlacer().getPlacerCoords());
world.bubblesort(world.getIndicator().getIndicatorCoords());
// the rendering of the placers take place
renderFingerPlacers();
renderIndicators();
renderIndicatorColour(delta);
timeKeeper(delta);
}
}
我的scoreDeducter()方法在renderIndicatorColour方法中被调用:
public void renderIndicatorColour(float delta) {
shapeRenderer.begin(ShapeType.Filled);
shapeRenderer.setColor(50 / 130f, 210 / 130f, 56 / 130f, 1f);
Vector3 touchVector = new Vector3(world.getIndicator()
.getIndicatorCoords()[index].x, world.getIndicator()
.getIndicatorCoords()[index].y, 0);
camera.unproject(touchVector);
shapeRenderer.rect(touchVector.x, touchVector.y, 20, 10);
shapeRenderer.end();
elapsedTime += delta;
justTouchedUp = Gdx.input.getInputProcessor().touchUp(
(int) world.getFingerPlacer().getPlacerCoords()[index].x,
(int) world.getFingerPlacer().getPlacerCoords()[index].y, 0, 0);
if (justTouchedUp) {
wasTouchedUp = true;
}
world.getFingerPlacer().scoreDeducter(camera, elapsedTime, index);
}
提前谢谢。