unity打飞碟

2023-11-06

unity hw4

1、编写一个简单的鼠标打飞碟(Hit UFO)游戏

游戏的演示视频地址:http://v.youku.com/v_show/id_XMzU0Mjg0NDg3Mg==.html?spm=a2h3j.8428770.3416059.1

根据老师课件中的uml图,进行游戏的设计。
这里写图片描述
游戏的简要介绍:本次的飞碟游戏一共三关,并且没有中断,有三种飞碟,速度大小和颜色不同,第一关刷第一级别的飞碟,第二关会随机刷第一、二级别的飞碟,第三关会随机刷第一、二、三级别的飞碟。每关有10个左右的飞碟,飞碟级别越高得分也越高,暂停关卡的话点击飞碟是不会有任何效果的。

开始先预先做好飞碟的预设,飞碟只是一个高度很矮的圆柱,不同级别的飞碟会用脚本直接调节飞碟的组件属性,因此只有一个飞碟预设。
这里写图片描述
首先是飞碟类的代码编写,该类有一个私有的游戏对象飞碟,以便直接对飞碟的颜色,大小等等进行调整,由于一个飞碟由工厂生产出来后就会不停的使用以节省对象生成和销毁的开销,因此飞碟重新使用时会有一个reset()方法来重新设置飞碟的参数,reset()方法通过传递该飞碟的等级,来进行大小、速度等等调整。

public class diskInfo{
    public GameObject disk;
    public int diskId;
    public int lever;
    public diskInfo(int id , int lever){
        this.diskId = id;
        disk = GameObject.Instantiate(Resources.Load<GameObject>("prefabs/disk" ), Vector3.zero , Quaternion.identity);
        disk.name = "disk" + id.ToString ();
        reset (lever);
    }

    public void reset(int lever){
        disk.transform.position = new Vector3 (Random.Range (-10f, 10f), Random.Range (-10f, 10f), Random.Range (0f, 2f));
        switch (lever) {
        case 1:
            disk.GetComponent<Renderer> ().material.color = Color.red;
            disk.transform.localScale = new Vector3 (3f, 0.3f, 3f);
            break;
        case 2:
            disk.GetComponent<Renderer> ().material.color = Color.yellow;
            disk.transform.localScale = new Vector3 (2f, 0.2f, 2f);
            break;
        default:
            disk.GetComponent<Renderer> ().material.color = Color.grey;
            disk.transform.localScale = new Vector3 (1f, 0.1f, 1f);
            break;
        }
        this.lever = lever;
        disk.SetActive(true);
    }
}

接下来就是写飞碟工厂,used队列是存放在使用的飞碟,free是队列是存放没有在飞的飞碟,场记找飞碟工厂要飞碟的时候,飞碟工厂就看free队列有没有飞碟,没有才新建,尽可能减少对象的新建,还有别的一些方法,reset()用于游戏重新开始的重置,getNowUsedDisk()用于获得当前在飞的飞碟的个数,getHitDisk()用于获得被点击的飞碟的所属于的类,freeDisk()用于在飞碟被点击到后将飞碟类放到free队列。

public class DiskFactory: MonoBehaviour {
    private int allDiskNum = 0;
    private List<diskInfo> used = new List<diskInfo>();
    private List<diskInfo> free = new List<diskInfo>();

    public diskInfo getDisk(int lever ){
        diskInfo nowDisk = null;
        if (free.Count > 0) {
            nowDisk = free [0];
            nowDisk.reset (lever);
            used.Add (free [0]);
            free.Remove (free [0]);

        } else {
            allDiskNum++;
            nowDisk = new diskInfo (allDiskNum , lever);
            used.Add (nowDisk);
        }

        return nowDisk;

    }   

    public void reset(){
        foreach (diskInfo temp in used) {
            temp.disk.SetActive (false);
            free.Add (temp);
        }
        used.Clear ();
    }

    public int getNowUsedDisk(){
        return used.Count;
    }

    public void freeDisk(diskInfo diskinfo){
        if (used.Contains (diskinfo)) {
            diskinfo.disk.SetActive (false);
            used.Remove (diskinfo);
            free.Add (diskinfo);
        }

    }

    public diskInfo getHitDisk(GameObject disk){
        foreach (diskInfo i in used) {
            if (i.disk == disk) {
                return i;
            }
        }
        return null;
    } 
}

动作的基类与之前相同。

public enum SSActionEventType : int { Started, Competeted }

public interface ISSActionCallback
{
    void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,
        int intParam = 0, string strParam = null, Object objectParam = null);
}

public class SSAction : ScriptableObject
{
    public bool enable = true;
    public bool destroy = false;

    public GameObject gameobject { get; set; }
    public Transform transform { get; set; }
    public ISSActionCallback callback { get; set; }

    protected SSAction() { }

    public virtual void Start()
    {
        throw new System.NotImplementedException();
    }

    public virtual void Update()
    {
        throw new System.NotImplementedException();
    }
}

然后是飞碟运动的类,飞碟的运动终点是一个随机的区域(与飞碟初始的随机位置区域不重叠),速度则是根据该飞碟的等级来调。

public class diskMove : SSAction {
    public Vector3 aim;
    public float speed;
    public diskInfo thisDisk;
    public float time = 0;
    // Use this for initialization
    public override void Start () {

    }

    public static diskMove getDiskMove( diskInfo disk , int lever ){
        diskMove action = ScriptableObject.CreateInstance<diskMove> ();
        switch (lever) {
        case 1:
            action.speed = 6f;
            break;
        case 2:
            action.speed = 8f;
            break;
        case 3:
            action.speed = 10f;
            break;
        }
        action.thisDisk = disk;
        action.aim = new Vector3(Random.Range(-2f, 2f) , Random.Range(-2f, 2f) , Random.Range(4f, 10f) );
        return action;

    }

    // Update is called once per frame
    public override void Update () {
        gameobject.transform.position = Vector3.MoveTowards (gameobject.transform.position, aim, speed * Time.deltaTime);

        if (this.transform.position == aim) {
            this.destroy = true;
            this.enable = false;
            Singleton<DiskFactory>.Instance.freeDisk (thisDisk);
            thisDisk.disk.SetActive(false) ;
        }
    }
}

写完飞碟的运动类,接下来就是动作管理器的基类,在这里基本上也是照搬前面的,唯一有点不同的就是暂停游戏的时候就要停止更新动作队列里的动作,还有要是飞碟已经被打中了,active为false时,那么该动作就移除了(避免飞碟工厂重新用这飞碟的时候飞碟有两个动作,引起bug)。

public class SSActionManager : MonoBehaviour {
    protected Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();
    protected List<SSAction> waitingAdd = new List<SSAction>();
    protected List<int> waitingDelete = new List<int>();
    protected roundController roundCtrl ;

    void Start()
    {

    }

    public SSActionManager(){
        roundCtrl = (roundController)Director.getInstance ().currentSceneController;

    }
    protected void Update()
    {
        if (roundCtrl.status == "pause") //停止玩就不更新action了
            return;
        foreach (SSAction ac in waitingAdd) actions[ac.GetInstanceID()] = ac;
        waitingAdd.Clear();

        foreach (KeyValuePair<int, SSAction> kv in actions)
        {
            SSAction ac = kv.Value;
            if (ac.gameobject.active == false || ac.destroy)//gameobject的active是false就不更新action了
            {
                waitingDelete.Add(ac.GetInstanceID());
            }
            else if ( ac.enable)
            {
                ac.Update();
            }

        }

        foreach (int key in waitingDelete)
        {
            SSAction ac = actions[key]; actions.Remove(key); DestroyObject(ac);
        }
        waitingDelete.Clear();
    }

    public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager)
    {
        action.gameobject = gameobject;
        action.transform = gameobject.transform;
        action.callback = manager;
        waitingAdd.Add(action);
        action.Start();
    }
}

动作管理器的子类很简单,只多了个reset方法,用于重置游戏的时候清空动作队列。

public class CCActionManager : SSActionManager,ISSActionCallback {

    public void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,
        int intParam = 0, string strParam = null, Object objectParam = null){

    }
    //清楚所有action,
    public void reset(){
        actions.Clear ();
    }
}

然后就是gui的编写,在这里主要实现一些与用户交互的按钮,以及鼠标点击了飞碟发射了射线后的处理。

public class UserGui : MonoBehaviour {
    roundController roundCtrl;
    bool ifShowWin = false;
    // Use this for initialization
    void Start () {
        roundCtrl = (roundController)Director.getInstance ().currentSceneController;
    }

    // Update is called once per frame
    void Update () {
        if (roundCtrl.status == "gameover" || roundCtrl.status == "pause") {
            return;
        }
        checkClick ();
    }

    void OnGUI(){
        string showButtonText;
        GUI.Box (new Rect (15, 15, 120, 50) ,"");
        GUI.Label (new Rect (15, 15, 120, 25), "status: " + roundCtrl.status);
        GUI.Label (new Rect (15, 40, 120, 25), "score: " + roundCtrl.scoreCtrl.getScore() );
        if (roundCtrl.status == "running") {
            showButtonText = "pause";
        } 
        else if(roundCtrl.status == "gameover" ) {
            showButtonText = "start";
        }
        else  { //status = pause
            showButtonText = "go on";
        }

        if (GUI.Button (new Rect (15, 70, 120, 30), showButtonText)) {
            if (showButtonText == "go on") {
                roundCtrl.status = "running";
            } else if (showButtonText == "start") {
                roundCtrl.status = "running";
                roundCtrl.reset ();
            } else { //showButtonText = pause
                roundCtrl.status = "pause";
            }
        }

        if (GUI.Button (new Rect (15, 110, 120, 30), "reset")) {

            roundCtrl.status = "running";
            roundCtrl.reset ();
        }

    }

    void checkClick(){
        if (Input.GetButtonDown ("Fire1")) {
            Vector3 mp = Input.mousePosition;
            Camera ca = Camera.main;
            Ray ray = ca.ScreenPointToRay (Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast (ray, out hit)) {
                ((roundController)Director.getInstance ().currentSceneController).hitDisk (hit.transform.gameObject);
            }
        }
    }
}

根据老师ppt写了Singleton类来获取单例

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour{
    protected static T instance;
    public static T Instance{
        get{ 
            if (instance == null) {
                instance = (T)FindObjectOfType (typeof(T));
                if (instance == null) {
                    Debug.LogError ("An instance of " + typeof(T) +
                    " is needed in the scene, but there is none.");
                }
            }
            return instance;
        }
    }
}

然后就是回合场记的编写,回合场记主要就是决定要不要放飞碟,要放多少个等等的方法,当然还要记录下现在的回合数,还有游戏的当前状态等等。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using baseCode;
public class roundController : MonoBehaviour ,sceneController , UserAction {
    public string status = "running"; // running , pause , gameover
    DiskFactory diskFac ;
    int roundLever = 1;
    int numOfDiskAlredySend = 0;
    float time = 0;
    float sendDiskTime = 1;

    CCActionManager actionManager;
    public ScoreController scoreCtrl = new ScoreController();

    void Awake(){
        Director director = Director.getInstance ();
        director.currentSceneController = this;
        this.gameObject.AddComponent<DiskFactory>();
        this.gameObject.AddComponent<CCActionManager> ();
        this.gameObject.AddComponent<UserGui> ();

    }
    // Use this for initialization
    void Start () {
        diskFac = Singleton<DiskFactory>.Instance;
        actionManager = Singleton<CCActionManager>.Instance;
    }

    // Update is called once per frame
    void Update () {
        if (status == "pause" || status == "gameover") {
            return;
        } 
        else if (roundLever > 3) {
            if(diskFac.getNowUsedDisk() == 0)
                status = "gameover";
            return;
        }
        else if (numOfDiskAlredySend >= 10) {
            numOfDiskAlredySend = 0;
            roundLever++;
        }
        time += Time.deltaTime ;
        checkIfSendDisk ();

    }


    public void hitDisk(GameObject disk){
        diskInfo temp = diskFac.getHitDisk (disk);
        if (temp == null) {
            Debug.Log ("the disk of clicked is null? ");
        } else {
            scoreCtrl.addScore (temp.lever);
            diskFac.freeDisk (temp);
        }


    }

    private void checkIfSendDisk(){
        if(time > sendDiskTime){
            float randomNumOfSend = Random.Range (0f, roundLever);
            int numOfSendDisk;
            //决定要送的碟数
            if (randomNumOfSend <= 1) {
                numOfSendDisk = 1;
            } else if (randomNumOfSend <= 2) {
                numOfSendDisk = 2;
            } else {
                numOfSendDisk = 3;
            }
            sendSomeDisks (numOfSendDisk);
            time = 0;
        }
    }

    private void sendSomeDisks(int num){
        for (int loop = 0; loop < num; loop++) {
            float randomNumOfLever = Random.Range (0f, roundLever);
            int thisDiskLever;
            //决定要送的碟的lever
            if (randomNumOfLever <= 1) {
                thisDiskLever = 1;
            } else if (randomNumOfLever <= 2) {
                thisDiskLever = 2;
            } else {
                thisDiskLever = 3;
            }
            sendOneDisk (thisDiskLever);
        }
    }

    private void sendOneDisk(int sendLever){
        numOfDiskAlredySend++;
        diskInfo oneDisk = diskFac.getDisk ( sendLever );
        diskMove moveAction = diskMove.getDiskMove(oneDisk , sendLever );
        actionManager.RunAction (oneDisk.disk , moveAction , null);
    }

    public void loadResources(){

    }

    public void reset(){
        actionManager.reset ();
        diskFac.reset ();
        scoreCtrl.reset ();
        roundLever = 1;
        numOfDiskAlredySend = 0;
        status = "running";
    }

}

当然也还有记分员,但记分员比较简单,就负责记分还有重置分数

public class ScoreController{
    int score = 0 ;
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    public void addScore(int lever ){
        score += lever;
    }

    public int getScore(){
        return score;
    }

    public void reset(){
        score = 0;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity打飞碟 的相关文章

  • Unity3D C#数学系列之点积

    文章目录 1 定义 2 几何意义 3 向量a 向量b xaxb yayb zazb 4 应用案例 4 1 求两向量的夹角 4 2 判断两向量是否垂直 4 3 判断NPC是否在攻击范围内 4 4 已知入射光线和表面法线求反射光线 5 项目 1
  • unity如何解决每次写完敲代码,调试时需要卡个进度条

    解决办法如下 勾选上之后程序就可以立刻运行起来了 再也不用一直卡进度条了 不过也有弊端的 会影响静态字段初始化有问题还有Dotween的一些效果会发生变化 谨慎避免入坑
  • 关于Albedo贴图、颜色贴图、Metallic 贴图、Specular贴图、法线贴图、视差贴图、凹凸贴图、Height Map高度贴图、AO 贴图Occlusion 贴图、Emission 贴图等

    在学习unity的过程中 被各种贴图弄得晕头转向 为了弄清楚各种贴图 查询了很多资料 粗略的整理如下 只要耐心看完 对贴图的基本用法基本上就没问题了 1 Albedo 贴图 可以看做是Diffuse颜色贴图 Albedo 反照率 贴图 用于
  • unity 五种旋转方式localEulerAngles、eulerAngles、rotation、localRotation和Rotate的区别

    1 1 transform localEulerAngles 使用localEulerAngles进行旋转的时候 我们要使用transform localEulerAngles new Vector3 x y z 其中 new Vector
  • Unity之Animation动画

    Unity之Animation动画 Unity之Animation绘制动画 这篇文章做最简单的动画 让一个立方体从左边移动到右边 1 创建一个Unity的新工程 名为TestAnimation 点击Create And Open按键 打开工
  • Unity3d 简单的按照路径移动物体!

    在TORQUE引擎中 我们只要设置几个点 然后物体会按照这几个点顺序移动 Unity3d也可以的 现在介绍一个很简单的按照路径移动的方法 目标是让蓝色方块沿着紫色方块组成的路径移动 设计思想就是让蓝色方块移动第一个 然后继续移动到第二个 然
  • Unity3d中使用OnGUI()函数判断“键盘按下抬起”功能的新方法。

    private bool flagJudgeDownAllow true 开始值为true void OnGUI key Event current FunctionKeyCodeV1 key private void FunctionKe
  • Unity的Text Mesh Pro文字显示重叠处理

    在使用Text Mesh Pro的时候 出现文字重叠 如图 在编辑器内显示是正确的 最后发现是换行造成的 原本的文字是从pdf中复制过来 就会重叠 在记事本中删除换行用回车再次换行就能正确显示
  • Unity3D中通过代码修改子物体层级的顺序

    今天有个同事问我如何在程序中修改子物体的层级关系来改变遮挡关系 我给他敲出来一句代码 UI的层级关系是通过渲染表现出来的 在canvas下的物体 排序越靠前的越先被渲染 这样一来就会 被后来渲染的遮挡 总结一下有三句代码是修改子物体的层级的
  • Unity3D射线检测

    射线检测主要用于像子弹是否打中物体 捡取物品等情况 本来面向百度想找例子看看 不过没找到合适的 还是自己总结尝试吧 以下测试Unity3D版本 2017 4 2f2 射线的检测步骤如下 1 Ray 这个类为了产生一个射线 如果我们想要场景中
  • unity3d实现简单的打飞碟游戏

    游戏内容 游戏有n个round 每个round发射10次trial 每个trial的飞碟都可能不同 包括速度角度得分等 使用鼠标进行射击 点中即表示射击成功 游戏要求 使用带缓存的工厂模式来管理飞碟的生产与再利用 工厂使用单例模式 游戏的设
  • Unity+Pico 手柄按键控制

    一 定义手柄按键API 1 InputDevices GetDeviceAtXRNode 通过XRNode获取对应的设备 2 XRNode是一个枚举类型 包含LeftEye RightEye CenterEye Head LeftHand
  • RAIN{INDIE} 自动寻路

    Unity游戏中有较多的自动寻路插件 看过几个 大同小异 而RAIN中的Behavior Tree感觉很好 听名字就知道很条理 下面 就用它做个简单的寻路小例子 首先 导入RAIN的包 结构如下 在使用的过程当中还会产生几个文件夹用来存放E
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • unity的LOD组件

    本文转载自http blog csdn net huutu article details 52106468 LOD是Level Of Detais 的简称 多细节层次 在游戏场景中 根据摄像机与模型的距离 来决定显示哪一个模型 一般距离近
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • Mecanim Any State

    Any State表示任意状态 任意状态是 一个一直存在的特殊状态 他的存在是为了保证你在无意转移至某个你当前正处于的特殊状态而准备的 为你的状态机中的每个状态设置相同的对外转移是一个快捷的方式 假如有Walk Run Fly Die这四个
  • NO.6——Unity3D中两种绘制小地图的方法

    在玩游戏时 你经常会发现 在游戏窗口的右上角或者左下角通常会有一个小地图 里边实时反馈角色的移动信息甚至是世界地图 那么这个小地图是如何绘制的呢 我目前掌握了两种方法 一种是以GUI方法重新绘制一个小窗口 另一种是新建一个正交投影的摄像机机
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w

随机推荐

  • 012 python数据结构与算法:链表

    链表 为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间 而在进行扩充时有需要进行数据的搬迁 所以使用起来并不是很灵活 链表结构可以充分的利用计算机内存空间 实现灵活的内存动态管理 链表的定义 链表 Linked list
  • 程序员推荐简单有效的科学健脑方法

    勤练脑力可使记忆力增强 勤做有氧运动可使大脑灰质增加 勤于思考可使理智与情感有机互补 这些措施看上去很美 但美中不足的是 它们对大脑的训练都不够彻底 这也是越来越多此类研究的通病 记忆训练对大脑的好处当然比看真人秀什么的要靠谱得多 但这些训
  • 基于C++标准模板库(STL)的sort排序函数,超实用介绍!!!

    sort函数 简介 顾名思义 sort就是用来排序的函数 它可以根据具体情形进行自动或人为使用不同得排序方法 接下来希望通过这篇介绍来帮助读者们轻松愉快地使用sort函数 1 如何使用sort排序 使用条件 sort函数的使用必须加上头文件
  • 扫描流——Scanner类

    BufferedReader类方便了对大文本数据文件的读取操作 但是它存在两个问题 读取数据的时候只能按照字符串返回 public String readLine throws IOException 分隔符是固定的 以换行作为分隔符 于是
  • Attention+GRU

    数据集 纳斯达克100 模型原理 模型代码 class Attention Layer def init self step dim W regularizer None b regularizer None W constraint No
  • 软件开发人员的作战手册 - 让程序员活的久一点

    1 程序员的职业准则是 诚实 如实的报告你的状态 风险和出现的问题 守信 承诺完成的任务就要按时完成 尊重 尊重给你的代码提建议的同事 对事不对人 2 写有BUG 的代码和写没有 BUG 的代码花费的时间是一样的 3 BUG是会成长的 存活
  • vue中本地静态图片的路径应该如何写

    需求 如何components里面的index vue怎样能把assets里面的图片拿出来 1 在img标签里面直接写上路径 img src assets a1 png class width 100 2 利用数组保存再循环输出
  • spring boot配置tomcat部署(12.24修改)

    spring boot本身默认为jar包运行 可以改为war包 然后运行在tomcat里 具体修改的步骤如下 1 在pom xml文件里添加需要的依赖
  • Read keyboad input from background process

    https raspberrypi stackexchange com questions 55431 read keyboad input from background process TIPS For a new project I
  • 9、利用Maven的Source插件,对Maven工程的源码进行打jar包

    在很多情况下 需要对于Maven工程的源代码进行源文件的打包 可以利用source插件来完成 利用Maven的Source插件 对Maven工程的源码进行打jar包 1 新建一个Maven项目 如下 2 对于source插件的简介如下 1
  • freemarker教程

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎 一个基于模板生成文本输出的通用工具 使用纯Java编写 FreeMarker被设计用来生成HTML Web页面 特别是基于MVC模式的应用程序 虽然
  • 高级计算机网络 知识点总结

    高级计算机网络知识点总结 一 引言 一 OSI七层模型 OSI定义了网络互连的七层框架 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 即ISO开放互连系统参考模型 每一层实现各自的功能和协议 并完成与相邻层的接口通信 OSI的
  • 5G及移动边缘计算(MEC)学习笔记(1)

    原文链接 https blog csdn net gongxifacai believe article details 80804841 1 1G 5G发展变革 1G 第一代移动通信系统出现在蜂窝系统理论提出之后 主要满足人们无线移动通话
  • GameFi 增长: 如果保持游戏用户的留存

    Mar 2023 Daniel 链游存在用户留存低的问题 对于所有关于成为游戏的未来的讨论 90 的区块链游戏在30天内就不活跃了 如果没有玩家长期享受游戏 今天大多数GameFi项目仍然只是DeFi协议 以及有更漂亮的图形和一些互动元素
  • idea 安装 Vue 插件后没有新建Vue文件Vue component选项

    解决办法 2 copy之后会出现一个新文件 Name 改成 Vue Component 然后把代码里的 COMPONENT 删掉即可
  • Android高斯模糊(毛玻璃效果)蒙层库

    ShapeBlurView ShapeBlurView库是一个高斯模糊 毛玻璃效果 蒙层库 Like iOS UIVisualEffectView不知大家做需求的时候是否有这样的效果要求 需求示例 大家熟悉的Android常用图片加载库 比
  • 剑指 Offer 62. 圆圈中最后剩下的数字(leetcode)--约瑟夫问题

    文章目录 题目描述 算法 约瑟夫问题 算法描述 解决方案 普通解法 缺点 公式法 代码 题目描述 算法 约瑟夫问题 算法描述 约瑟夫问题是个著名的问题 N个人围成一圈 第一个人从1开始报数 报M的将被杀掉 下一个人接着从1开始报 如此反复
  • 该连接被站点断开怎么办_上网速度慢、掉线怎么办

    又到周末啦 休息的小伙伴可以在家里看看视频 玩玩手机 打打王者 彪彪飞车 但是网络突然出现网速慢掉线 电视看不了 游戏玩不了 怎么办呢 还要追剧呢 还要打团呢 还要飙车呢 好难过 别着急 小助手来帮你 上网速度慢怎么办 1 访问某个站点服务
  • [需求管理-11]:需求拆分常见的原则与方法

    目录 前言 第1章 需求拆分的原则 1 1 理解需要背后的客户价值 1 2 参考 用户故事的定义方法 1 3 系统需求的层次 1 4 需求拆分的INVEST原则 小而整 1 5 需求拆分的三个准则 一个用户 完整价值 不依赖 第2章 9 种
  • unity打飞碟

    unity hw4 1 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏的演示视频地址 http v youku com v show id XMzU0Mjg0NDg3Mg html spm a2h3j 8428770 3416059