0

レベルセレクターに問題があります。このフォーラムのチュートリアルで見つけたコードを使用していますが、正しく動作していません。

実際には、ユーザーが再生をマッシュするときに使用している 2 つのシーンがあり、エンジンを 2 番目のシーンに設定すると、ユーザーはレベルをスクロールできます。

次に、ユーザーが戻るボタンを押すと、離れる前に位置を保存してカメラを初期位置に戻し、camer.setCenter(x,y); を使用して元に戻します。

ユーザーがレベルセレクターシーンに戻ると、正しく心配しません。ユーザーがスクロールすると、画面からスクロールし、正常に動作しません。

これが私のコードです。誰かがより良い方法を持っている場合は、お気軽に私と共有してください.

   @Override
            public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {

                    // TODO Auto-generated method stub
                    clickDetector.onTouchEvent(pSceneTouchEvent);
                    surfaceScrollDetector.onTouchEvent(pSceneTouchEvent);

           return true;
            }









                    @Override
                    public void onScrollStarted(ScrollDetector pScollDetector,
                                    int pPointerID, float pDistanceX, float pDistanceY) {
                             // TODO Auto-generated method stub
                distanceX = 0;

                    }




                    @Override
                    public void onScroll(ScrollDetector pScollDetector, int pPointerID,
                                    float pDistanceX, float pDistanceY) {
                            // TODO Auto-generated method stub

                            camera.offsetCenter(-pDistanceX, 0);

                distanceX += pDistanceX;
                    }




                    @Override
                    public void onScrollFinished(ScrollDetector pScollDetector,
                                    int pPointerID, float pDistanceX, float pDistanceY) {
                             if ((distanceX > TURN_PAGE_DISTANCE) && (page > 0))
                 {

                         page--;
                         camera.offsetCenter(distanceX - CAMERA_WIDTH, 0);
                 }
                 else if ((distanceX < -TURN_PAGE_DISTANCE) && (page < LEVEL_PAGES - 1))
                 {

                         page++;
                         camera.offsetCenter(distanceX + CAMERA_WIDTH, 0);
                 }
                 else
                 {

                         camera.offsetCenter(distanceX, 0);
                 }

                    }




                    @Override
                    public void onClick(ClickDetector pClickDetector, int pPointerID,
                                    float pSceneX, float pSceneY) {
                             //loadLeve(levelClicked);
                    }

                     private void createHUD()
                    {
                            // 不用考虑层
                            hud = new HUD();
                            Rectangle hudBox = new Rectangle(20, 700, 80, 80, getVertexBufferObjectManager())
                            {
                                    @Override
                                    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX,
                                                    float pTouchAreaLocalY)
                                    {
                                            // TODO Auto-generated method stub
                                            if (pSceneTouchEvent.isActionUp())
                                            {
                                                    runOnUiThread(new Runnable()
                                                    {
                                                            @Override
                                                            public void run()
                                                            {
                                                                    // TODO Auto-generated method stub
                                                                    Toast.makeText(Menu.this, "BACK", Toast.LENGTH_SHORT).show();
                                                            }
                                                    });
                                            }

                                            return true;
                                    }
                            };
                            hudBox.setColor(Color.RED);
                            hud.attachChild(hudBox);
                            hud.registerTouchArea(hudBox);
                            camera.setHUD(hud);
                    }

    @Override
    public boolean onKeyDown(final int pKeyCode, final KeyEvent pEvent) {
                  if (pKeyCode == KeyEvent.KEYCODE_BACK
                            && pEvent.getAction() == KeyEvent.ACTION_DOWN
                            ) {


                                    if(level_scene){
                                      level_scene = false;
                                      camera.setCenter(camera_x, camera_y);
                                  mEngine.setScene(MainMenuScene);
                                    }else{
                                            finish();
                                    }
                                     return true;

                            }
                               return super.onKeyDown(pKeyCode, pEvent);




    }

    private void createLevelBoxes()
    {


            // 计算行间距
            int spaceBetweenRaws = (CAMERA_HEIGHT / LEVEL_ROWS_PER_SCREEN) - LEVEL_PADDING;
            // 计算列间距
            int spaceBetweenColumns = (CAMERA_WIDTH / LEVEL_COLUMNS_PER_SCREEN) - LEVEL_PADDING;

            int level = 0;

            int boxX = LEVEL_PADDING;
            int boxY = LEVEL_PADDING;

            for (int i=0; i<LEVEL_PAGES; i++)
            {
                    int startX = i * CAMERA_WIDTH;

                    for (int j=0; j<LEVEL_ROWS_PER_SCREEN; j++)
                    {
                            for (int k=0; k<LEVEL_COLUMNS_PER_SCREEN; k++)
                            {
                                    final int levelToLoad = level;
                               box = new Sprite(startX + boxX, boxY, 90,70,this.levelIcon,this.getVertexBufferObjectManager())
                                    {
                                            @Override
                                            public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX,
                                                            float pTouchAreaLocalY)
                                            {

                                                    // TODO Auto-generated method stub

                                                             levelClicked = levelToLoad;
                                                           if(levelClicked <= maxLevelReached){

                                                               Intent intent = new Intent(Menu.this, GameLevel.class);

                                                            intent.putExtra("level", levelClicked);
                                                            startActivity(intent);
                                                            woodClick.play();
                                                           }
                                                    return false;
                                            }
                                    };


                                    if (level <= maxLevelReached)
                                    {

                                    }
                                    else
                                    {
                                      box.setColor(0.4117647f, 0.4117647f,0.4117647f);      
                                    }

                                    levelScene.attachChild(box);
                                    levelScene.registerTouchArea(box);
                                    int textOffX = 0;
                                    if (level < 10)
                                    {
                                            textOffX = 28;
                                    }
                                    else
                                    {
                                            textOffX = 20;
                                    }
                                    box.attachChild(new Text(textOffX, 20, font, String.valueOf(level + 1),this.getVertexBufferObjectManager()));


                                    level++;
                                    boxX += spaceBetweenColumns + LEVEL_PADDING;
                                    if (level > LEVELS)
                                    {
                                            break;
                                    }
                            }
                            if (level > LEVELS)
                            {
                                    break;
                            }


                            boxY += spaceBetweenRaws + LEVEL_PADDING;
                            boxX = LEVEL_PADDING;
                    }

                    boxY = LEVEL_PADDING;

            }
    }
4

1 に答える 1

1

I think when user presses back key you have to adjust view bounds of the camera again to the current scene.

于 2012-09-12T07:25:08.603 に答える