Войти
AndroidФорумОбщее

Глобальные объекты в Java+Android

Страницы: 1 2 3 Следующая »
#0
18:04, 1 апр. 2013

Есть некий класс, который рулит всем всем всем в игре.
Разные Activity должны иметь к нему доступ.
Как и в каком виде создавать экземпляр этого класса?
Видится мне тут использование Singleton. Это правильный вариант?
Еще видится вариант с объяввлением в основном Activity статической переменной и помещением этого экземпляра туда. Но видится, также, что это достаточно кривой вариант.

Как все делают?

#1
18:09, 1 апр. 2013

IoC!

#2
18:16, 1 апр. 2013

GLoom
> IoC
И чем Singleton противоречит инверсии?

#3
18:22, 1 апр. 2013

Время жизни "синглтона" из контейнера совпадает с временем жизни контейнера.

#4
18:24, 1 апр. 2013

Я не догоняю, какую конкретно реализацию вы подразумеваете.
Пример можно?

#5
18:28, 1 апр. 2013

Конкретно никакую. Я под андроид только через Marmalade SDK пишу. Но общая идея в том что singleton в чистом виде плох тем, что время его жизни плохо контролируется. При использовании контейнера его время жизни совпадает с контейнером и если что (если надо перезапустить игру в другой конфигурации) то можно убить контейнер со всеми объектами и создать новый.

#6
18:39, 1 апр. 2013

GLoom
Чем плохой контроль?

class MyGlobalClass : Singleton<MyGlobalClass>
{};

int main()
{
    MyGlobalClass myGlobalClass;
   { 
          do something...
   }
    return 0;
}

Жизнь контролируется LIFO.

#7
18:45, 1 апр. 2013

ReeV
Это ява?

#8
18:47, 1 апр. 2013

ReeV
Вообще не в тему. В Яве GC и нет никакой гарантии, что myGlobalClass сдохнет по return 0. Вернее 99% что не сдохнет сразу.

#9
18:47, 1 апр. 2013

GLoom
Я согласен насчет контроля. Но не понимаю, как такой контейнер реализовать. Я так понял, в Яве для этого сторонние библиотеки используют.

#10
18:49, 1 апр. 2013

@!!ex
сори, проглядел Java+... :)

#11
18:49, 1 апр. 2013

@!!ex
Не знаю. Был бы WinPhone - я бы за Autofac бы всеми руками голосовал.

#12
3:42, 2 апр. 2013

Ну если я тебя правильно понял, то вот код как я делаю....

public class main_android extends Activity {
  
  ewil    engine;
  main_game  game;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        engine  = system.ewilCreate(system.EWIL_VERSION);
        game  = new main_game();
        boolean err = engine.Initiate(game, this);
        if(err) {
          finish();
        }
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        return engine.TouchEvent(event);
       }
    
    @Override
    public void onRestart() {
      super.onRestart();
      engine.Restart();
    }
    
    @Override
    public void onStart() {
      super.onStart();
      engine.Start();  
    }
    
    @Override
    public void onResume() {
      super.onResume();
      engine.Resume();  
    }
    
    @Override
    public void onPause() {
      super.onPause();
      boolean exit = engine.Pause();
      if(exit) {
        finish();
      }
    }
    
    @Override
    public void onStop() {
      super.onStop();
      engine.Stop();
    }
    
    @Override
    public void onDestroy() {
      super.onDestroy();
      engine.Destroy();
    }

}

Вот класс оболочки, от которого производим потомок твоего класса

// Интерфейс необходимый ewil для работы с приложением
public abstract class  application{

    public  ewil  m_ewil  = null;

    public  boolean  Event(MotionEvent event)                { return true; }  // Обработка событий
    public  void  Render_Ex(GL10 gl)                     {}          // Обработка рендера (расширенная)
    public  void  UserInit()                        {}          // Обработка пользовательской инициализации
    public  boolean  SurfaceInit(GL10 gl, EGLConfig config)          { return true; }  // Инициализация, после создания поверхности OpenGL ES
    public  void  SurfaceChanged(GL10 gl, int width, int height)      {}          // Изменение поверхности OpenGL ES
    public  boolean  SetMatrixProjection(GL10 gl, int width, int height)    { return true; }  //
    public  boolean  SetMatrixView(GL10 gl)                  { return true; }  //
    public  int[]  ConfigSpec()                      { return null; }  // Обработка события, когда OpenGL ES требует от пользователя конфигурацию
}

Создание реализации движка

    public  static  ewil ewilCreate(int version) {
        return new ewil_impl();
    }
Вот уже твоя реализация обработки ( их вызывает движёк)
public class main_game extends application {

    @Override
    // Обработка события после создания поверхности OpenGL ES
    public void UserInit()
    ..........

    // Обработка рендера
    @Override
    public void Render_Ex(GL10 gl) {
    .....

    // Обработка событий
    @Override
    public boolean Event(MotionEvent event)
     .....
}

Вот абстрактный класс движка (все эти функции видит пользователь)

// Интерфейс EWIL
public interface ewil {

    // Интерфейс работы с Activity
    public    boolean    Initiate(application game, Activity main);    // Инициализация EWIL
    public    void    Restart();                    // Перезапуск EWIL
    public    void    Start();                    // Запуск EWIL
    public    void    Resume();                    // Возобновление работы EWIL
    public    boolean    Pause();                    // Пауза в EWIL
    public    void    Stop();                      // Остановка EWIL
    public    void    Destroy();                    // Уничтожение EWIL
    public    boolean    TouchEvent(MotionEvent event);          // Обработка событий Touch

    // Интерфейс работы с графикой
    public    void    Gfx_Clear();                  // Очистка поверхностей сцены
    public    void    Gfx_SetTransform(float x, float y,
                                               float dx, float dy,
                                               float rot,
                                               float hscale, float vscale);  // Изменение глобальное преобразование для всей графики, предоставлявшей дальше
    public    void    Gfx_RenderTriangle(float[] v1,
                                                 float[] v2,
                                                 float[] v3);          //
    public    void    Gfx_RenderTriangle(ewilTriangle triple);    // Рисование треугольника
    public    void    Gfx_RenderQuad(ewilQuad quad);          // Рисование квадрата
    public      void        Gfx_RenderSurface(ewilSurfaceMap surface);      // Рисование поверхности карты
    public      boolean     Gfx_StartBatch(ewilBatch batch);                // Рисование пакетами данных, начало
    public      boolean     Gfx_StartBatchEx(ewilBatch batch);              //
    public      void        Gfx_EndBatch(int amount_prim);                  // Рисование пакетами данных, окончание
    public      void        Gfx_StartSurface(ewilSurface surface);          // Рисование поверхности, начало
    public      void        Gfx_EndSurface();                               // Рисование поверхности, окончание
    // Интерфейс работы с текстурой
    public      int         Texture_LoadR(int idPicture, int filter);    // Загрузка текстуры из ресурсов Android
    public      int         Texture_LoadA(String path_texture, int filter); // Загрузка текстуры из папки Assets
    public      void        Texture_Delete(int num_texture);                // Удаление текстуры по сгенерированому номеру GPU

    // Интерфейс работы с файлами
    public    InputStream  File_OpenAssets(String path_file, int access);  // Открытие файла находящихся в папке Assests
    public    void    File_CloseAssets();                // Закрытие файла находящихся в папке Assests

    // Интерфейс работы с внутренними параметрами EWIL
    public      void        SetState(int type_state);                      // Установка внутренних параметров EWIL
    public      int         GetState(int type_state);                       // Получение внутренних параметров EWIL
    public      GL10        GetOpenGL10();                                  // Передача указателя интерфейса OpenGL ES 1.0
    public      GL11        GetOpenGL11();                                  // Передача указателя интерфейса OpenGL ES 1.1
}

Вот тут реализация всех функций

// Реализация интерфейса EWIL
public class ewil_impl implements ewil, Renderer {
..............
}
#13
12:34, 2 апр. 2013

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

#14
13:08, 2 апр. 2013

@!!ex
> А теперь появляется новый Activity, скажем основной у нас вид на базу, а новый
> - вид на всю планету.
> И как из второго Activity получить доступ к основным данным*
Говоришь загадками!!!!
Примени как в CryEngine 3 создай структуру в котором будут указатели на все твои необходимые инструменты....

Моя реализация данного способа на си++

// ----------------------------------------------------------------
// Структура хранения переменных основного интерфейса ISystem 
// ----------------------------------------------------------------
struct SSystemInitParams
{
  HDC            m_hDC;
  HWND          m_hWnd;
  HWND          m_hWndParent;
  HGLRC          m_hRC;
  HINSTANCE        m_hInstance;

  void*          m_cbWindowInitialize;            // Указатель на функцию инициализации окна
  void*          m_cbWindowProc;                // Указатель на функцию обработки сообщений окна
  void*          m_cbResizeWindow;              // Указатель на функцию обработки при изменении размеров окна
  void*          m_cbRenderInitialize;            // Указатель на функцию инициализации рендера
  void*          m_cbFrameProc;                // Указатель на функцию обработки фрейма
  void*          m_cbRenderProc;                // Указатель на функцию обработки рендера

  bool          m_bEditor;                  // Режим редактирования
  bool          m_bFullScreen;                // Режим полного экрана
  bool          m_bActive;                  // Флаг отвечающий за активность окна

  DWORD          m_dwScreenWidth;              // Размер окна по горизонтали
  DWORD          m_dwScreenHeight;              // Размер окна по вертикали
  DWORD          m_dwColorDepth;                // Глубина цыета
  DWORD          m_dwZBufferDepth;              //

  WNDCLASS        m_sWindowClass;                // Структура для регистрации окна
  LPCWSTR          m_strWindowTitle;              // Имя окна

  ewilVersionOpenGL    m_lVersionOpenGL;              // Версия OpenGL

  PIXELFORMATDESCRIPTOR  m_sPFD;                    // 

  LPEWILISYSTEM      m_pSystem;                  // Указатель на основной интерфейс ISystem

  int            m_iAttribList[7];              //

  // Конструктор структуры
  SSystemInitParams(void)
  {
    m_hDC          = NULL;
    m_hWnd          = NULL;
    m_hWndParent      = NULL;
    m_hRC          = NULL;
    m_hInstance        = GetModuleHandle(NULL);

    m_cbWindowInitialize  = NULL;
    m_cbWindowProc      = NULL;
    m_cbResizeWindow    = NULL;
    m_cbRenderInitialize  = NULL;
    m_cbFrameProc      = NULL;
    m_cbRenderProc      = NULL;

    m_bEditor        = true;
    m_bFullScreen      = false;
    m_bActive        = false;

    m_dwScreenWidth      = 800;
    m_dwScreenHeight    = 600;
    m_dwColorDepth      = 32;
    m_dwZBufferDepth    = 32;

    m_strWindowTitle    = _T("Тютю :)");

    m_lVersionOpenGL    = EWIL_OPENGL_3_3;
    m_iAttribList[0]    = WGL_CONTEXT_MAJOR_VERSION_ARB;
    m_iAttribList[1]    = 3;
    m_iAttribList[2]    = WGL_CONTEXT_MINOR_VERSION_ARB;
    m_iAttribList[3]    = 3;
    m_iAttribList[4]    = WGL_CONTEXT_FLAGS_ARB;
    m_iAttribList[5]    = WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
    m_iAttribList[6]    = 0;

    memset(&m_sWindowClass, NULL, sizeof(WNDCLASS));
    memset(&m_sPFD, NULL, sizeof(PIXELFORMATDESCRIPTOR));

    m_sPFD.nSize      = sizeof(PIXELFORMATDESCRIPTOR);

    m_pSystem        = NULL;
  }
};

typedef SSystemInitParams EWILSYSINITPARAMS, *LPEWILSYSINITPARAMS;

// ----------------------------------------------------------------
// Структура основных указателей на основные глобальные интерфейсы
// ----------------------------------------------------------------
struct SSystemGlobalEnvironment
{
  LPEWILISYSTEM        pSystem;
};

typedef SSystemGlobalEnvironment EWILSYSGENV, *LPEWILSYSGENV;

Страницы: 1 2 3 Следующая »
AndroidФорумОбщее

Тема в архиве.