纳金网

标题: 单脚本纯GUI实现 Flappy Bird (转载) [打印本页]

作者: 刀锋狼    时间: 2014-4-30 18:31
标题: 单脚本纯GUI实现 Flappy Bird (转载)

这款游戏其实实现起来很简单,正如那个越南人说的,只是花了两三天时间就做出来了,但是它火的如此迅猛,如此诡异,各中原因还是很值得借鉴的。
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;

  4. public class FlappyBox : MonoBehaviour
  5. {
  6.         private float cStartY;
  7.         private float y;
  8.         private float x;
  9.         private float size;
  10.         private float brockSize;
  11.         private const float cacc = -500;
  12.         private float acc;
  13.         private List
  14. lCells = new List
  15. ();
  16.         private const float csep = 3;
  17.         private float fsep = csep;
  18.         private bool bStart = false;
  19.         private bool bGameOver = false;
  20.         private float btnSize;
  21.         private int score;
  22.         private int hightScore;
  23.         private bool bHighScore = false;
  24.         private float cFloorSize = 50;
  25.         void ResetMe()
  26.         {
  27.                 y = cStartY;
  28.                 acc = 0;
  29.                 lCells.Clear();
  30.                 fsep = csep;
  31.                 bStart = true;
  32.                 bGameOver = false;
  33.                 bHighScore = false;
  34.                 score = 0;
  35.                 x = Screen.width / 2 - size * 2;
  36.         }
  37.         void Start()
  38.         {
  39.                 btnSize = Screen.height / 10;
  40.                 size = Screen.height / 20;
  41.                 brockSize = size * 5;
  42.                 x = Screen.width / 2 - size * 2;
  43.                 cStartY = Screen.height / 2 - size / 2;
  44.                 y = cStartY;
  45.                 hightScore = PlayerPrefs.GetInt(cHighScorePref);
  46.         }
  47.         void OnGUI()
  48.         {
  49.                 GUI.Box(new Rect(-10, Screen.height - cFloorSize, Screen.width + 20, cFloorSize + 10), "");
  50.                 GUI.Box(new Rect(x, y, size, size), "");
  51.                 foreach (BrockCell bc in lCells)
  52.                 {
  53.                         GUI.Box(new Rect(bc.x, 0, bc.size, bc.upy), "");
  54.                         GUI.Box(new Rect(bc.x, bc.downy, bc.size, Screen.height), "");
  55.                 }

  56.                 if (bGameOver)
  57.                 {
  58.                         float btnx = Screen.width / 2 - btnSize / 2;
  59.                         float btny = Screen.height / 2 - btnSize / 2;
  60.                         if (GUI.Button(new Rect(btnx, btny, btnSize, btnSize / 2), "Restart"))
  61.                         {
  62.                                 ResetMe();
  63.                         }
  64.                         GUI.Label(new Rect(btnx, btny + btnSize / 2 + 5, btnSize, btnSize / 2), "score:" + score);
  65.                         GUI.Label(new Rect(btnx, btny + (btnSize / 3 + 5)*2, btnSize, btnSize / 2), "high score:" + hightScore);
  66.                         if (bHighScore)
  67.                         {
  68.                                 GUI.Box(new Rect(btnx, btny + (btnSize / 2 + 10) * 2, btnSize*2, btnSize / 3), "new high score!");
  69.                         }
  70.                         
  71.                         return;
  72.                 }

  73.                 if (!bStart)
  74.                 {
  75.                         return;
  76.                 }

  77.                 GUI.Label(new Rect(10, 10, 100, 20), "score:" + score);
  78.         }
  79.         const string cHighScorePref = "highscore";
  80.         void OnGameOver()
  81.         {
  82.                 bGameOver = true;
  83.                 if (score > PlayerPrefs.GetInt(cHighScorePref))
  84.                 {
  85.                         PlayerPrefs.SetInt(cHighScorePref, score);
  86.                         hightScore = score;
  87.                         bHighScore = true;
  88.                 }
  89.         }
  90.         private const float c_g = 980;
  91.         void Update()
  92.         {
  93.                 if (bGameOver)
  94.                 {
  95.                         if (y + size < Screen.height - cFloorSize)
  96.                         {
  97.                                 acc += Time.deltaTime * c_g;
  98.                                 y += Time.deltaTime * acc;
  99.                         }
  100.                         return;
  101.                 }

  102.                 if (Input.GetMouseButtonDown(0))
  103.                 {
  104.                         if (!bStart)
  105.                         {
  106.                                 ResetMe();
  107.                         }
  108.                         acc = cacc;
  109.                 }
  110.                 if (!bStart)
  111.                 {
  112.                         return;
  113.                 }

  114.                 fsep -= Time.deltaTime;
  115.                 if (fsep < 0)
  116.                 {
  117.                         fsep = csep;
  118.                         lCells.Add(new BrockCell());
  119.                 }

  120.                 foreach (BrockCell bc in lCells)
  121.                 {
  122.                         bc.x -= Time.deltaTime * 100;

  123.                         if (x + size > bc.x
  124.                                 && (y < bc.upy || y + size > bc.downy)
  125.                                 && x < bc.x + size
  126.                                 && (y < bc.upy || y + size > bc.downy))
  127.                         {
  128.                                 OnGameOver();
  129.                         }
  130.                         else if (!bc.bPassed && x > bc.x + bc.size / 2)
  131.                         {
  132.                                 score++;
  133.                                 bc.bPassed = true;
  134.                         }
  135.                 }

  136.                 acc += Time.deltaTime * c_g;
  137.                 y += Time.deltaTime * acc;

  138.                 if (y < 0 || y + size > Screen.height - cFloorSize)
  139.                 {
  140.                         OnGameOver();
  141.                 }
  142.         }
  143. }

  144. public class BrockCell
  145. {
  146.         public float upy;
  147.         public float downy;
  148.         public float size;
  149.         public float x;
  150.         public bool bPassed;
  151.         public BrockCell()
  152.         {
  153.                 size = Screen.height / 16;
  154.                 x = Screen.width + size;
  155.                 upy = Screen.height / 20 * Random.Range(0, 13);
  156.                 downy = upy + Screen.height / 20 * 5.5f;
  157.         }
  158. }
复制代码

作者: xx232    时间: 2014-4-30 19:53
小笨鸟都火过头了   哎  搞不懂啊搞不懂
作者: wusky751023    时间: 2014-5-7 02:50
越式朝不同角度思考,越能滿足不同遊戲玩家啊!!!@@
好東西,學習去!@@




欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5