SDXFrameWork  0.13
SDXFrameWork
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
System.h
1 //Copyright © 2014 SDXFramework
2 //[License]GNU Affero General Public License, version 3
3 //[Contact]http://sourceforge.jp/projects/dxframework/
4 #pragma once
5 #include <Multimedia/Window.h>
6 #include <Multimedia/Input.h>
7 #include <Multimedia/Font.h>
8 
9 namespace SDX
10 {
11  enum class Platform
12  {
13  Windows,
14  MacOSX,
15  GNU_Linux,
16  iOS,
17  Android,
18  Unknown,
19  };
20 
23  class System
24  {
25  friend class Window;
26 
27  private:
28  MONO_STATE(System)
29 
30 
31  static bool& IsEnd()
32  {
33  static bool isEnd;
34  return isEnd;
35  }
36  public:
37  static std::string inputText;
38  static std::string textComposition;
39  static int textCursor;
40  static int textSelection_len;
41 
45  static void Initialise(const char* ウィンドウ名, int 幅, int 高さ, bool フルスクリーンフラグ = false)
46  {
47  if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0)
48  {
49  exit(1);
50  return;
51  }
52 
53 #ifndef TABLET
54  SDL_JoystickEventState(SDL_ENABLE);
55 
56  if (SDL_NumJoysticks() > 0)
57  {
58  Input::pad.Open();
59  }
60 #endif
61 
62  SubWindow::mainWindow.Create(ウィンドウ名,幅,高さ,フルスクリーンフラグ);
65 
66  //タブレットと画面サイズを合わせる
67 #ifdef TABLET
68  int dpiX;
69  int dpiY;
70  SDL_GetWindowSize(SubWindow::mainWindow.handle, &dpiX, &dpiY);
71  SubWindow::mainWindow.aspect = (double)dpiX / dpiY;
72  SDL_RenderSetLogicalSize(Screen::GetHandle(), 幅, 高さ);
73 #endif
74  //デフォルトフォントの設定
75  setlocale(LC_CTYPE, "jpn");//文字コードを日本語に
76 
77 #ifndef OMIT_SDL2_TTF
78  TTF_Init();
79 #endif
80  Drawing::SetDefaultFont(SystemFont::Gothic, 16 , 2 );
81  SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_EVERYTHING);
82 
83  //音声関連の初期化
84  Mix_Init(MIX_INIT_MP3 | MIX_INIT_OGG);
85  Mix_OpenAudio(44100, AUDIO_S16, 2, 1024);
86  Mix_AllocateChannels(16);
87 
88  Mix_HookMusicFinished(Music::Finished);
89 
90  SDL_StopTextInput();
91 
92  IsEnd() = false;
93  }
94 
97  static bool End()
98  {
99 #ifndef OMIT_SDL2_TTF
100  TTF_Quit();
101 #endif
102  Mix_CloseAudio();
103  Mix_Quit();
104  SDL_Quit();
106  IsEnd() = true;
107  return true;
108  }
109 
111  static bool Update(bool 描画更新フラグ = true)
112  {
113  if (描画更新フラグ)
114  {
115  Screen::Flip();
116  Screen::Clear();
117  }
118  Input::Update();
119  bool result = System::ProcessMessage();
120 
121  Music::Update();
122 
123  return result;
124  }
125 
130  static bool ProcessMessage()
131  {
132  SDL_Event event;
133 
134  while (SDL_PollEvent(&event))
135  {
136  switch (event.type)
137  {
138  case SDL_WINDOWEVENT:
139  switch (event.window.event)
140  {
141  case SDL_WINDOWEVENT_CLOSE:
142 #ifndef TABLET
143  //ここでIDに応じてDestroy等する
144  SubWindow::CheckWindowID(event.window.windowID);
145  if (SubWindow::mainWindow.handle == nullptr)
146  {
147  IsEnd() = true;
148  for (auto it : SubWindow::windowS)
149  {
150  it->Destroy();
151  }
152  }
153 #endif
154  break;
155 #ifdef TABLET
156  case SDL_WINDOWEVENT_MINIMIZED:
157  //スリープに入った時、再生中ならBGMを停止する
158  if (Music::Check())
159  {
160  Mix_PauseMusic();
161  }
162  break;
163  case SDL_WINDOWEVENT_RESTORED:
164  //BGMを止めていたら、再開する
165  Mix_ResumeMusic();
166  break;
167 #endif
168  }
169  break;
170  case SDL_QUIT:
171  IsEnd() = true;
172  break;
173  case SDL_TEXTINPUT:
174  inputText += event.text.text;
175  break;
176  case SDL_TEXTEDITING:
177  //Windowsでは無効
178  textComposition = event.edit.text;
179  textCursor = event.edit.start;
180  textSelection_len = event.edit.length;
181  break;
182  default:
183  Input::GetState(event);
184  break;
185  }
186  }
187 
188  return !IsEnd();
189  }
190 
192  static void Wait(int 停止ミリ秒)
193  {
194  SDL_Delay(停止ミリ秒);
195  }
196 
198  static void WaitKey()
199  {
201  }
202 
204  static Platform GetPlatform()
205  {
206 #ifdef __WINDOWS__
207  return Platform::Windows;
208 #elif defined(__MACOSX__)
209  return Platform::MacOSX;
210 #elif defined(__LINUX__)
211  return Platform::GNU_Linux;
212 #elif defined(__ANDROID__)
213  return Platform::Android;
214 #elif defined(__IPHONEOS__)
215  return Platform::iOS;
216 #endif
217  return Platform::Unknown;
218  }
219 
222  static bool IsTablet()
223  {
224 #ifdef __WINDOWS__
225  return false;
226 #elif defined(__MACOSX__)
227  return false;
228 #elif defined(__LINUX__)
229  return false;
230 #elif defined(__ANDROID__)
231  return true;
232 #elif defined(__IPHONEOS__)
233  return true;
234 #endif
235  return false;
236  }
237 
238  };
239 }
static void Wait(int 停止ミリ秒)
指定ミリ秒処理を停止する.
Definition: System.h:192
static void Update()
入力状態を更新.
Definition: Input.h:42
static void WaitKey()
なんらかのキーが入力されるまで処理を停止する.
Definition: System.h:198
static bool Flip()
描画内容を反映.
Definition: Screen.h:62
static void Initialise(const char *ウィンドウ名, int 幅, int 高さ, bool フルスクリーンフラグ=false)
ライブラリの初期化.
Definition: System.h:45
ライブラリの初期化やシステム的な処理を行う関数群.
Definition: System.h:23
static bool Update(bool 描画更新フラグ=true)
各種更新処理をまとめて行う.
Definition: System.h:111
bool Create(const char *ウィンドウ名, int 幅, int 高さ, bool フルスクリーンフラグ=false)
Windowの初期化と生成.
Definition: SubWindow.h:77
static bool Clear()
画面を消去する.
Definition: Screen.h:69
static Platform GetPlatform()
プラットフォームを取得する.
Definition: System.h:204
static Joypad pad
ジョイパッド
Definition: Input.h:22
static void SetWindow(SubWindow &アクティブにするSubWindow=SubWindow::mainWindow)
SubWindowをアクティブにする.
Definition: Window.h:34
static bool Update()
fadeOut付きで終了した後に次Musicを再生するための処理.
Definition: Music.h:233
static bool End()
ライブラリの終了処理.
Definition: System.h:97
static SDL_Renderer * GetHandle()
スクリーンハンドルを取得.
Definition: Screen.h:26
static void SetRenderer(Renderer &描画先Renderer=Renderer::mainRenderer)
アクティブなRendererを設定.
Definition: Screen.h:40
static bool IsTablet()
タブレット端末かどうかを取得.
Definition: System.h:222
static bool HoldAnyKey()
いずれかのキーが押されているか取得.
Definition: Keyboard.h:454
static bool ProcessMessage()
OSのメッセージ処理を行う.
Definition: System.h:130
static Renderer & mainRenderer
メインウィンドウのレンダラー
Definition: Renderer.h:49
void Open()
ジョイパッドを起動.
Definition: Joypad.h:114
static SubWindow mainWindow
現在アクティブなウィンドウ
Definition: SubWindow.h:46
bool Destroy()
SubWindowを削除.
Definition: SubWindow.h:102
static void SetDefaultFont(const char *フォント名, int 大きさ, int 行間=0, bool 高品質レンダリング=true)
デフォルトのフォントを設定する.
Definition: Drawing.h:291
static bool Check()
再生中か確認.
Definition: Music.h:186
static SubWindow * activeWindow
現在アクティブなウィンドウ
Definition: Window.h:24
アクティブなSubWindowを操作するクラス.
Definition: Window.h:14
static void GetState(SDL_Event &event)
入力の状態変化を取得.
Definition: Input.h:59