仿LOL项目开发第六天

仿LOL项目开发第六天

                              by草帽

OK,因为更新模块已经处理好了,接着开始登陆的编写。那么我们就需要状态机的管理。

所谓状态机就是在哪个状态执行那个状态的代码逻辑:

那么我们开始编写GameStateManager来管理:

我们先在DefineCommon里面定义游戏状态类型:

    /// <summary>
    /// 游戏状态
    /// </summary>
    public enum GameStateType
    {
        GS_Continue,//中间状态,也就是说介于两个状态转换的中间状态
        GS_Login,//登陆状态
        GS_User,//创建用户状态
        GS_Lobby,//大厅,类似于LOL主界面状态
        GS_Room,//创建房间状态
        GS_Hero,//选择英雄
        GS_Loading,//加载状态
        GS_Play,//对战状态
        GS_Over,//对战结束
    }

有分这么多个状态,如果还有其他状态以后再加:

然后在GameStateManager里面搞个字典缓存这些状态。这个管理方式和WindowManage十分的相似。

using UnityEngine;
using System.Collections.Generic;
using Game;
using Game.Common;
/// <summary>
/// 游戏状态管理器
/// </summary>
public class GameStateManager : Singleton<GameStateManager>
{
    public Dictionary<GameStateType, IGameState> m_dicGameStates;
    IGameState m_oCurrentState;

    public IGameState CurrentState
    {
        get { return this.m_oCurrentState; }
    }
    public GameStateManager()
    {
        m_dicGameStates = new Dictionary<GameStateType, IGameState>();
        m_dicGameStates.Add(GameStateType.GS_Login, new LoginState());
    }
    /// <summary>
    /// 改变游戏状态
    /// </summary>
    /// <param name="stateType"></param>
    public void ChangeGameStateTo(GameStateType stateType)
    {
        if (m_oCurrentState != null && m_oCurrentState.GetStateType() != GameStateType.GS_Loading && m_oCurrentState.GetStateType() == stateType)
            return;

        if (m_dicGameStates.ContainsKey(stateType))
        {
            if (m_oCurrentState != null)
            {
                m_oCurrentState.Exit();//先退出上个状态
            }

            m_oCurrentState = m_dicGameStates[stateType];
            m_oCurrentState.Enter();//进入这个状态
        }
    }
    /// <summary>
    /// 进入默认状态,默认为登陆状态
    /// </summary>
    public void EnterDefaultState()
    {
        ChangeGameStateTo(GameStateType.GS_Login);
    }
    public void FixedUpdate(float fixedDeltaTime)
    {
        if (m_oCurrentState != null)
        {
            m_oCurrentState.FixedUpdate(fixedDeltaTime);
        }
    }
    public void Update(float fDeltaTime)
    {
        GameStateType nextStateType = GameStateType.GS_Continue;
        if (m_oCurrentState != null)
        {
            nextStateType = m_oCurrentState.Update(fDeltaTime);
        }

        if (nextStateType > GameStateType.GS_Continue)
        {
            ChangeGameStateTo(nextStateType);
        }
    }
    public IGameState getState(GameStateType type)
    {
        if (!m_dicGameStates.ContainsKey(type))
        {
            return null;
        }
        return m_dicGameStates[type];
    }
}

我们抽象出所有的状态公有的方法属性:IGameState接口:

也符合面向接口编程原则。好处我之前讲过了。

IGameState:

using UnityEngine;
using System.Collections;
using Game.Common;
/// <summary>
/// 游戏状态接口
/// </summary>
public interface IGameState
{
    GameStateType GetStateType();//获取实现类的状态类型
    void SetStateTo(GameStateType gsType);//设置实现类的状态类型(改变状态)
    void Enter();//进入实现类的状态,做主要状态的逻辑处理
    GameStateType Update(float fDeltaTime);//状态改变,返回改变后的状态
    void FixedUpdate(float fixedDeltaTime);//固定更新状态
    void Exit();//退出该状态
}

然后编写实现接口的子实现类,这里我们先写LoginState:

using UnityEngine;
using System.Collections;
using Game.Common;
/// <summary>
/// 登陆游戏状态
/// </summary>
public class LoginState : IGameState
{
    GameStateType m_eStateTo;
    public LoginState()
    {

    }
    public GameStateType GetStateType()
    {
        return GameStateType.GS_Login;
    }
    public void SetStateTo(GameStateType stateType)
    {
        this.m_eStateTo = stateType;
    }
    public void Enter()
    {
        SetStateTo(GameStateType.GS_Continue);
        LoginCtrl.singleton.Enter();
    }
    public void Exit()
    {
        LoginCtrl.singleton.Exit();
    }
    public void FixedUpdate(float fixedDeltaTime)
    {

    }
    public GameStateType Update(float fDeltaTime)
    {
        return m_eStateTo;
    }
}

然后在GameStateManager的构造方法,添加到缓存字典里面。

OK,这个状态机,假如说我们调用GameStateManager的ChangeStateTo(你想要的状态类型),那么就会执行你想要的状态实现类的Enter方法。

所以我们在LoginState的Enter编写我们登陆的逻辑,因为LoginState主要是管理状态改变的,所以我们为了类的单一职责,吧所有登陆逻辑放在:LoginCtrl控制类里面。

    public void Enter()
    {
        SetStateTo(GameStateType.GS_Continue);//先转到中间状态
        LoginCtrl.singleton.Enter();
    }

LoginCtrl:

OK,写到这里,我们之后当我知道版本更新完成或者根本不需要更新,就直接弹出登陆UI的用户名输入框界面。

那么,我们就得写个LoginWindow来管理登陆UI,所以先写LoginWindow:

using UnityEngine;
using System.Collections;
using Game.Common;
using Utility;
using System;
/// <summary>
/// 登陆界面UI
/// </summary>
public class LoginWindow : BaseWindow
{
    public LoginWindow()
    {
        this.mResName = "Guis/LoginWindow";
        this.mResident = false;
    }
    public override void Init()
    {
        EventCenter.AddListener(EGameEvent.eGameEvent_LoginEnter, Show);
        EventCenter.AddListener(EGameEvent.eGameEvent_LoginExit, Hide);
    }
    public override void Realse()
    {
        EventCenter.RemoveListener(EGameEvent.eGameEvent_LoginEnter, Show);
        EventCenter.RemoveListener(EGameEvent.eGameEvent_LoginExit,Hide);
    }
    protected override void InitWidget()
    {

    }
    protected override void RealseWidget()
    {

    }
    protected override void OnAddListener()
    {

    }
    protected override void OnRemoveListener()
    {

    }
    public override void OnEnable()
    {

    }
    public override void OnDisable()
    {

    }
    public override void Update(float deltaTime)
    {
        base.Update(deltaTime);
    }
}

OK,我们在LoginWindow里面添加显示登陆界面和隐藏登陆界面事件监听。

首先,我们知道,玩LOL的时候,当我们登陆成功之后,还要选择游戏大区服务器。所以我们把选择服务器归入到登陆界面来管理。

所以我们还是需要制作一个SelectServer界面,这里我也随便搞了下界面:

未完待续。。。。。。没时间以后继续

时间: 2024-12-19 01:24:40

仿LOL项目开发第六天的相关文章

仿LOL项目开发第三天

仿LOL项目开发第二天 by草帽 昨个我们已经实现了下载功能,但是发现没有,下载的包是压缩的,没有解压开,那么Unity是识别不了的. 所以今个我们来讲讲如何实现解压文件. 还记得吗,我们在DownloadTask里面添加了一个完成下载后的一个解压委托,我们还没有实现,那么,我们就去解决他. 回到VersionManager的DownloadPackageList方法里面,在OnDownloadFinished委托里面,添加解压缩的代码. 之前讲过类的单一职责,所以不可能在VersionMana

仿LOL项目开发第四天

---恢复内容开始--- 仿LOL项目开发第四天 by草帽 上节讲了几乎所有的更新版本的逻辑,那么这节课我们来补充界面框架的搭建的讲解. 我们知道游戏中的每个界面都有自己的一个类型:比如登陆界面,创建角色界面. 既然有这么多的界面,所以呢,我们创建一个单例的UI管理器:WindowManager.cs,然后里面创建一个字典来存所有类型的界面: using UnityEngine; using System.Collections.Generic; using Game; using Game.C

仿LOL项目开发第二天

仿LOL项目开发第二天 by草帽 接着上节来讲,上节更新还没开始写代码逻辑,今天我们补充完整. 我们找到VersionManager脚本里面的CheckVersion方法: 首先我们想到检测版本,需要从服务器下载信息,那么肯定要提前检测下网络是否良好,并比较版本信息. 所以,我们写个BeforeCheck方法: /// <summary> /// 检测网络状况并对照版本信息是否一致 /// </summary> /// <param name="AsynResult

java项目开发第六天——天若有情天亦老,人间正道是沧桑

今天讲解的东西是数据库连接,一天下来还是相对轻松的,这个组长也是够轻松的,队员加载的界面自己也是导入不了,最后也是不了了之,还是加油赶赶吧.看看严嘉那组的界面,最后就是呵呵.但是学长看完后(研究生,同时还是很厉害的),最后的问题是——你们这组的分工是怎样的呢? 大神都是非常厉害的,都是一眼能够分辨利弊的.凡事留几分活路就好. 好了,好好的看看JDBC,准备连接数据库的工作吧.

团队项目开发第六天

1.昨天干了什么? 首页面加了滑动功能,但是出了很多错,继续改. 2.今天准备干什么? 首页面做完了,滑动功能也加了,但是看着很单调简陋,今天着手做下一个界面. 3.遇到什么困难? 需要连数据库,和实现页面跳转,不会啊,效率太低了!!!还是慢慢来吧.

小喵iOS开发成长记:项目开发规划索引

小喵近期在做一个小组项目.尽管还是小白,但小喵还是被赋予了组长这个“光荣”的职位. 酱紫开始了我的第一次带项目生涯--- 下面是此次项目的开发流程规划.当作一个目录用.在每个分支下遇到的问题或者研究了新的东西,都会设置索引点进去.所以大家可以收藏下篇博文哦--喵呜- 项目开发记录表 第一天 上午 (7月13日) 定项目,项目分工                                                                 第一天 下午 抓接口 (paros软件的

【小程序源码案例】微信小程序项目开发案例分享

作者:web小二本文标签: 微信小程序 小程序源码案例 小程序项目小程序的开发,并不是适合所有公司,我今天跟大家分享小程序方面的教程,主要是供大家学习使用.学习这种东西,有时候则是单纯的喜欢,没有任何目的,很单纯的为了好玩,记得很早之前学flash,没有想法,就是觉得好玩,纯娱乐爱好而已.到后来玩视频剪辑也是出于同样的原因,不图钱财名利,只是图自己个人爱好娱乐. 但是,学习,有时候则是需要有明确目的,特别是关系到自己吃饭问题的时候,你就需要非常有目的去学习,并且还需要制定好学习的计划与目标,希望

数字资产交易所搭建仿Fcoin交易所开发公司

数字资产交易所搭建仿Fcoin交易所开发公司 [本文由源中瑞涂先生编辑/交易所开发VX搜索:ruiec999]众所周知,现在市面有超过11000家交易所,更有甚者说现在交易所比项目要多.不难发现,不少交易所对技术水平和风控的安全特别重视.数字资产交易所开发是属于金融产品系统,交易所的安全性直接决定了交易所是否能生存的下去,然后就是有责任的服务,那么如何选择软件开发服务商呢,因为任何系统都不是一劳永逸的,任何系统问题都需要有系统开发者24小时随时待命服务.后续的服务要求才是系统长期生存下去的基础.

打造仿猫眼项目 以Dubbo为核心解锁微服务 高清无密 百度网盘

应用Dubbo框架打造仿猫眼项目 理解微服务核心思想 Dubbo作为主流的微服务框架之一,为开发人员带来非常多的便利.本门课程结合"仿猫眼"项目,分别针对Dubbo中的重要特性.微服务中核心内容以及面试中的常见问题,进行归纳整理,强化讲解,为你提供从零到面试的一条龙服务. 第1章 微服务入门 本章中将概要介绍微服务与传统应用之间的差异与实现优势,以便于帮助同学们更加清晰微服务在项目开发中的定位. 1-1 课程导学 1-2 传统应用带来的问题 1-3 微服务概述 第2章 演示环境构建 本