- •1 Аналіз предметної області
- •Предметна область
- •Існуючі реалізації гри
- •1.3 Обґрунтування вибору мови програмування
- •1.4 Постановка задачі
- •1.5 Висновки
- •2 Проектування методів та засобів гри «Jump Way»
- •Проектування uml-діаграм класів
- •2.2 Проектування uml – діаграм послідовностей
- •2.3 Проектування блок – схеми алгоритму програми
- •2.4 Проектування користувацького інтерфейсу
- •2.5 Висновки
- •3 Програмна реалізація гри «jump way»
- •3.1 Процес розробки користувацького інтерфейсу
- •3.2 Програмна реалізація гри
- •3.3 Інструкція користувача
- •3.4 Висновки
- •Висновки
- •Перелік посилань
- •Додатки додаток а(обов’язковий)
2.5 Висновки
В даному розділі було спроектовано UML - діаграми класів та їх залежностей. В даних діаграмах зображуються класи (до яких входять методи та атрибути) та їх зв’язок. UML-діаграми класів застосовуються при прямому та зворотному проектуванні. Також було спроектовано UML-діаграму послідовностей класів, та блок-схему алгоритму здійснення ходу.
Блок – схеми та UML-діаграми послідовностей допомагають відобразити послідовність дій у програмі. В розділі також розроблено користувацький інтерфейс програми.
3 Програмна реалізація гри «jump way»
На основі спроектованих методів та засобів гри «Jump way» розробимо програмну реалізацію гри, опишемо створений інтерфейс користувача та інструкцію роботи з програмою.
3.1 Процес розробки користувацького інтерфейсу
На початку створення сцени одразу існує поле, на якому буде створюватись інтерфейс програми, та камера, яка визначає, що саме на сцені бачитиме користувач. Оскільки дана гра не передбачає пересування героїв у просторі, камеру зроблено статичною.
Наступним кроком став імпорт зображень, які будуть фоном та героями. Для того, щоб імпортувати зображення потрібно додати його до папки Assets, яка знаходиться у розділі Project, а потім просто перетягнути на місце на сцені, де воно має розташовуватись. У разі, якщо необхідно розташувати зображення одне за одним чи повернути їх, необхідно змінити налаштування у розділі Transform вкладки Inspector. Щоб об’єкти могли взаємодіяти і рухатись, до них необхідно додати Collider та Rigidbody2D, які знаходяться у розділі «Add Component => Physics2D». Після цього можна переходити до програмної частини.
Для створення головного меню можна використати UI (User Interface) System. Дана система дозволяє створювати яскраве меню, яке створюється не на основі коду, а за допомогою інструментів візуальної розробки.
Для початку потрібно накинути сценарій на камеру:
private void Awake()
{
m_Camera = GetComponentInChildren<Camera>();
}
private void FixedUpdate()
{
Move();
Zoom();
}
Даний клас ініціалізує камеру.
3.2 Програмна реалізація гри
Створення програми починається із розробки інтерфейсу. Після цього за об’єктами закріпляються сценарій, в яких описується логіка гри.
Гравець повинен натиснути в певну область поля гри .
private bool clicked; void Update ()
{ if (clicked && dirLight.intensity != 0) dirLight.intensity -= 0.03f; if (clicked && dirLight_2.intensity >= 1.05f) dirLight.intensity -= 0.025f; }
void OnMouseDown () {
clicked = true; // Works only ones playTxt.gameObject.SetActive (false); record.gameObject.SetActive (true); gameName.text = "0"; buttons.GetComponent <Scrollobjectg> ().speed = -10f; buttons.GetComponent <Scrollobjectg> ().checkPos = -130f; m_cube.GetComponent <Animation> ().Play ("StartGameCube"); StartCoroutine (CubeToBlock ()); m_cube.transform.localScale = new Vector3 (1f, 1f, 1f); cubes_anim.Play ();
Після старту гри, натиском кнопки миші куб стає на певну позицію, і з’явиться нова платформа довільного розміру, на довільній позиції у просторі. В разі попадання кубу на потрібну платформу повинна з’явитись нова платформа, і видалитись попередня.
public GameObject block, allCubes; private GameObject blockInst; private Vector3 blockPos; private float speed = 7f; private bool onPlace; void Start ()
{ spawn (); } void Update ()
{ if (blockInst.transform.position != blockPos && !onPlace) blockInst.transform.position = Vector3.MoveTowards (blockInst.transform.position, blockPos, Time.deltaTime * speed); else if (blockInst.transform.position == blockPos) onPlace = true; if (CubeJump.jump && CubeJump.nextBlock)
{ spawn (); onPlace = false; } } float RandScale () { float rand; if (Random.Range (0, 100) > 80) rand = Random.Range (1.2f, 2f); else rand = Random.Range (1.2f, 1.5f); return rand; } void spawn ()
{ blockPos = new Vector3 (Random.Range (0.7f, 1.7f), -Random.Range (0.6f, 3.2f), -5.8f); blockInst = Instantiate (block, new Vector3 (9f, -5f, -5.8f), Quaternion.identity) as GameObject; blockInst.transform.localScale = new Vector3 (RandScale (), blockInst.transform.localScale.y, blockInst.transform.localScale.z); blockInst.transform.parent = allCubes.transform; } }
void OnTriggerEnter (Collider other)
{ if (other.tag == "Cube") Destroy (other.gameObject); } }
if (!lose) { nextBlock = true; count_blocks++; print ("Next One");
}
}
}
Після того, як користувач почне гру, йому потрібно визначити силу яка надається кубу шляхом затиснення лівої кнопки мишки. Якщо відпустити кнопку, куб набуде певної сили і полетить в обраному напрямі з обраною швидкістю. Це здійснюється таким чином:
void Start ()
{ StartCoroutine (CanJump ()); } void FixedUpdate ()
{ if (animate && mainCube.transform.localScale.y > 0.4f) PressCube (-scratch_speed); else if (!animate && mainCube != null)
{ if (mainCube.transform.localScale.y < 1f) PressCube (scratch_speed * 3f); else if (mainCube.transform.localScale.y != 1f) mainCube.transform.localScale = new Vector3 (1f, 1f, 1f); } if (mainCube != null)
{ if (mainCube.transform.position.y < -7.5f)
{ Destroy (mainCube, 0.5f); print ("Player Lose"); lose = true; } } if (lose) PlayerLose (); } void PlayerLose ()
{ buttons.GetComponent <Scrollobjectg> ().speed = 5f; buttons.GetComponent <Scrollobjectg> ().checkPos = 0; if (!lose_buttons.activeSelf) lose_buttons.SetActive (true); lose_buttons.GetComponent <Scrollobjectg> ().checkPos = 70; } void OnMouseDown () { if (nextBlock && mainCube.GetComponent <Rigidbody> ())
{ animate = true; startTime = Time.time; yPosCube = mainCube.transform.localPosition.y; } } void OnMouseUp () { if (nextBlock && mainCube.GetComponent <Rigidbody> ())
{ animate = false; //Jump jump = true; float force, diff; diff = Time.time - startTime; if (diff < 3f) force = 190 * diff; else force = 280f; if (force < 60) force = 60; mainCube.GetComponent <Rigidbody> ().AddRelativeForce (mainCube.transform.up * force); mainCube.GetComponent <Rigidbody> ().AddRelativeForce (mainCube.transform.right * -force); StartCoroutine (checkCubePos ()); nextBlock = false; } } void PressCube (float force )
{ mainCube.transform.localPosition += new Vector3 (0f, force * Time.deltaTime, 0f); mainCube.transform.localScale += new Vector3 (0f, force * Time.deltaTime, 0f); } IEnumerator checkCubePos ()
{ yield return new WaitForSeconds (1.5f); if (yPosCube == mainCube.transform.localPosition.y)
{ print ("Player Lose "); lose = true; } else { while (!mainCube.GetComponent <Rigidbody> ().IsSleeping ())
{ yield return new WaitForSeconds (0.05f); if (mainCube == null) break; } if (!lose) { nextBlock = true; count_blocks++; print ("Next One"); mainCube.transform.localPosition = new Vector3 (1.8f, mainCube.transform.localPosition.y, mainCube.transform.localPosition.z); mainCube.transform.eulerAngles = new Vector3 (0f, mainCube.transform.eulerAngles.y, 0f); }
} IEnumerator CanJump () { while (!mainCube.GetComponent <Rigidbody> ()) yield return new WaitForSeconds (0.05f); yield return new WaitForSeconds (1f); nextBlock = true;
}
}
}
У разі невдалої спроби користувача потрапити на потрібний блок, повинно викликатись меню програшу з можливістю почати гру спочатку.
IEnumerator checkCubePos ()
{ yield return new WaitForSeconds (1.5f); if (yPosCube == mainCube.transform.localPosition.y)
{ print ("Player Lose "); lose = true;
void Start ()
{ Destroy (gameObject, 1f); } // Update is called once per frame void Update ()
{ transform.position += new Vector3 (0, 0.2f, 0); } }
public float speed = 5f, checkPos = 0f; private RectTransform rec; void Start() { rec = GetComponent <RectTransform> (); } void Update()
{ if (rec.offsetMin.y != checkPos)
{ rec.offsetMin += new Vector2 (rec.offsetMin.x, speed); rec.offsetMax += new Vector2 (rec.offsetMax.x, speed); } } }
void OnMouseUpAsButton () { switch (gameObject.name) { case "Restart": SceneManager.LoadScene ("main"); break;
}
}
}
Після вдалих спроб, користувач набирає певні очки які дорівнюють кількості вдалих прижків. Ми використаємо лічильник загальної кількості очків за весь процес гри, і за окремо взяту гру.
public Text record; private Text txt; private bool gameStart; void Start ()
{ record.text = "TOP: " + PlayerPrefs.GetInt ("Record").ToString (); txt = GetComponent <Text> (); CubeJump.count_blocks = 0; } void Update ()
{ if (txt.text == "0") gameStart = true; if (gameStart)
{ txt.text = CubeJump.count_blocks.ToString (); if (PlayerPrefs.GetInt ("Record") < CubeJump.count_blocks)
{ PlayerPrefs.SetInt ("Record", CubeJump.count_blocks); record.text = "TOP: " + PlayerPrefs.GetInt ("Record").ToString (); } } } }
