Skip to content

Commit

Permalink
v1.1 ウィンドウサイズの変更に対応
Browse files Browse the repository at this point in the history
  • Loading branch information
Eniwder committed Sep 24, 2024
1 parent 8bdeeb2 commit bfca98d
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 12 deletions.
12 changes: 11 additions & 1 deletion Assets/Scripts/GameManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public void StartGame()
StartCoroutine(Helper());
IEnumerator Helper()
{

yield return MazeManager.Instance.CreateMaze();
yield return DollManager.Instance.SpawnDoll();

Expand All @@ -47,15 +48,24 @@ public void FinishGame()
IEnumerator Helper()
{
yield return DollManager.Instance.EscapeDoll();
yield return MazeManager.Instance.DeleteMaze();
yield return MazeManager.Instance.FinishMaze();
//GC
System.GC.Collect();
//使ってないアセットをアンロード
Resources.UnloadUnusedAssets();
yield return new WaitForSeconds(3f);
StartGame();
}
}

public void CleanGame()
{
StopAllCoroutines();

MazeManager.Instance.CleanMaze();
DollManager.Instance.CleanDoll();
System.GC.Collect();
Resources.UnloadUnusedAssets();
}

}
29 changes: 23 additions & 6 deletions Assets/Scripts/MazeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,11 @@ public IEnumerator CreateMaze()
{
col = ConfigLoader.GetConfig().maze.col;
row = ConfigLoader.GetConfig().maze.row;
if (col < 1 || row < 1)
if (col < 2 || row < 2)
{
// 1920x1080のとき、(col+row)<35。これを基準とする。
// screenWidth/1920*35 ≒ screenWidth*0.01823
int maxNum = (int)(Screen.width * 0.01823f);
int maxNum = Mathf.Max(4, (int)(Screen.width * 0.01823f));
int minNum = (int)Mathf.Sqrt(maxNum); // 最小値は大体このくらいでよさそう?
col = random.Next(minNum, maxNum - minNum);
row = maxNum - col;
Expand Down Expand Up @@ -129,7 +129,7 @@ public void walked(int x, int y)
}
}

public IEnumerator DeleteMaze()
public IEnumerator FinishMaze()
{
yield return StartCoroutine(FadeOutMaze(col, row));
foreach (var tile in tiles)
Expand All @@ -148,6 +148,24 @@ public IEnumerator DeleteMaze()
}
}

public void CleanMaze()
{
foreach (var tile in tiles)
{
if (tile != null)
{
pool.ReturnTile(tile);
}
}
foreach (var road in roads)
{
if (road != null)
{
pool.ReturnRoad(road);
}
}
}

private IEnumerator FadeOutMaze(int col, int row)
{
StartCoroutine(FadeRoad(col, row, totalFadeDuration, false));
Expand Down Expand Up @@ -233,14 +251,14 @@ private IEnumerator FadeRoad(int col, int row, float totalFadeDuration, bool fad
{
for (int x = 0; x < col; x++)
{
if (roads[y, x, Direction.Horizontal])
if (images[y, x, Direction.Horizontal])
{
Color color = images[y, x, Direction.Horizontal].color;
float alpha = Mathf.Clamp01(Mathf.Max(elapsedTime - xy * (x + y), 0f) / fadeDuration); // 左から右にFadeInしたい場合
color.a = fadeIn ? alpha : 1 - alpha;
images[y, x, Direction.Horizontal].color = color;
}
if (roads[y, x, Direction.Vertical])
if (images[y, x, Direction.Vertical])
{
Color color = images[y, x, Direction.Vertical].color;
float alpha = Mathf.Clamp01(Mathf.Max(elapsedTime - xy * (x + y), 0f) / fadeDuration); // 左から右にFadeInしたい場合
Expand Down Expand Up @@ -271,7 +289,6 @@ private void InitMaze(int col, int row)
unexplored += walkableGrid[y, x] ? 1 : 0;
}
}
// DebugShowMaze();
}

private void InitRoads(int col, int row)
Expand Down
109 changes: 109 additions & 0 deletions Assets/Scripts/WindowResizeDetector.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Runtime.InteropServices;

public class WindowResizeDetector : MonoBehaviour
{
private int lastScreenWidth;
private int lastScreenHeight;
private bool isResizing = false;
private const float aspectRatio = 16.0f / 9.0f;
public Text waitingText;

// Windows APIのインポート
[DllImport("user32.dll")]
private static extern bool GetWindowRect(System.IntPtr hWnd, out RECT lpRect);

[DllImport("user32.dll")]
private static extern bool SetWindowPos(System.IntPtr hWnd, System.IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

[DllImport("user32.dll")]
private static extern System.IntPtr GetActiveWindow();

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

private System.IntPtr windowHandle; // ウィンドウのハンドル
private int originalX;
private int originalY;

void Start()
{
waitingText.enabled = false;

if (MyUtil.IsWrapped())
{
Destroy(this);
return;
}

// 初期のスクリーンサイズを記録
lastScreenWidth = Screen.width;
lastScreenHeight = Screen.height;

// ウィンドウのハンドルを取得
windowHandle = GetActiveWindow();
}

void Update()
{
// ウィンドウサイズが変更されているか確認
if (Screen.width != lastScreenWidth || Screen.height != lastScreenHeight)
{
if (!isResizing)
{
// リサイズが開始されたとき
isResizing = true;
waitingText.enabled = true;
GameManager.Instance.CleanGame();
}

// ウィンドウサイズの変更を記録
lastScreenWidth = Screen.width;
lastScreenHeight = Screen.height;
}

// マウスの左クリックが離された場合
if (isResizing && Input.GetMouseButtonUp(0))
{
waitingText.enabled = false;
OnResizeEnd();
StartCoroutine(Helper());
}
}

IEnumerator Helper()
{
// アスペクト比調整のロジックによるリサイズ検知を防止
yield return new WaitForSeconds(0.1f);
isResizing = false;
GameManager.Instance.StartGame();
}

void OnResizeEnd()
{
// リサイズが終了したときに行う処理
RECT rect;
GetWindowRect(windowHandle, out rect);

int newWidth = Screen.width;
int newHeight = Mathf.RoundToInt(newWidth / aspectRatio);

if (newHeight > Screen.height)
{
newHeight = Screen.height;
newWidth = Mathf.RoundToInt(newHeight * aspectRatio);
}

// リサイズ後にウィンドウの位置を復元
SetWindowPos(windowHandle, System.IntPtr.Zero, rect.left, rect.top, newWidth, newHeight, 0);
}

}
4 changes: 2 additions & 2 deletions Assets/StreamingAssets/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@
"score": "[true|false] スコアの表示/非表示を設定できる。非表示でも記録は増えていく。",
"maze": {
"概要": "マップの形を決めるパラメータ群。レイアウトを固定したい場合に設定してください。",
"col": "[0≦col<N] x軸のグリッド数。col<1で自動調整。画面の解像度が1920x1080(FHD)の場合は「(col+row)<35」を推奨",
"row": "[0≦row<N] y軸のグリッド数。row<1で自動調整。画面の解像度が3840x2160(4K )の場合は「(col+row)<70」を推奨",
"col": "[0≦col<N] x軸のグリッド数。col<2で自動調整。画面の解像度が1920x1080(FHD)の場合は「(col+row)<35」を推奨",
"row": "[0≦row<N] y軸のグリッド数。row<2で自動調整。画面の解像度が3840x2160(4K )の場合は「(col+row)<70」を推奨",
"droprate": "[0≦droprate≦1] 値を大きくすると通路が増える。0で迷路に、100で更地になる。"
},
"doll": {
Expand Down
5 changes: 2 additions & 3 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,11 @@ Windowsの壁紙を、ソウルタイド風のマップとSDキャラが動く
- 編集に失敗した場合は「[こちら](https://github.com/Eniwder/SoultideWallpaper/blob/main/Assets/StreamingAssets/config.json)」からコピペし直せば直ると思います。
- 壁紙ではなく単体のアプリとして開きたい場合は、「SoultideWallpaper/bin/SoultideWallpaper.exe」から起動します。
- アプリは「Alt+Enter」で全画面とウィンドウを切り替えることができます。
- ウィンドウサイズは自由に変更できますが、描画処理の関係上、サイズを変更した後に手動でアプリの再起動を推奨します
- ウィンドウサイズを変更するとアプリが一時停止します。その後、画面をクリックすると「16:9」の比率になるようにサイズ調整しつつマップをリフレッシュします
- アプリとして起動した場合の終了方法は、ウィンドウ状態でバツボタンを押すか「Alt+F4」で強制終了するかのどちらかです。
- 壁紙モードを想定して作っているので、ウィンドウ状態の作り込みは甘いです。

### 探索スコア
アプリの右下に表示される数値は探索スコアです。環境次第では表示されない問題があるようです。
アプリの右下に表示される数値は探索スコアです。

探索スコアは新しいタイルを見つけたり、キャラのアクション次第で増えるお遊び要素です。

Expand Down

0 comments on commit bfca98d

Please sign in to comment.