2015-01-09 2 views
0

Я пытаюсь создать кнопку в своем главном меню, чтобы начать игру. Главное меню находится в XML, а игра находится в SurfaceView. Я знаю, что я не могу запустить SurfaceView напрямую, поэтому я встроил его в Activity. Вот Main:XML to SurfaceView

package gametest.gametest; 

import android.content.Intent; 
import android.os.Bundle; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.View.OnClickListener; 
import android.app.Activity; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_main); 
     init(); 
    } 


    public void init(){ 
     Button PLAY = (Button) findViewById(R.id.bPlay); 
     PLAY.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(v.getContext(), gameViewActivity.class); 
       startActivityForResult(i, 0); 
      } 
     }); 
    } 

} 

Gameview:

package gametest.gametest; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 

import java.util.ArrayList; 
import java.util.List; 


public class gameView extends SurfaceView{ 
    private GameLoopThread gameLoopThread; 
    private List<Sprite> sprites = new ArrayList<Sprite>(); 
    private List<TempSprite> temps = new ArrayList<TempSprite>(); 
    private long lastClick; 
    private Bitmap bmpBlood; 



    public gameView(Context context) { 
     super(context); 
     gameLoopThread = new GameLoopThread(this); 
     getHolder().addCallback(new SurfaceHolder.Callback() { 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 
       boolean retry = true; 
       gameLoopThread.setRunning(false); 
       while (retry) { 
        try { 
         gameLoopThread.join(); 
         retry = false; 
        } catch (InterruptedException e) {} 
       } 
      } 

      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 
       createSprites(); 
       gameLoopThread.setRunning(true); 
       gameLoopThread.start(); 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, 
             int width, int height) { 
      } 
     }); 
     bmpBlood = BitmapFactory.decodeResource(getResources(), R.drawable.blood); 
    } 

    private void createSprites() { 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 
     sprites.add(createSprite(R.drawable.zombie)); 

    } 

    private Sprite createSprite(int resouce) { 
     Bitmap bmp = BitmapFactory.decodeResource(getResources(), resouce); 
     return new Sprite(this, bmp); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.DKGRAY); 
     for (int i = temps.size() - 1; i >= 0; i--) { 
      temps.get(i).onDraw(canvas); 
     } 
     for (Sprite sprite : sprites) { 
      sprite.onDraw(canvas); 
     } 
    } 



    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (System.currentTimeMillis() - lastClick > 300) { 
      lastClick = System.currentTimeMillis(); 
      float x = event.getX(); 
      float y = event.getY(); 
      synchronized (getHolder()) { 
       for (int i = sprites.size() - 1; i >= 0; i--) { 
        Sprite sprite = sprites.get(i); 
        if (sprite.isCollision(x, y)) { 
         sprites.remove(sprite); 
         temps.add(new TempSprite(temps, this, x, y, bmpBlood)); 
         break; 
        } 
       } 
      } 
     } 
     return true; 
    } 
} 

Embedded Gameview:

package gametest.gametest; 

import android.app.Activity; 
import android.os.Bundle; 

public class gameViewActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstance){ 
     super.onCreate(savedInstance); 
     setContentView(new gameView(this)); 
    } 
} 

Главная XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="PLAY" 
     android:id="@+id/bPlay" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Headshot!" 
     android:id="@+id/textView" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="77dp" /> 

</RelativeLayout> 

Он работает, но аварии, когда я нажимаю на кнопку PLAY. Я думаю, проблема в том, где мой намерение создан для моего onClickListener. Любая помощь будет замечательной!

+1

Что такое авария? Можете ли вы включить трассировку стека? –

+0

Вот ошибка, которую я получаю: 01-09 12: 26: 08.123 4335-4335/gametest.gametest E/AndroidRuntime: FATAL EXCEPTION: main Процесс: gametest.gametest, PID: 4335 android.content.ActivityNotFoundException: Unable найти явный класс активности {gametest.gametest/gametest.gametest.gameViewActivity}; Вы объявили эту активность в своем AndroidManifest.xml? –

ответ

0

Судя по вашей ошибке, похоже, что вы, возможно, забыли добавить запись для своей новой Деятельности в манифест. В вашей AndroidManifest.xml вы, вероятно, увидите запись для MainActivity, который выглядит примерно так:

<activity 
    android:name="gametest.gametest.MainActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

Underneath, что вам нужно создать запись для gameViewActivity, в противном случае ваше приложение не сможет его распознать. Вы, вероятно, захотите добавить что-то вроде этого:

<activity> 
    android:name="gametest.gametest.gameViewActivity" 
</activity> 
+0

Огромное спасибо! Я сделал это немного иначе. Я продублировал в AndriodManifest.xml и изменил «gametest.gametest.MainActivity» на «gametest.gametest.gameViewActivity». –