Я пытаюсь сделать что-то вроде Piano Tiles в студии android, и я хочу, чтобы плитки начинали появляться, когда кнопка воспроизведения нажимается с той же скоростью - PullRequest
0 голосов
/ 13 июля 2020

Я делаю это с помощью handler.postdelayed, но всякий раз, когда я начинаю нажимать на плитки, отложенные после задержки не работают, иногда это происходит быстро, а иногда и медленно. Вот код частного обработчика mhandler = new Handler ();

private Runnable mcontinue = new Runnable() {
    @Override
    public void run() {

        //row5
        RockLocationRow5 = RockLocationRow4;
        setRockLocation(RockLocationRow5, 5);

        //row4
        RockLocationRow4 = RockLocationRow3;
        setRockLocation(RockLocationRow4, 4);

        //row3
        RockLocationRow3 = RockLocationRow2;
        setRockLocation(RockLocationRow3, 3);

        //row2
        RockLocationRow2 = RockLocationRow1;
        setRockLocation(RockLocationRow2, 2);

        //row1
        RockLocationRow1 = r.nextInt(3) + 1;
        setRockLocation(RockLocationRow1, 1);
        mhandler.postDelayed(this, 3000);

    }
};

Я вызываю его в функции initgame всякий раз, когда игра запускается, и если я нажимаю на любую плитку, я также вызываю это Runnable их

iv_13.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(RockLocationRow1 == 3){
                mcontinue.run();
       }
            else{
                //endGame();
            }
        }
    });

или их что-нибудь еще, что я могу использовать ?? Я новичок ...

так инициализируется RockLocationRow

    //row3
    RockLocationRow3 = 1;
    iv_31.setImageResource(tapImage);
   
    //row2
    RockLocationRow2 = r.nextInt(3) + 1;
    setRockLocation(RockLocationRow2, 2);

    //row1
    RockLocationRow1 = r.nextInt(3) + 1;
    setRockLocation(RockLocationRow1, 1);

и это setRockLocation

     private void setRockLocation(int place, int row){
        if(row == 1){
           iv_11.setImageResource(emptyImage);
           iv_12.setImageResource(emptyImage);
           iv_13.setImageResource(emptyImage);

        switch (place) {
            case 1:
                iv_11.setImageResource(tapImage);
                break;
            case 2:
                iv_12.setImageResource(tapImage);
                break;
            case 3:
                iv_13.setImageResource(tapImage);
                break;
        }
    }

то же самое для строки 2,3,4 и 5

1 Ответ

0 голосов
/ 13 июля 2020

Думаю, я нашел проблему. Проблема в том, когда вы нажимаете плитку. Если я хорошо понял, этот код выглядит следующим образом:

iv_13.setOnClickListener(new View.OnClickListener() {
  //rest of your code...
});

Видите ли, когда вы нажимаете на плитку, вы вызываете метод run () of Runnable : mcontinue.run();

Вызывая этот метод, вы выполняете AGAIN postDelayed: mhandler.postDelayed(this, 3000); Итак, для каждого щелчка по плитке вы выполняете postDelayed. В результате каждые 3 секунды С ВРЕМЕНИ ВЫ НАЖАТИЛИ ПЛИТКУ , будут появляться новые плитки. Если вы нажмете много плиток, postDelayed будет выполняться много раз, а плитки будут отображаться быстро.

Решение, которое может быть правильным, - удалить mcontinue.run(); при щелчке по плитке. Вот так:

iv_13.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(RockLocationRow1 == 3){
            }
            else {
                //endGame();
            }
        }
    });

Пожалуйста, не стесняйтесь комментировать любые свои мысли / вопросы по этой проблеме, и я помогу, чем смогу.
...