2016-05-04 4 views
-2

Ich möchte Game-Aktivität in Game-Fragment konvertieren. Kann mir jemand dabei helfen?
Das ist ein Spiel Aktivität:Wie konvertiert man Aktivität in Fragment?

public class Game extends BaseGameActivity implements IOnSceneTouchListener, Observer{ 
    private static int CAMERA_HEIGHT = 480; 
    private static int CAMERA_WIDTH = 800; 
    private Camera mCamera; 
    private TiledTextureRegion ballTextureRegion; 
    private Texture paddleTexture; 
    private Texture ballTexture; 
    private Paddle paddle; 
    private GameHolder gameHolder; 
    private Object mCurViewMode; 
    public Engine onLoadEngine() 
    { 
     final Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay(); 
     CAMERA_WIDTH = defaultDisplay.getWidth(); 
     CAMERA_HEIGHT = defaultDisplay.getHeight(); 
     this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
     return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera)); 
    } 

    @Override 
    public void onLoadResources() 
    { 
     gameHolder = GameHolder.getInstance(); 
     gameHolder.addObserver(this); 
     gameHolder.setGameActivity(this); 

     this.ballTexture = new Texture(64, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
     this.paddleTexture = new Texture(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 

     TextureRegionFactory.setAssetBasePath("gfx/"); 

     this.ballTextureRegion = TextureRegionFactory.createTiledFromAsset(this.ballTexture, this, "ball.png", 0, 0, 1, 1); 

     this.mEngine.getTextureManager().loadTexture(this.paddleTexture); 
     this.mEngine.getTextureManager().loadTexture(this.ballTexture); 
    } 
    @Override 
    public Scene onLoadScene() 
    { 
     this.mEngine.registerUpdateHandler(new FPSLogger()); 

     final Scene scene = new Scene(1); 
     scene.setBackground(new ColorBackground(0f, 0f, 0f)); 
     scene.setOnSceneTouchListener(this); 

     final Ball ball = new Ball(CAMERA_WIDTH/2, CAMERA_HEIGHT-30-16, this.ballTextureRegion, mEngine); 
     ball.setVelocity(100.0f, 100.0f); 

     scene.getTopLayer().addEntity(ball); 

     paddle = new Paddle(CAMERA_WIDTH/2, CAMERA_HEIGHT-50, CAMERA_HEIGHT/8, CAMERA_WIDTH/34); 

     final Brick[][] bricks = new Brick[5][5]; 

     for (int i = 0; i < bricks.length; i++) { 
      for (int j = 0; j < bricks[0].length; j++) { 
       bricks[i][j]= new Brick(10+j*CAMERA_WIDTH/5, 10+i*CAMERA_HEIGHT/15 , CAMERA_HEIGHT/16, CAMERA_WIDTH/32); 
       scene.getTopLayer().addEntity(bricks[i][j]); 
      } 
     } 

     scene.getTopLayer().addEntity(paddle); 
     scene.getTopLayer().addEntity(ball); 
     scene.registerTouchArea(paddle); 

     /* The actual collision-checking. */ 
     scene.registerUpdateHandler(new IUpdateHandler() { 
      public void reset() { } 

      public void onUpdate(final float pSecondsElapsed) { 
       if(ball.collidesWith(paddle)) { 
        ball.bounceWithRectangle(paddle); 
       } 
       else if (ball.getY() >= Game.getCAMERA_HEIGHT() - 30) { 
        scene.setBackground(new ColorBackground(255f, 0f, 0f)); 
        Log.w("Game.java","Game Over"); 
       } 
       else { 
        for (int i = 0; i < bricks.length; i++) { 
         for (int j = 0; j < bricks[0].length; j++) { 
          scene.setBackground(new ColorBackground(0f, 0f, 0f)); 
          if(ball.collidesWith(bricks[i][j])) { 
           bricks[i][j].setPosition(CAMERA_HEIGHT+20, CAMERA_WIDTH+20); 
           scene.getTopLayer().removeEntity(bricks[i][j]); 
           ball.bounceWithRectangle(bricks[i][j]); 

          } 
         } 
        } 
       } 
      } 
     }); 

     return scene; 
    } 

    public static int getCAMERA_HEIGHT() { 
     return CAMERA_HEIGHT; 
    } 
    public static int getCAMERA_WIDTH() { 
     return CAMERA_WIDTH; 
    } 

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

    } 

    @Override 
    public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
     paddle.setPosition(pSceneTouchEvent.getX() - paddle.getWidth()/2, Game.getCAMERA_HEIGHT()-30); 
     return true; 
    } 

    protected void onPause() { 
     super.onPause(); 
     //commented on error 
     //gameHolder.setGameState(gameHolder.getPausedGameState()); 
    } 

    @Override 
    public void update(Observable observable, Object data) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

Mögliches Duplikat von [Fest mit von Aktivität Fragment Portierung] (http://stackoverflow.com/questions/10013023/stuck-with-porting-from-activity-to-fragment) – jobbert

+0

Änderungsmittel ... Möchten Sie Fragmente zur Aktivität hinzufügen? –

+0

Ich will Fragment nicht Aktivität .Aber dieses Spiel ist in BaseGameActivity .So muss ich es in Game Fragment konvertieren. – Mhandroid

Antwort

1

Sie können Ihre Aktivität in Fragment wie folgt ändern:

public class FragmentClass extends Fragment 
{ 
    private View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {    
     view = (View) inflater.inflate(R.layout.layout_history, container,false); 

     //Do all things which you want to implement //enter code here 
     return view; 
    } 
} 

Sie müssen Fragment zu erweitert und seine onCreateView(LayoutInflater, ViewGroup, Bundle) Methode außer Kraft setzen. Aufblasen mit Layout und Rückansicht wie oben.

Sie können auch erstellen Mitglied dieses Fragments seine Ansicht mit und übergeben Zusammenhang mit:

getActivity(); 

Wenn Sie findViewById(int) verwenden wollen, dann möchten Sie es verwenden:

getView().findViewById(int); 

Wenn Sie möchten, wissen dann mehr dazu finden Sie unter: http://developer.android.com/guide/components/fragments.html & http://developer.android.com/reference/android/app/Fragment.html#Lifecycle

Sie können ein benutzerdefiniertes Fragment wie unten erstellen. Nach alldem können Sie Ihre Methoden mit getActivity() aus der Fragmentklasse verwenden.

Und über Fehler Ihrer Methoden dann müssen Sie Kontext der aktuellen Fragmentklasse verwenden. wenn Sie
Beispiel wollen Textview verwenden, dann:

TextView tv = (TextView) context.findViewById(R.id.textView); 

Ich zeige Beispiel, wie Fragment mit BaseActivity machen:

public class MainActivity extends BaseActivity 
{ 
    private FragmentClass fragmentClass; 
    private ViewPager mViewPager; 

    private SlidingTabLayout mSlidingTabLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     //Do all stub 
     populateView(); 
    } 

    private void populateView() 
    { 
     mViewPager = (ViewPager) findViewById(R.id.pager1); 
     mViewPager.setOffscreenPageLimit(2); 
     mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager())); 
     mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs); 
     mSlidingTabLayout.setDividerColors(color); 
     mSlidingTabLayout.setCustomTabView(R.layout._custom_tab, 0); 
     mSlidingTabLayout.setViewPager(mViewPager); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter 
    { 
     public ViewPagerAdapter(FragmentManager fm) 
     { 
      super(fm); 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     public Fragment getItem(int pos) 
     { 
      if(pos==0) 
      { 
       fragmentClass = new FragmentClass(); 
       return fragmentClass; 
      } 
      return null;     
     } 

     @Override 
     public int getCount() 
     { 
      // TODO Auto-generated method stub 
      return 1; 
     } 
    } 
} 

Zwei Klassen von developer.android hinzufügen:

  1. Schieberegister Layout
  2. Schieberegister

http://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html

+0

hast du ganze Spielaktivität gesehen? – Mhandroid

+0

wenn ich BaseGameActivity durch Fragment ersetze gibt es viele Fehler. Ich denke, das liegt daran, dass alle Funktionen wie Engine onLoadEngine(), Scene onLoadScene() ... mit BaseGameActivity verknüpft sind. – Mhandroid

+0

Ja, Sie haben Recht !!. Implementieren Sie das Fragment nicht in derselben Klasse. Verwenden Sie wie oben beschrieben Code, mit dem Sie Ihre BaseActivity und dort überschriebene Methoden verwenden können und Sie auch Ihr Fragment verwenden können. –