Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine.UI;
- using UnityEngine;
- public class SnekController : MonoBehaviour {
- public List<GameObject> Snake = new List<GameObject> ();
- public int sizeOfSnake;
- public float TimeToMove;
- public string dir = "right";
- public Vector3 tempPos;
- private float elapsedTime;
- public Text elTime;
- private Sprite TurnSprite;
- private Sprite BodySprite;
- private Sprite TailSprite;
- void Start () {
- initSNEK ();
- SpriteLoads ();
- }
- void Update () {
- Inputs ();
- updateSnake ();
- ChangingSprites ();
- ShowTime ();
- }
- void appendToSnake() //function that instantiate clones of Body
- {
- GameObject part = Instantiate (Resources.Load<GameObject> ("Prefabs/Body")) as GameObject;
- if (!Snake.Contains (part)) {
- Snake.Add (part);
- }
- }
- string CheckCurve(int prev, int current, int next) //func to check which direction snake turned (if it does)
- {
- float prevPartX = Snake [prev].transform.position.x;
- float prevPartY = Snake [prev].transform.position.y;
- float nextPartX = Snake [next].transform.position.x;
- float nextPartY = Snake [next].transform.position.y;
- float currentPartX = Snake [current].transform.position.x;
- float currentPartY = Snake [current].transform.position.y;
- if (((prevPartX > currentPartX) && (nextPartY < currentPartY)) || ((prevPartY < currentPartY) && (nextPartX > currentPartX))) {
- return "down-to-right";
- }
- else if (((prevPartX > currentPartX) && (nextPartY > currentPartY)) || ((prevPartY > currentPartY && nextPartX > currentPartX))) {
- return "up-to-right";
- }
- else if (((prevPartX < currentPartX) && (nextPartY < currentPartY)) || ((prevPartY < currentPartY) && (nextPartX < currentPartX))) {
- return "down-to-left";
- }
- else if (((prevPartX < currentPartX) && (nextPartY > currentPartY)) || ((prevPartY > currentPartY) && (nextPartX < currentPartX))) {
- return "up-to-left";
- }
- return "same";
- }
- void initSNEK(){ //func to add proper number of snake parts
- for (int i = 0; i < sizeOfSnake; i++) {
- appendToSnake ();
- }
- for (int j = Snake.Count - 1; j > 0; j--) {
- if (j > 0) {
- Snake [j].transform.position = Snake [j - 1].transform.position;
- }
- }
- Snake [0].transform.position = transform.position;
- if (dir == "up") {
- tempPos.y++;
- transform.localEulerAngles = new Vector3 (0, 0, 90);
- } else if (dir == "left") {
- tempPos.x--;
- transform.localEulerAngles = new Vector3 (0, 0, 180);
- } else if (dir == "down") {
- tempPos.y--;
- transform.localEulerAngles = new Vector3 (0, 0, 270);
- } else if (dir == "right") {
- tempPos.x++;
- transform.localEulerAngles = new Vector3 (0, 0, 0);
- }
- transform.position = tempPos;
- }
- void Inputs() //func that interpret input to direction of snake head
- {
- if (Input.GetAxis ("Vertical") > 0) {
- dir = "up";
- }
- if (Input.GetAxis ("Vertical") < 0) {
- dir = "down";
- }
- if (Input.GetAxis ("Horizontal") < 0) {
- dir = "left";
- }
- if (Input.GetAxis ("Horizontal") > 0) {
- dir = "right";
- }
- }
- bool ItIsTime() //func to test if it is time to update snake
- {
- if (elapsedTime >= TimeToMove)
- {
- elapsedTime = 0;
- return true;
- }
- else
- return false;
- }
- void SpriteLoads() //lol, just like in name, it is loading sprites from resources (also changing sprite of last part)
- {
- TurnSprite = Resources.Load<Sprite> ("Graphics/Turn") as Sprite;
- BodySprite = Resources.Load<Sprite> ("Graphics/Body1") as Sprite;
- TailSprite = Resources.Load<Sprite> ("Graphics/Tail") as Sprite;
- Snake [Snake.Count - 1].GetComponent <SpriteRenderer> ().sprite = TailSprite;
- }
- void SetTime() //Function to calculate how much time elapsed from last update of snake
- {
- elapsedTime += Time.deltaTime;
- }
- void ShowTime() //func to "draw" time on screen
- {
- elTime.text = "Time :" + elapsedTime.ToString ();
- }
- void updateSnake() //function that move our lovely animal, also turning head
- {
- SetTime ();
- if (ItIsTime()) {
- for (int j = Snake.Count - 1; j > 0; j--) {
- if (j > 0) {
- Snake [j].transform.position = Snake [j - 1].transform.position;
- }
- }
- Snake [0].transform.position = transform.position;
- if (dir == "up") {
- tempPos.y++;
- transform.localEulerAngles = new Vector3 (0, 0, 90);
- } else if (dir == "left") {
- tempPos.x--;
- transform.localEulerAngles = new Vector3 (0, 0, 180);
- } else if (dir == "down") {
- tempPos.y--;
- transform.localEulerAngles = new Vector3 (0, 0, 270);
- } else if (dir == "right") {
- tempPos.x++;
- transform.localEulerAngles = new Vector3 (0, 0, 0);
- }
- }
- transform.position = tempPos;
- }
- void ChangingSprites(){ //messy func to set right sprites to right parts of snek :) I dunno how to improve that part.
- string curve = "";
- for (int j = Snake.Count - 1; j > 0; j--) {
- if (j > 0) {
- if (j < Snake.Count - 1) {
- curve = CheckCurve (j - 1, j, j + 1);
- if (curve == "same") {
- Snake [j].GetComponent <SpriteRenderer> ().sprite = BodySprite;
- }
- else if (curve == "up-to-left") {
- Snake [j].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [j].transform.localEulerAngles = new Vector3 (0, 0, 0);
- }
- else if (curve == "up-to-right") {
- Snake [j].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [j].transform.localEulerAngles = new Vector3 (0, 0, 270);
- }
- else if (curve == "down-to-right") {
- Snake [j].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [j].transform.localEulerAngles = new Vector3 (0, 0, 180);
- }
- else if (curve == "down-to-left") {
- Snake [j].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [j].transform.localEulerAngles = new Vector3 (0, 0, 90);
- }
- }
- }
- }
- float prevPartX = transform.position.x;
- float prevPartY = transform.position.y;
- float nextPartX = Snake [1].transform.position.x;
- float nextPartY = Snake [1].transform.position.y;
- float currentPartX = Snake [0].transform.position.x;
- float currentPartY = Snake [0].transform.position.y;
- if (((prevPartX > currentPartX) && (nextPartY < currentPartY)) || ((prevPartY < currentPartY) && (nextPartX > currentPartX))) {
- Snake [0].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [0].transform.localEulerAngles = new Vector3 (0, 0, 180);
- }
- else if (((prevPartX > currentPartX) && (nextPartY > currentPartY)) || ((prevPartY > currentPartY && nextPartX > currentPartX))) {
- Snake [0].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [0].transform.localEulerAngles = new Vector3 (0, 0, 270);
- }
- else if (((prevPartX < currentPartX) && (nextPartY < currentPartY)) || ((prevPartY < currentPartY) && (nextPartX < currentPartX))) {
- Snake [0].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [0].transform.localEulerAngles = new Vector3 (0, 0, 90);
- }
- else if (((prevPartX < currentPartX) && (nextPartY > currentPartY)) || ((prevPartY > currentPartY) && (nextPartX < currentPartX))) {
- Snake [0].GetComponent <SpriteRenderer> ().sprite = TurnSprite;
- Snake [0].transform.localEulerAngles = new Vector3 (0, 0, 0);
- }
- else Snake [0].GetComponent <SpriteRenderer> ().sprite = BodySprite;
- float tailY = Snake [Snake.Count - 1].transform.position.y;
- float tailX = Snake [Snake.Count - 1].transform.position.x;
- float nextToTailX = Snake [Snake.Count - 2].transform.position.x;
- float nextToTailY = Snake [Snake.Count - 2].transform.position.y;
- if (nextToTailY > tailY)
- Snake [Snake.Count - 1].transform.localEulerAngles = new Vector3 (0, 0, 0);
- if (nextToTailY < tailY)
- Snake [Snake.Count - 1].transform.localEulerAngles = new Vector3 (0, 0, 180);
- if (nextToTailX > tailX)
- Snake [Snake.Count - 1].transform.localEulerAngles = new Vector3 (0, 0, 270);
- if (nextToTailX < tailX)
- Snake [Snake.Count - 1].transform.localEulerAngles = new Vector3 (0, 0, 90);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement