Remote Ponge Sic
-
Upload
alex-bucur -
Category
Documents
-
view
11 -
download
3
description
Transcript of Remote Ponge Sic
Proiect Elemente Speciale ale Infrastructurilor de Calcul
Remote Pong
Ene MariusSoare Elena Ramona Georgiana
Bucur Alexandru
1
Remote Pong
Remote Pong este un simplu joc prin care doua sau mai multe persoane pot juca clasicul pong in retea si au posibilitatea de a controla “paleta” prin intermediul telefonului conectat la wifi-ul local.
Jocul a fost realizat in engine-ul Unity fara nici un alt script/plugin unity extern si
pentru multiplayer a fost folosita functia de multiplayer integrata in Unity.
Masterserver-ul a fost compilat local din cauza unor probleme de conexiune cu
masterserver-ul pentru teste oferit de cei de la Unity.
Pentru a porni jocul, unul dintre jucatori trebuie sa ruleze script-urile “start
masterserver.bat” si “start facilitator.bat”, dupa care sa apese pe butonul “Start
Server” din meniu. Celalalt jucator trebuie sa ruleze aplicatia separata de android si
sa se conecteze la un server din lista. Odata conectat, pe telefon vor aparea doar
doua butoane “Sus/Jos” cu care poate controla “paleta” pe ecranul principal.
Jocul este compus din 4 imagini jpg/png, 3 materiale (culori diferite palete si un
material special Unity ce are functia de “salt” fara “frictiune” cu alte elemente din joc
pentru minge), 2 prefab-uri pentru jucatori ( “template” ce poate fi folosit pentru a
crea noi instante in scena).
Limbajul de programare folosit este C#, numar total de scripturi scrise fiind 6:
● Controale.cs
● Lan.cs
● Minge.cs
● ScorDreapta.cs
● ScorStanga.cs
● CameraShake.cs
2
Scriptul “Controale.cs” determina miscarea si viteza “paletelor” sus/jos atat de la
tastatura, cat si de pe smartphone prin intermediul functiei “miscare()”. Variabila de
tip float “speed” determina viteza miscarii “paletelor”.
public void miscare()
{
if(Input.GetKey (KeyCode.W) || sus == 1)
{
paleta.velocity = new Vector2(0, speed);
}
else if(Input.GetKey (KeyCode.S) || sus == -1)
{
paleta.velocity = new Vector2(0, -speed);
}
else if(sus == 0)
{
paleta.velocity = new Vector2(0, 0);
}
}
Pentru a controla “paleta” de pe telefon au fost generate doua butoane de tip
“GUI” ce modifica o variabila de tip int, iar valoarea pe care o ia (1/0/-1) determina
miscarea “paletei in functia “miscare()”.
S-a folosit conditia “#if UNITY_ANDROID” pentru a evita aparitia acestor butoane
pe calculator. Tipul de buton “RepeatButton” face butonul sa ramana activ atata timp
cat este tinut apasat.
#if UNITY_ANDROID
void OnGUI()
3
{
if(GetComponent<NetworkView>().isMine)
{
if (GUI.RepeatButton(new Rect(150, 150, 200, 150), "Up"))
{
sus = 1;
}
else if (GUI.RepeatButton(new Rect(150, 300, 200, 150),
"Down"))
{
sus = -1;
}
else
sus = 0;
}
}
#endif
Scriptul “Minge.cs” determina punctajul jucatorilor in functie de coliziunea mingii
cu peretele stang/drept. Tot aici este se afla si butonul de resetare al scorului, pozitei
mingii, efectul de “tremurat” al fundalului la contactul cu “paleta” si plecarea mingii
atunci cand se incepe jocul.
“Tremuratul” fundalului este determinat de booleana “atinge” ce cheama functia
“shake” din scriptul CameraScript.cs atunci cand este adevarata. Booleana este
adevarata doar pentru 0.1 secunde dupa contactul cu “paleta” pentru a nu deranja
jucatorul la ochi.
void OnCollisionEnter2D (Collision2D coll)
{
if (coll.collider.CompareTag("leftWall"))
ScorDreapta.AdaugaPuncte(puncteDeAdaugat);
4
if (coll.collider.CompareTag("rightWall"))
ScorStanga.AdaugaPuncte(puncteDeAdaugat);
if (coll.collider.CompareTag("Player"))
{
var velY = GetComponent<Rigidbody2D>().velocity;
velY.y =(velY.y/2.0f)+(coll.collider.GetComponent<Rigidbody2D>().velocity.y/3.0f);
GetComponent<Rigidbody2D>().velocity = velY;
StartCoroutine("tremura");
}
}
Functia pleaca() determina directia mingii la plecare folosind o variabila aleatorie
si plecarea acesteia la pornirea jocului.
void pleaca()
{
float rand = Random.Range (0.0f,0.2f);
if (rand < 0.1f)
{
GetComponent<Rigidbody2D>().AddForce(new
Vector2(20.0f,15.0f));
}
else
{
GetComponent<Rigidbody2D>().AddForce(new Vector2(-20.0f,-
15.0f));
}
}
“ScorStanga.cs” si “ScorDreapta.cs” contin cate o variabila de tip int pentru a
determina numarul scorului si functiile de adaugare puncte si resetare ce sunt
chemate in scriptul Minge.cs.
public static void AdaugaPuncte(int puncteDeAdaugat)
{
5
scorStanga += puncteDeAdaugat;
}
public static void reset()
{
scorStanga = 0;
}
“CameraScript.cs” are doar functia de a misca fundalul scenei printr-o simpla
transformare de pozitie intr-un mod aleatoriu folosind functia Random.Range.
Contine si o functie reset ce reseteaza pozitia fundalului la 0 in cazul in care este
nevoie de ea mai tarziu.
public void shake()
{
transform.position = new Vector3(transform.position.x +
Random.Range(-0.1f,0.1f), transform.position.y + Random.Range(-0.1f,0.1f),
transform.position.z);
}
public void reset()
{
transform.position = Vector3.zero;
}
Scriptul “Lan.cs” se ocupa cu functiile de pornire/afisare a serverelor,
“instantierea” jucatorilor la conectare si stergerea lor la deconectare.
void OnServerInitialized()
{
Network.Instantiate(Player1, new Vector3(-5f, 0f, 0f),
Quaternion.identity, 0);
6
Network.Instantiate(Ball, new Vector3(0f, 0f, 0f), Quaternion.identity,
0);
}
void OnConnectedToServer()
{
Network.Instantiate(Controller, new Vector3(5f, 0f, 0f),
Quaternion.identity, 0);
}
void OnPlayerDisconnected(NetworkPlayer Player)
{
Network.RemoveRPCs(Player);
Network.DestroyPlayerObjects(Player);
}
7