2013-11-14 2 views
1

я в настоящее время сделать игру, которая расширяется от учебника здесь: http://www.edu4java.com/en/androidgame/androidgame.htmlJava Android - Невозможно использовать функции OnClick вне CustomView внутри CustomView

Я в настоящее время есть макет экрана, который выглядит следующим образом: http://postimg.org/image/ghib8fb87/

Как вы можете видеть, направляющая клавиатура и переключатели затруднений находятся вне моего пользовательского вида.

EDIT: Пытались использовать SharedPreferences:

В моей MainActivity у меня есть функции для OnClick из радиокнопок и клавиатуры Directional (еще не создан):

import java.text.DecimalFormat; 
import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    private AppPreferences _appPrefs; 
    int hour = 0; 
    int minute = 0; 
    int second = 0; 
    TextView TimeAliveCounter; 


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

    public void runEasy(View view){ 
     _appPrefs.saveSmsBody("1"); 

    } 

    public void runMedium(View view){ 
     _appPrefs.saveSmsBody("2"); 
    } 

    public void runHard(View view){ 
     _appPrefs.saveSmsBody("3"); 

    } 

    private void timer() { 

     int locMilSec = 0; 
     int locSec = 0; 
     int locMin = 0; 
     int locHr = 0; 
     DecimalFormat format = new DecimalFormat("00"); 
     String formatMilliSecond = format.format(locMilSec); 
     String formatSecond = format.format(locSec); 
     String formatMinute = format.format(locMin); 
     String formatHour = format.format(locHr); 

     millisecond = Integer.parseInt(formatMilliSecond); 
     second = Integer.parseInt(formatSecond); 
     minute = Integer.parseInt(formatMinute); 
     hour = Integer.parseInt(formatHour); 

     Timer T = new Timer(); 
     TimeAliveCounter = (TextView) findViewById(R.id.TimeAlive); 
     T.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         TimeAliveCounter.setText(hour + ":"+ minute + ":"+ second + ":" + millisecond); 
         second++; 
         if(second > 59){ 
          second = 0; 
          minute = minute + 1;       
         } 
        } 
       }); 
      } 
     }, 1000, 1000); 
    } 
} 

Мой AppPreferences Класс:

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

public class AppPreferences { 
    public static final String KEY_DIFFICULTY = "difficulty"; 
    private static final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); 
    private SharedPreferences _sharedPrefs; 
    private Editor _prefsEditor; 

    public AppPreferences(Context context) { 
     this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
     this._prefsEditor = _sharedPrefs.edit(); 
    } 

    public String getDifficulty() { 
     return _sharedPrefs.getString(KEY_DIFFICULTY, ""); 
    } 

    public void saveSmsBody(String text) { 
     _prefsEditor.putString(KEY_DIFFICULTY, text); 
     _prefsEditor.commit(); 
    } 
} 

Мой Gameview класс:

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

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


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; 
     private AppPreferences _appPrefs; 

     public GameView(Context context, AttributeSet attributeSet) { 

      super(context); 
      _appPrefs = new AppPreferences(context); 
      final String difficulty = _appPrefs.getDifficulty(); 
      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(difficulty);  
         gameLoopThread.setRunning(true); 
         gameLoopThread.start(); 
        } 

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

     private void createSprites(final String difficulty) { 

      if ("1".equals(difficulty)) // easy 
      { 
       new Thread(new Runnable() { 
       public void run() { 
        for (int z =0; z<20; z++) 
        try 
         { 
         Thread.sleep(5000); 
         sprites.add(createSprite(R.drawable.image)); 
         z++; 

         } 
        catch(InterruptedException e) 
         { 
         e.printStackTrace(); 
         } 
       } 
      }).start(); 
      } 

      else if ("2".equals(difficulty)) // medium 
      { 
       new Thread(new Runnable() { 
       public void run() { 
        for (int z =0; z<40; z++) 
        try 
         { 
         Thread.sleep(3000); 
         sprites.add(createSprite(R.drawable.image)); 
         z++; 

         } 
        catch(InterruptedException e) 
         { 
         e.printStackTrace(); 
         } 
       } 
      }).start(); 
      } 

      else if ("3".equals(difficulty)) // hard" + 

      { 
       new Thread(new Runnable() { 
       public void run() { 
        for (int z =0; z<60; z++) 
        try 
         { 
         Thread.sleep(1000); 
         sprites.add(createSprite(R.drawable.zombie_sprite1)); 
         z++; 

         } 
        catch(InterruptedException e) 
         { 
         e.printStackTrace(); 
         } 
       } 
      }).start(); 
      } 

      else { 
       sprites.add(createSprite(R.drawable.zombie_sprite1)); 
       sprites.add(createSprite(R.drawable.zombie_sprite2)); 
       sprites.add(createSprite(R.drawable.zombie_sprite3)); 
       sprites.add(createSprite(R.drawable.zombie_sprite4)); 
       sprites.add(createSprite(R.drawable.zombie_sprite1)); 
       sprites.add(createSprite(R.drawable.zombie_sprite2)); 
       sprites.add(createSprite(R.drawable.zombie_sprite3)); 
       sprites.add(createSprite(R.drawable.zombie_sprite4)); 
       sprites.add(createSprite(R.drawable.zombie_sprite1)); 
       sprites.add(createSprite(R.drawable.zombie_sprite2)); 
       sprites.add(createSprite(R.drawable.zombie_sprite3)); 
       sprites.add(createSprite(R.drawable.zombie_sprite4)); 
      } 
     } 


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

     @Override 
     protected void onDraw(Canvas canvas) { 


      Resources res = getResources(); 
      Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.graveyard_background); 


      canvas.drawBitmap(background, 0, 0, null); 

      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; 
     }   
} 

Моего GameLoopThread класс:

import android.graphics.Canvas; 

public class GameLoopThread extends Thread { 
     static final long FPS = 10; 
     private GameView view; 
     private boolean running = false; 

     public GameLoopThread(GameView view) { 
      this.view = view; 
     } 

     public void setRunning(boolean run) { 
      running = run; 
     } 

     @Override 
     public void run() { 
      long ticksPS = 1000/FPS; 
      long startTime; 
      long sleepTime; 
      while (running) { 
        Canvas c = null; 
        startTime = System.currentTimeMillis(); 
        try { 
          c = view.getHolder().lockCanvas(); 
          synchronized (view.getHolder()) { 
            view.onDraw(c); 
          } 
        } finally { 
          if (c != null) { 
            view.getHolder().unlockCanvasAndPost(c); 
          } 
        } 
        sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
        try { 
          if (sleepTime > 0) 
            sleep(sleepTime); 
          else 
            sleep(10); 
        } catch (Exception e) {} 
      } 
     } 
} 

В настоящее время я пытаюсь быть в состоянии получить радио-кнопку, чтобы изменить сложность игры, но в данный момент по нажатию кнопки радио это сбой.

+0

Использование SharedPreferences - http://stackoverflow.com/questions/5734721/android-shared-preferences – mihail

+0

Я не совсем уверен, как я буду использовать его в этом примере. Любой шанс вы могли бы дать мне несколько указателей? – Bedimindtricks

+0

проверить мой ответ – mihail

ответ

1

(код дамп от этого вопроса Android Shared Preferences)

создать класс AppPreferences

public class AppPreferences { 
    public static final String KEY_DIFFICULTY = "difficulty"; 
    private static final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name of the file -.xml 
    private SharedPreferences _sharedPrefs; 
    private Editor _prefsEditor; 

    public AppPreferences(Context context) { 
     this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
     this._prefsEditor = _sharedPrefs.edit(); 
    } 

    public String getDifficulty() { 
     return _sharedPrefs.getString(KEY_DIFFICULTY, ""); 
    } 

    public void saveDifficulty(String text) { 
     _prefsEditor.putString(KEY_DIFFICULTY, text); 
     _prefsEditor.commit(); 
    } 
} 

определяют члена в классе

private AppPreferences _appPrefs; 

, чтобы получить его в onCreate сделать так

public GameView(Context context, AttributeSet attributeSet) { 
    super(context); 
    _appPrefs = new AppPreferences(getApplicationContext()); 
    String difficulty = _appPrefs.getDifficulty(); 

и установить его, когда вы выбираете это сделать

_appPrefs.saveDifficulty("1"); //or "2" or "3" 
+0

Большое спасибо за ваш быстрый ответ. Похоже, что у меня все еще нет - можете ли вы быстро взглянуть на мой новый код? – Bedimindtricks

+0

_appPrefs = new AppPreferences (getApplicationContext()); не распознается - мой новый код редактируется с первого поста. Если у вас есть минута, чтобы взглянуть, это будет очень признательно! – Bedimindtricks

+0

define _appPrefs как член класса - внутри класса и вне метода onCreate – mihail

0

решаемые этот вопрос, используя простые статические-акцессоры методы, которые я назвал бы и модифицируют.

Смежные вопросы