DO-64 [Feat] 항복 버튼 구현

This commit is contained in:
Jay 2025-03-26 18:35:15 +09:00
parent 8fa494e541
commit f3af9c86e6
5 changed files with 79 additions and 9 deletions

View File

@ -18,10 +18,16 @@ public class GameUIController : MonoBehaviour
[SerializeField] private Sprite[] profileImageSprites; //0. 기본 드래곤 1. 기본 호랑이 2.아이보리 드래곤 3. 아이보리 호랑이
[SerializeField] private Sprite[] indicatorSprites; //0. active 1. inactive
private Sprite _originalSpriteA;
private Sprite _originalSpriteB;
private MultiplayManager _multiplayManager;
private void Start()
{
_multiplayManager = GameManager.Instance.GetMultiplayManager();
}
public void OnClickConfirmButton()
{
GameManager.Instance.OnClickConfirmButton();
@ -37,8 +43,8 @@ public class GameUIController : MonoBehaviour
GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () =>
{
//TODO: 서버에 항복 전달 및 기타 등등
GameManager.Instance.ChangeToMainScene();
_multiplayManager.RequestSurrender();
// GameManager.Instance.ChangeToMainScene();
});
}

View File

@ -16,6 +16,8 @@
StartGame, // 생성한 방에 다른 유저가 참여해서 게임 시작
SwitchAI, // 15초 후 매칭 실패 시 AI 플레이로 전환 알림
ExitRoom, // 자신이 방을 빠져 나왔을 때
EndGame // 상대방이 접속을 끊거나 방을 나갔을 때
EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때
DoSurrender, // 상대방이 항복했을 때
SurrenderConfirmed // 항복 요청이 성공적으로 전송되었을 때
};
}

View File

@ -235,7 +235,7 @@ public class GameLogic : MonoBehaviour
private int _lastRow;
private int _lastCol;
private MultiplayManager _multiplayManager;
public MultiplayManager _multiplayManager;
private string _roomId;
#region Renju Members
@ -419,6 +419,22 @@ public class GameLogic : MonoBehaviour
Debug.Log("## End Game");
// TODO: End Room 처리
break;
case Constants.MultiplayManagerState.DoSurrender:
Debug.Log("상대방의 항복 요청 들어옴");
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win);
EndGame(Enums.GameResult.Win);
});
break;
case Constants.MultiplayManagerState.SurrenderConfirmed:
Debug.Log("항복 요청 전송 완료");
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose);
EndGame(Enums.GameResult.Lose);
});
break;
}
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB");

View File

@ -20,12 +20,21 @@ public class GameManager : Singleton<GameManager>
[NonSerialized] public PanelManager panelManager;
[NonSerialized] public AudioManager audioManager;
private MultiplayManager _multiplayManager;
protected override void Awake()
{
base.Awake();
InitPanels();
}
public MultiplayManager GetMultiplayManager()
{
_multiplayManager = _gameLogic._multiplayManager;
if (_multiplayManager == null) Debug.Log("MultiplayManager가 null입니다");
return _multiplayManager;
}
private void InitPanels()
{
if (panelManager == null)

View File

@ -67,6 +67,8 @@ public class MultiplayManager : IDisposable
private event Action<Constants.MultiplayManagerState, object> _onMultiplayStateChanged;
public Action<MoveData> OnOpponentMove;
private string _roomId;
public MultiplayManager(Action<Constants.MultiplayManagerState, object> onMultiplayStateChanged)
{
_onMultiplayStateChanged = onMultiplayStateChanged;
@ -86,6 +88,8 @@ public class MultiplayManager : IDisposable
_socket.On("exitRoom", ExitRoom);
_socket.On("endGame", EndGame);
_socket.On("doOpponent", DoOpponent);
_socket.On("doSurrender", DoSurrender);
_socket.On("surrenderConfirmed", SurrenderConfirmed);
_socket.Connect();
}
@ -109,6 +113,8 @@ public class MultiplayManager : IDisposable
private void CreateRoom(SocketIOResponse response)
{
var data = response.GetValue<CreateRoomData>();
_roomId = data.roomId;
Debug.Log("roomId CreateRoom할 때 저장? " + _roomId);
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId);
}
@ -116,8 +122,8 @@ public class MultiplayManager : IDisposable
{
var data = response.GetValue<JoinRoomData>();
Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}");
// 필요한 데이터 사용
_roomId = data.roomId;
Debug.Log("roomId JoinRoom할 때 저장? " + _roomId);
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data);
}
@ -180,7 +186,38 @@ public class MultiplayManager : IDisposable
public void LeaveRoom(string roomId)
{
_socket.Emit("leaveRoom", new { roomId });
if (string.IsNullOrEmpty(_roomId))
{
Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음");
return;
}
_socket.Emit("leaveRoom", new { roomId = _roomId });
_roomId = null; // 방 나가면 roomId 초기화
}
public void RequestSurrender()
{
if (string.IsNullOrEmpty(_roomId))
{
Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음");
return;
}
_socket.Emit("requestSurrender",new { roomId = _roomId });
}
private void DoSurrender(SocketIOResponse response)
{
var data = response.GetValue<MessageData>();
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DoSurrender, data.message);
}
private void SurrenderConfirmed(SocketIOResponse response)
{
var data = response.GetValue<MessageData>();
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.SurrenderConfirmed, data.message);
}
public void Dispose()