1

簡単な記憶ゲームを書きました。16枚のカード(画像ボタン)の1つをクリックすると、それが裏返され、果物(バナナの写真など)が表示されます。別のカードをクリックすると、裏返され、果物が表示されます。次に、画像が一致した場合、1〜2秒後に、これら2つのタイルが空白に置き換えられます(つまり、ボードから削除されます)。これは、すべてが削除されるまで発生します。また、果物の名前は口頭で読み上げられます。上記のすべてが完全に機能し、最初のカードが裏返され、画像が表示されます。ただし、2番目のカードをクリックすると、果物が表示されることはありません。正しい果物の名前が話されており、最初のカードのクリックと同様のコードを2番目のカードのクリックに使用しました。私がどこで失敗したかわかりますか?

以下の私のコードの重要なセクションは、以下のように表示されます:「// 2つの画像が選択されました!それらは一致しますか?」

最初の画像をクリックすると更新されます。ただし、最初の果物がクリックされた= 2番目の果物がクリックされたかどうかに関係なく、空白のタイルは画像を表示するために「回転」されません。

コード:....続き

    gridview.setOnItemClickListener(new OnItemClickListener() 
    {

         public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
         { 
            int fruitselected = (int)FruitToChooseFromImages.get(position);  


             // start   
                if (position == firstfruitselpos && imagesSelectedThusFar == 1 || fruitselected == R.drawable.blank)
                    {  
                    // (if blank icon clicked) then DO NOTHING
                    }   

                else
                {   // a valid fruit has been selected, so firstly, say the fruit's name
                    int soundtoplaynow = getrightsound(position, fruitselected);
                    SoundManager.playSound(soundtoplaynow, 1);
                    // next
                    if (imagesSelectedThusFar == 0) 
                    {
                        imagesSelectedThusFar = 1;

                        firstfruitselected = fruitselected; firstfruitselpos = position;
                        FruitToDisplayImages.set(position, fruitselected);

                        MyGridviewAdapter1.notifyDataChanged();
                        gridview.invalidateViews();
                        }
                    else // so two images have been selected! do they match?
                    {
                        imagesSelectedThusFar = 0; // has reached 2, so reset to zero
                        secondfruitselected = fruitselected; secondfruitselpos = position;
                        FruitToDisplayImages.set(position, fruitselected);
                        MyGridviewAdapter1.notifyDataChanged();
                        gridview.invalidateViews();

                        try{ Thread.sleep(1500); }catch(InterruptedException e){ }

                        if (firstfruitselected == secondfruitselected) //yes they match
                            {
                            SoundManager.playSound(50, 1);// play happy sound

                            //switch fruit image to blank and display blank at position clicked **
                            FruitToDisplayImages.set(position, R.drawable.blank);
                            FruitToChooseFromImages.set(position, R.drawable.blank);

                            FruitToDisplayImages.set(firstfruitselpos, R.drawable.blank);
                            FruitToChooseFromImages.set(firstfruitselpos, R.drawable.blank);                            
                            MyGridviewAdapter1.notifyDataChanged();
                            gridview.invalidateViews();   

                            fruitleft = (fruitleft - 2);
                            }

                        else // nope, dont match
                        { // you selected the wrong fruit, sorry.
                        SoundManager.playSound(60, 1); // play UNhappy sound
                        try{ Thread.sleep(1500); }catch(InterruptedException e){ }
                        FruitToChooseFromImages.set(firstfruitselpos, firstfruitselected);
                        FruitToDisplayImages.set(firstfruitselpos, R.drawable.blanktile);
                        FruitToDisplayImages.set(secondfruitselpos, R.drawable.blanktile);
                        MyGridviewAdapter1.notifyDataChanged();
                        gridview.invalidateViews();
}   
                    }

            }    

              // end

             if (fruitleft == 0)
                { //end game - add code here
                 SoundManager.playSound(70, 1); // play big happy congrats sound

                }             }
     });

4

1 に答える 1

0

ログステートメントは、すべてが舞台裏で設計どおりに機能していることを示していましたが、私が求めていたようにグリッドビューをアップグレードしませんでした!一般的なトラブルシューティング方法を使用して、このコードを終わりなく変更しましたが、何も機能しませんでした。同じことをしました。

表示する画像をまったくリセットせずに他の場所でビューを更新した後、onclickリスナーのイベントチェーンの後半で、後で更新を要求したときにグリッドビューが正しく更新/表示されることを発見しました。スリープを使用してグリッドビューの更新を遅らせて同じ効果を得ようとした後、これが解決策であると考え、問題を解決できなかったため、タイルの空白またはクリアへのリセットを遅らせて画像を表示できるようにするハンドラーを作成しました。問題が解決しました。

于 2012-06-20T09:50:42.430 に答える