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

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

View File

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

View File

@ -235,7 +235,7 @@ public class GameLogic : MonoBehaviour
private int _lastRow; private int _lastRow;
private int _lastCol; private int _lastCol;
private MultiplayManager _multiplayManager; public MultiplayManager _multiplayManager;
private string _roomId; private string _roomId;
#region Renju Members #region Renju Members
@ -419,6 +419,22 @@ public class GameLogic : MonoBehaviour
Debug.Log("## End Game"); Debug.Log("## End Game");
// TODO: End Room 처리 // TODO: End Room 처리
break; 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"); ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB");

View File

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

View File

@ -67,6 +67,8 @@ public class MultiplayManager : IDisposable
private event Action<Constants.MultiplayManagerState, object> _onMultiplayStateChanged; private event Action<Constants.MultiplayManagerState, object> _onMultiplayStateChanged;
public Action<MoveData> OnOpponentMove; public Action<MoveData> OnOpponentMove;
private string _roomId;
public MultiplayManager(Action<Constants.MultiplayManagerState, object> onMultiplayStateChanged) public MultiplayManager(Action<Constants.MultiplayManagerState, object> onMultiplayStateChanged)
{ {
_onMultiplayStateChanged = onMultiplayStateChanged; _onMultiplayStateChanged = onMultiplayStateChanged;
@ -86,6 +88,8 @@ public class MultiplayManager : IDisposable
_socket.On("exitRoom", ExitRoom); _socket.On("exitRoom", ExitRoom);
_socket.On("endGame", EndGame); _socket.On("endGame", EndGame);
_socket.On("doOpponent", DoOpponent); _socket.On("doOpponent", DoOpponent);
_socket.On("doSurrender", DoSurrender);
_socket.On("surrenderConfirmed", SurrenderConfirmed);
_socket.Connect(); _socket.Connect();
} }
@ -109,6 +113,8 @@ public class MultiplayManager : IDisposable
private void CreateRoom(SocketIOResponse response) private void CreateRoom(SocketIOResponse response)
{ {
var data = response.GetValue<CreateRoomData>(); var data = response.GetValue<CreateRoomData>();
_roomId = data.roomId;
Debug.Log("roomId CreateRoom할 때 저장? " + _roomId);
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId);
} }
@ -116,8 +122,8 @@ public class MultiplayManager : IDisposable
{ {
var data = response.GetValue<JoinRoomData>(); var data = response.GetValue<JoinRoomData>();
Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}"); 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); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data);
} }
@ -180,7 +186,38 @@ public class MultiplayManager : IDisposable
public void LeaveRoom(string roomId) 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() public void Dispose()