2014-09-09 3 views
0

Привет, У меня проблема с приложением, которое я создаю для «виртуального набора ударных». Я не буду фантазировать с libgdx. Я буду честен, меня научили », Мне нужно было знать «кем-то, с кем я больше не общаюсь.Отслеживание нескольких нажатий через libgdx и android

Приложение все работает и работает отлично, но когда я использую его на устройстве Android, я не могу нанести удар по двум барабанам/тарелкам, в то же время он просто повторяет звук барабана, который я уже нажимал, я думаю, что я вероятно, не используя лучший метод для отслеживания прессов, но, как сказано, я довольно незнакомый с libgdx, если я вставляю свой код, было бы здорово получить какую-то помощь или совет от вас, ребята!

Вот класс, который запускает свой виртуальный барабан:

package gamebulk.drumkit; 

import java.util.Random; 

import gamebulk.drumkit.DrumKit.DialogListener; 

import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Game; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Input; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.GLCommon; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.math.Rectangle; 
import com.badlogic.gdx.math.Vector3; 

public class DrumScreen implements Screen, ApplicationListener { 

Game game; 

OrthographicCamera guiCam; 
SpriteBatch batcher; 
Rectangle snareBounds; 
Rectangle hihatBounds; 
Rectangle crashBounds; 
Rectangle rideBounds; 
Rectangle bassBounds; 
Rectangle hitBounds; 
Rectangle lowtBounds; 
Rectangle floortBounds; 
Rectangle exitBounds; 
Vector3 touchPoint; 
DialogListener callback; 

float time = 0; 

public final Random rand; 

public DrumScreen (Game game, DialogListener callback) { 
    this.game = game; 

    guiCam = new OrthographicCamera(800, 480); 
    guiCam.position.set(800/2, 480/2, 0); 
    batcher = new SpriteBatch(); 
    snareBounds = new Rectangle (180, 150, 147, 80); 
    hihatBounds = new Rectangle (28, 184, 160, 90); 
    crashBounds = new Rectangle(36, 310, 246, 160);  
    rideBounds = new Rectangle (550, 250, 222, 140); 
    bassBounds = new Rectangle (278, 38, 250, 211); 
    hitBounds = new Rectangle (256, 242, 132, 96); 
    lowtBounds = new Rectangle (410, 240, 130, 92); 
    floortBounds = new Rectangle (494, 128, 178, 118); 
    exitBounds = new Rectangle (704, 384, 64, 64); 
    touchPoint = new Vector3(); 
    this.callback = callback; 
    Gdx.input.setCatchBackKey(true); 
    rand = new Random(); 

} 

public void update (float deltaTime) { 

    handleInput(deltaTime); 

    if (Gdx.input.justTouched()) { 
     guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0)); 


     if (OverlapTester.pointInRectangle(snareBounds, touchPoint.x, touchPoint.y)) { 
      if (rand.nextFloat() < 0.5){ 
       Assets.playSound(Assets.snare1sound);} 
      else{ 
       Assets.playSound(Assets.snare2sound); 
      } 
     } 
     if (OverlapTester.pointInRectangle(hihatBounds, touchPoint.x, touchPoint.y)) { 
      if (rand.nextFloat() < 0.5){ 
       Assets.playSound(Assets.hihat1sound);} 
      else{ 
       Assets.playSound(Assets.hihat2sound); 
      } 
     }    
     if (OverlapTester.pointInRectangle(crashBounds, touchPoint.x, touchPoint.y)) { 
      if (rand.nextFloat() < 0.5){ 
       Assets.playSound(Assets.crash1sound);} 
      else{ 
       Assets.playSound(Assets.crash1sound); 
      } 
     } 
     if (OverlapTester.pointInRectangle(rideBounds, touchPoint.x, touchPoint.y)) { 
      if (rand.nextFloat() < 0.5){ 
       Assets.playSound(Assets.ride1sound);} 
      else{ 
       Assets.playSound(Assets.ride2sound); 
      } 
     } 
     if (OverlapTester.pointInRectangle(bassBounds, touchPoint.x, touchPoint.y)) { 
      if (rand.nextFloat() < 0.5){ 
       Assets.playSound(Assets.bass1sound);} 
      else{ 
       Assets.playSound(Assets.bass2sound); 
      } 
     } 
     if (OverlapTester.pointInRectangle(hitBounds, touchPoint.x, touchPoint.y)) { 
      Assets.playSound(Assets.hitom1sound); 
     } 
     if (OverlapTester.pointInRectangle(lowtBounds, touchPoint.x, touchPoint.y)) { 
      Assets.playSound(Assets.lowtom1sound); 
     } 
     if (OverlapTester.pointInRectangle(floortBounds, touchPoint.x, touchPoint.y)) { 
      Assets.playSound(Assets.floortom1sound); 
     } 

     if (OverlapTester.pointInRectangle(exitBounds, touchPoint.x, touchPoint.y)) { 
      if (callback != null){ 
       callback.showOfferwall2();} 
       Gdx.app.exit(); 
     } 
    } 
} 

private void handleInput(float delta) { 

time += delta; 
if (time > 0.5) { 
if(Gdx.input.isKeyPressed(Input.Keys.BACK)) {     
callback.showOfferwall2(); 
Gdx.app.exit();} 
}  
} 

public void draw (float delta) { 
GLCommon gl = Gdx.gl; 
time += delta; 
gl.glClearColor(1, 1, 1, 1); 
gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
guiCam.update(); 
batcher.setProjectionMatrix(guiCam.combined); 

batcher.enableBlending(); 
batcher.begin(); 
batcher.draw(Assets.drumbackground, 0, 0); 

batcher.draw(Assets.exitbutton, 704, 384); 

batcher.end();  

} 

@Override 
public void render (float delta) { 
update(delta); 
draw(delta); 
} 

@Override 
public void resize (int width, int height) { 
} 

@Override 
public void show() { 
} 

@Override 
public void hide() { 
} 

@Override 
public void resume() { 
} 

@Override 
public void dispose() { 
} 

@Override 
public void pause() { 
// TODO Auto-generated method stub 

} 

@Override 
public void create() { 
// TODO Auto-generated method stub 

} 

@Override 
public void render() { 
// TODO Auto-generated method stub 

} 
} 

Любая помощь в связи с этим было бы фантастическим спасибо заранее.

+0

Первый результат на Google: http://stackoverflow.com/questions/16876877/how-to-track-multiple-touch-events-in-libgdx – lxknvlk

ответ

0

Метод ввода Libgdx getX() возвращает координату x для первой точки касания (также как и первый палец). Метод justTouched() возвращает true для каждого нового события касания (для любого пальца).

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

Libgdx не имеет метода justTouched() для любого другого указателя (он имеет getX(int) и getY(int) метод для проверки координат других указателей). Таким образом, вы, вероятно, захотите сделать свою собственную проверенную прикосновением (предполагая, что вы не хотите переключаться с входного опроса на события, основанные на событиях).

Сначала определите, сколько пальцев вы хотите поддерживать на экране. Его дешев, чтобы поддержать много, поэтому попробуйте 40. Добавить новый переменный класс:

private static final int maxFingers = 40; 

Добавить новый переменный экземпляр для только прикоснулись проверок:

boolean sawTouch[maxFingers]; 

и инициализировать его в конструкторе:

sawTouch = new boolean[40]; 

Теперь вы просто проверить каждый указатель, чтобы увидеть, если трогали, и если да, то где, а затем запускать звуки:

for (int i = 0; i < maxFingers; i++) { 
    if (Gdx.input.isTouched(i)) { 
     if (!sawTouch[i]) { 
     sawTouch[i] = true; // Mark this finger as "seen" for future checks 

     // Figure out where the i'th touch was 
     guiCam.unproject(touchPoint.set(Gdx.input.getX(i), Gdx.input.getY(i), 0)); 

     // XXX put all the code that does OverlapTester.calls here (or put that in a separate function and call it here) 
     } 
     // else already saw the touch .. 
    } else { 
     sawTouch[i] = false; // Finger is gone, any future touch is "new" 
    } 
} 

Или что-то приближается к этому. Я не пробовал компилировать этот код, поэтому у него могут быть опечатки, но, надеюсь, у него есть идея.

+0

Эй спасибо за ответ, у меня возникают некоторые проблемы пытаясь добиться этого, везде, где я размещаю логическое значение, я получаю сообщение об ошибке: Синтаксическая ошибка на токене «maxFingers», удалить этот токен Я пробовал его в нескольких разных местах и ​​не могу понять, ve также попытался взглянуть на учебник libgdx для обработки ввода, но все еще не получил его! – user3618087

+0

Объявление 'maxFingers' должно идти в« классе »в вашем коде (т. Е. Рядом с строкой« public final Random rand; », которая объявляет« rand'). (То же самое с объявлением 'sawTouch'.) –

Смежные вопросы