Programarea Jocurilor cu Ajutorul Limbajului de Porgramare Java
CUPRINS
CAPITOLUL 1 – INTRODUCERE
1.1. Jocuri
1.2. Obiective
CAPITOLUL 2 – GENERALITATI
2.1. Introducere in limbajul de programare Java
2.2. Elemente Java folosite in dezvoltarea aplicatiei
CAPITOLUL 3 – PREGATIREA MEDIULUI DE LUCRU
3.1. Instalare Eclipse
CAPITOLUL 4 – DESCRIEREA APLICATIEI
4.1. Introducere
4.2. Structura aplicatiei
4.3. Simularea jocului
CAPITOLUL 5 – CONCLUZII
BIBLIOGRAFIE
CAPITOLUL 1 – INTRODUCERE
1.1. Jocuri
Un joc video este un joc electronic care implica interactiunea unei persoane cu o interfata de utilizator pentru a genera o reactie vizuala pe un dispozitiv video. Sistemele video electronice folosite pentru jocurile video se numesc platforme, exemple fiind computerele personale sau consolele de jocuri, cum ar fi Nintendo, Sony PlayStation sau XBox.
Primele jocuri foloseau dispozitive electronice cu forme diferite de ecran. Printre primele dispozitive de acest gen se numara "Cathode ray tube", dispozitiv de amuzament, creat in anul 1947 de catre Thomas T. Goldsmith Jr. Inspirat din ecranul unui radar, era format dintr-un aparat care permitea jucatorului sa controleze puncte care simulau rachete lansate spre tinte fixe desenate pe ecran. Alte exemple de jocuri timpurii:
Computerul Nimrod de la festivalul Britanic din 1951
OXO, un joc de X si O creat de Alexander S. Douglas in 1952
Tenis for Two, un joc interactiv proiectat de William Higinbotham in 1958
Spacewar!, scris de studentii la MIT, Martin Graetz, Steve Russel si Wayne Wiitane pe un computer DEC PDP-1 in 1961
Pong, un joc din 1972 dezvoltat de Atari.
Dispozitivul de intrare folosit pentru jocuri, un controller de joc, variaza in functie de platforma. Controller-ele obisnuite includ gamepad-uri, mouse-uri, tastaturi, joystick-uri sau ecrane tacticle pe dispozitivele mobile.
Platoformele pe care se joaca jocurile video se refera la combinatii specifice de componente electronice sau hardware de computer, care, in combinatie cu un software, permite jocului video sa functioneze. In termeni obisnuiti, un joc pe PC se refera la sistemul sau platforma media care interactioneaza cu un PC conectat la un monitor. Un joc pentru consola este jucat pe un dispozitiv electronic specializat care se conecteaza la un televizor obisnuit.
Jocurile video se impart in mai multe categorii sau tipuri, unele fiind pentru jucatori ocazionali, altele jocuri educationale sau jocuri serioase, ca cele de tipul simulatoarelor. Jocurile ocazionale sunt simplu de inteles ca mecanica si reguli de joc. Acest tip de jocuri au existat dinainte ca termenul de joc video sa fie raspandit si includ jocuri ca Solitaire sau Minesweeper care de multe ori sunt preinstalate in versiuni ale sistemului de operare Microsoft Windows. Exemple de genuri ale acestei categorii sunt jocurile de tip obiect ascuns, mangementul timpului, sau tetris. In timp ce majoritatea acestor jocuri simple se gasesc pe PC-uri sau dispozitive mobile, ele pot fi de asemenea gasite pe multe sisteme ale serviciilor on-line de pe console (ex. Xbox Live, PlayStation Network sau WiiWare).
Jocurile serioase sunt in general jocuri dezvoltate nu cu simplul scop de divertisment, ci sunt create pentru a fi jucate de profesionisti, ca parte a unui anume job sau imbunatatirea anumitor competente. Una din cele mai lungi francize serioase ar fi Microsoft Flight Simulator, aparut prima data in 1982. Spre exemplu Armata Statelor Unite ale Americii foloseste simulatoare bazate pe realitate pentru antrenamentul pilotilor de avioane.
Alte categorii ale jocurilor video sunt cele strategie, unde jucatorul lupta impotriva AI-ului (inteligenta artificiala), pentru cucerirea sau apararea teritoriilor (ex. Age of Empire, Rome Total War, Starcraft), sau simulatoare auto (ex. Need for Speed, Test Drive, Dirt), jocuri de aventura-actiune (ex. Tomb Rider, Assassin's Creed, The Elder Scrolls), jocuri FPS – first person shooter – (ex. Call of Duty, Duke Nukem, Wolfenstein) sau jocurile de tip multiplayer, in care mai mult de o persoana poate juca in acelasi mediu si in acelasi timp. Jocurile de tip multiplayer permit jucatorilor sa interactioneaze cu alti indivizi in echipa, competitie sau rivalitate, oferind si avantajul comunicarii intre jucatori (ex. World of Warcraft, Eve Online).
1.2. Obiective
Exemplificarea modului de lucru cu clase si abstractizari
Realizarea unei aplicatii interactive in Java
Utilizarea limbajului de programare Java pentru a creea o aplicație stabilă și ușor de folosit.
CAPITOLUL 2 – GENERALITATI
2.1. Introducere in limbajul de programare Java
Ce este Java ?
Java este un limbaj de programare dezvoltat de JavaSoft, companie in cadrul firmei Sun Microsystems are este complet orientat pe obiecte si ofera posibilitatea reala de refolosire a codului (care este defapt promisiunea facuta la aparitia programarii orientate pe obiecte).
Acest limbaj este neutru din punct de vedere arhitectural, cu alte cuvinte Java este un limbaj independent de platforma de lucru, aceeasi aplicatie ruland, fara nicio modificare, pe sisteme diferite, cum ar fi Windows, UNIX sau Macintosh, lucru care aduce economii substantiale firmelor care dezvolta aplicatii pentru Internet.
Limbajul Java este modelat dupa C si C++, trecerea la Java facandu-se foarte usor. El elimina sursele frecvente de erori ce apar in programare prin eliminarea pointerilor, administrarea automata a memoriei si eliminarea fisurilor de memorie printr-o procedura de colectare a "gunoiului" care ruleaza in fundal.
Este cel mai sigur limbaj de programare disponibil in acest moment, asigurand mecanisme de securitate a programelor concretizate prin verificarea dinamica a codului pentru detectarea secventelor periculoase, impunerea unor reguli stricte pentru rularea programelor lansate pe calculatoarele aflate la distanta (acestea nu au acces la reteaua locala, la fisierele stocate in sistemul local si nu pot lansa in executie programe locale) etc.
De asemenea limbajul Java permite crearea unor documente Web imbunatatite cu animatie si multimedia, fiind proiectat pentru a fi folosit in medii distribuite si sisteme deschise.
Evolutia limbajului JAVA
In 1991, firma SUN, mergând pe direcția dezvoltării sistemelor deschise de lucru în rețea, a creat un proiect de lucru numit Green, care avea drept scop punerea la punct a unor procesoare care să poată rula pe diferite tipuri de aparate si punerea la punct a unui sistem care sa poata rula pe platforme diferite. Planul initial prevedea dezvoltarea proiectului în C++, dar au apărut foarte multe probleme în încercarea de dezvoltare acompilatorului de C++. Ca urmare, James Gosling, membru al grupului Green, a început să lucreze la dezvoltarea unui nou limbaj, numit Oak, care, mai târziu, avea să se numească Java. De asemenea grupul Green avea sa-si schimbe numele întâi în FirstPerson, apoi în JavaSoft.
Abia dupa ce a fost înființata compania Netscape Communications Corporation, cei de la JavaSoft s-au orientat către Internet si Web, mediul multiplatforma distribuit al retelei Internet fiind perfect pentru testarea proiectului.
In prezent licența pentru tehnologia Java a fost acordată unor firme precum IBM, Microsoft, Sillicon Graphics, Adobe si Netscape.
Java : un limbaj compilat si interpretat
In functie de modul executie a aplicatiilor, limbajele de programare se impart in doua categorii:
Interpretate – instructiunile sunt citate linie cu linie de un program interpretor si traduse in instructiuni masina. Avantajul acestei solutii este simplitatea si faptul ca fiind interpretata direct sursa programului obtinem portabilitatea. Dezavantajul evident este viteza de executie redusa. Probabil cel mai cunoscut limbaj interpretat este limbajul Basic.
Compilate – codul sursa al programelor este transformat de compilator intr-un cod ce poate fi executat direct de procesor, numit cod masina. Avantajul este executia extrem de rapida, dezavantajul fiind lipsa portabilitatii, codul compilat intr-un format de nivel scazut nu poate fi rulat decat pe platforma de lucru pe care a fost compilat.
Limbajul Java combina solutiile amintite mai sus, programele Java fiind atat interpretate cat si compilate. Asadar vom avea la dispozitie un compilator responsabil cu transformarea surselor programului in asa numitul cod de octeti, precum si un interpretor ce va executa respectivul cod de octeti.
Codul de octeti este diferit de codul masina. Codul masina este reprezentat de o succesiune de instructiuni specifice unui anumit procesor si unei anumite platforme de lucru reprezentate in format binar astfel incat sa poata fi executate fara a mai necesita nicio prelucrare.
Codurile de octeti sunt seturi de instructiuni care seamana cu codul scris in limbaj de asamblare si sunt generate de compilator independent de mediul de lucru. In timp ce codul masina este executat direct de catre procesor si poate fi folosit numai pe platforma pe care a fost creat, codul de octeti este interpretat de mediul Java si de aceea poate fi rulat pe orice platforma pe care este instalata mediul de executie Java.
Prin masina virtuala Java (JVM) vom intelege mediul de executie al aplicatiilor Java. Pentru ca un cod de octeti sa poata fi executat pe un anumit calculator, pe acesta trebuie sa fie instalata o masina virtuala Java. Acest lucru este realizat automat de catre distributia Java SDK.
Java si conceptele programarii orientate pe obiecte
Limbajul Java este urmatorul pas logic în domeniul limbajelor de programare și se bazează pe cel mai popular limbaj de programare al momentului C++. In Java se pot obține programe cu aspectul si comportarea programelor C++, dar beneficiind de avantajele oferite de un limbaj proiectat special pentru POO. Java renunță complet la programarea procedurală specifică C-ului si va obligă să folosiți conceptele solide ale POO.
Conceptele programarii orientate pe obiecte cuprind :
Obiectele:
unitatea elementara a POO
starea obiectului este dată de variabile de instanță
comportamentul obiectului este dat metode
ușor de refolosit, actualizat, întretinut
Încapsularea si transmiterea de mesaje
Clasele:
încapsuleaza obiecte
singură clasă poate fi folosită pentru instantierea mai multor obiecte
Bibliotecile (numite pachete, în Java)
Moștenirea: permite extinderea functionalitatii unor clase existente si refolosirea codului
Modificatorii de acces: controlează accesul la metodele si variabilele obiectelor.
Acestea pot fi :
Private – accesibile doar obiectelor din aceeasi clasă
Protejate- accesibile obiectelor din aceeasi clasă si din subclasele clasei respective
Prietenosase – (nivelul de accesibilitate prestabilit) accesibile tuturor claselor din pachetul curent
Publice – accesibile tuturor claselor din orice pachet
Caracteristicile de baza al limbajului Java
Folosirea în medii de rețea distribuite
Java a fost proiectat pentru un mediu complex cum este Internetul și de aceea trebuie să poată rula pe platforme eterogene distribuite. Acest lucru este posibil pentru că:
este neutru din punct de vedere arhiectural = programele pot fi rulate pe orice platformă care are instalat mediul Java;
are un grad ridicat de portabilitate = conține obictecte care pot fi folosite pe platforme eterogene și respectă standardele IEEE (Institue of Electrical and Electronics Engineers) pentru structurile de date (folosirea întregilor, a numerelor în virgulă mobilă, a șirurilor etc);
este distribuit = poate folosi atât obiecte memorate local cât și obiecte stocate pe calculatoare aflate la distantă;
este compatibil cu mediile de lucru în rețea (poate fi utilizat în rețele complexe) și acceptă direct protocoalele de rețea obișnuite cum ar fi FTP și HTTP.
Asigurarea performanței ridicate
compilatorul și sistemul de executie oferă o viteză ridicată rularii programelor;
are încorporate posibilități de execuție multifilară (rularea simultană a mai multor procese) folosind un sistem de acordare de prioritați proceselor ce trebuie executate. Printre procesele care rulează în fundal sunt cele de “colectare a gunoiului” și de gestionare a memoriei.
Refolosirea codului și fiabilitatea
Java este un limbaj dinamic, lucru asigurat prin întârzierea legării obiectelor și legarea dinamică a claselor în timpul execuției, ceea ce împiedică apariția erorilor în cazul schimbării mediului de lucru dupa compilarea programului sursă;
Fiabilitatea este asigurată prin eliminarea pointerilor, prin folosirea verificării dinamice a limitelor și prin gestionarea automată a memoriei, înlaturându-se posibilitatea fisurilor și violărilor de memorie. O altă cale de evitare a erorilor este verificarea structurilor de date atât la compilare cât și în timpul executiei.
Asigurarea securitatii
Interzice accesul la stiva sistemului, la zona liberă de memorie și la secțiunile protejate de memorie;
Verifică validitatea codului semnalând urmatoarele:
Violările de acces
Conversiile ilegale de date
Valori și parametri incorecți
Modificarea claselor sau folosirea incorectă a acestora
Depășirea stivei în partea superioară sau inferioară
Activități suspecte sau neautorizate.
2.2. Elemente Java folosite in dezvoltarea aplicatiei
2.2.1 Java Thread
2.2.2 Desenarea in Java
2.2.3 Java Swing
CAPITOLUL 3 – PREGATIREA MEDIULUI DE LUCRU
3.1. Instalare Eclipse
Eclipse este un mediu de dezvoltare integrat (IDE) care contine o zona de lucru de baza si un sistem extensibil plug-in pentru personalizarea interfetei. Fiind scris in principal in Java, Eclipse poate fi folosit pentru scriere, compilare, testare si dezvoltare de aplicatii. Poate fi deasemenea folosit si pentru programarea in alte limbaje, cum ar fi C/C++, PHP, Python, Groovy Prolog, Fortran etc.
Printre altele, instrumentele de dezvoltare Java (JDT) sunt incluse in mediile de lucru cu Java, Scala si Eclipse CDT pentru C/C++, iar Eclipse PDT pentru PHP. Codul de baza initial era din IMB VisualAge. Kitul dezvoltare Eclipse, care include JDT este dedicat programatorilor in Java. Utilizatorii ii pot extinde abilitatile prin instalarea de plug-in-uri scrise pentru platforma Eclipse.
Lansat sub licenta Eclipse Public License, Eclipse SDK este un software gratuit si open source, cu toate ca este incompatibil cu GNU General Public License, este unul din primele IDE-uri functionale in GNU Classpath si ruleaza fara probleme in IcedTea.
Aplicatia Tetris este realizata in mediul de dezvoltare Eclipse IDE 4.4.2 (Luna) si poate fi descarcat gratuit de pe www.eclipse.org. Pentru a putea dezvolta aplicatii in Java este necesara si instalarea JDK, aceasta platforma putand fi descarcata de pe www.oracle.com
Eclipse IDE este instalat si personalizat dupa preferinte (partitie instalare, plug-ins, update-uri). Dupa ce a fost instalat, la rulararea mediului Eclipse IDE va aparea un splash screen ca cel de mai jos:
Dupa incarcarea modulelor, va incepe executia propriu-zisa a mediului de dezvoltare.
Dupa acesti pasi, utilizatorii pot incepe noi aplicatii, sa deschida alte proiecte scrise in Java, sa invete din demo-urile si tutorialele puse la dispozitie de Eclipse pentru o intelegere mai buna a dezvoltarii si lucrului in Java.
Prin acest mediu pot fi create foarte usor fisere executabile (in formatul .jar), cu ajutorul carora aplicatiile pot rula independent, cu conditia ca pe computerul unde vor fi rulate sa fie instalat Java Virtual Machine.
Pentru executia aplicatiilor mai complicate se pot adauga biblioteci (.lib) sau jar-uri (JMathTools, metadataextractor etc.) in functie de complexitatea aplicatiei.
CAPITOLUL 4 – DESCRIEREA APLICATIEI
4.1. Introducere
Tetris, jocul de puzzle apreciat de milioane de oameni, a implinit 31 de ani, insa in ciuda varstei nu-i scade popularitatea, fiind extrem de apreciat pe smartphone-uri si in magazinele online. Jocul a fost inventat de matematicianul rus Alexei Pajitnov de la Academia de Stiinte din Moscova in plin Razboi Rece. Henk Rogers, sef al companiei Blue Planet Software se afla in 1989 la targul de IT CES in SUA si cauta jocuri pe care sa le propuna pietei japoneze. A fost fascinat de Tetris, micul joc de puzzle la care piesele cazatoare trebuiau aranjate intr-un anume fel.
Rogers a obtinut licenta de la rusi, iar japonezii de la Nintendo l-au considerat ideal pentru consola Game Boy. Ascensiunea a fost fulminanta, de la mici jocuri electronice, pana la PC-uri, telefoane mobile si smartphone-uri, Tetris a devenit jocul preferat pentru milioane de oameni.
Creatorul Alexei Pajitnov nu isi inchipuia niciodata ca Tetris va ajunge atat de iubit dar isi explica succesul prin faptul ca nu e un joc de violenta, ci unul constructiv, in care haosul pieselor in cadere rapida trebuie transformat in ceva cu sens.
Chiar si dupa zeci de ani de la momentul lansarii, Tetris cucereste noi teritorii, este prezent pe telefoanele inteligente, pe cele cu touch-screen si este o vedeta a magazinelor online.
4.2. Structura aplicatiei
Aplicatia tetris are in componenta un singur pachet care contine cinci clase Java:
CadruJoc
Ceas
PanouLateral
Piese
Tetris
Structura claselor:
CadruJoc
Clasa CadruJoc este responsabila cu afisarea spatiului de joc si manipularea pieselor. Aceasta include setarea marimilor tabelei de joc, numarul de coloane, afisarea valorilor minime si maxime a culorilor componente pentru lumina si umbra pieselor de joc, numarul de pixeli pe care il ocupa o piesa, setarile textului etc.
Desenarea pieselor, a pieselor fantoma, precum și a piesei care se genereaza pe panoul lateral se realizeaza cu ajutorul API-ului Java2D prin intermediul metodei paint() care este apelată ori de cate ori se modifică ceva:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Desenarea pieselor pe tabla:
for(int x = 0; x < COL_COUNT; x++) {
for(int y = HIDDEN_ROW_COUNT; y < ROW_COUNT; y++) {
Piese tile = getTile(x, y);
if(tile != null) {
drawTile(tile, x * TILE_SIZE, (y – HIDDEN_ROW_COUNT) * TILE_SIZE, g);
}
}
}
Desenarea "fantomei" – piesa semitransparenta care indica locul unde va ateriza piesa in cadere. Exista mai multe moduri de implementare dar am ales-o pe cea mai simpla:
luam pozitia curenta si ne mutam in jos pana lovim un rand care ar putea cauza o coliziune:
Color base = type.getBaseColor();
base = new Color(base.getRed(), base.getGreen(), base.getBlue(), 20);
for(int lowest = pieceRow; lowest < ROW_COUNT; lowest++) {
daca nu se detecteaza nicio coliziune se incearca randul urmator si se deseneaza piesa fantoma un rand mai sus decat cel cu care a avut loc coliziunea:
if(isValidAndEmpty(type, pieceCol, lowest, rotation)) {
continue;
}
lowest–;
iar apoi se deseneaza piesa fantoma:
for(int col = 0; col < type.getDimension(); col++) {
for(int row = 0; row < type.getDimension(); row++) {
if(lowest + row >= 2 && type.isTile(col, row, rotation)) {
drawTile(base, base.brighter(), base.darker(), (pieceCol + col) * TILE_SIZE, (lowest + row – HIDDEN_ROW_COUNT) * TILE_SIZE, g);
}
}
}
Tabela de joc a fost impartita in randuri si coloane pentru a ajuta jucatorul sa plaseze piesele mai exact, in locul corespunzator:
g.setColor(Color.DARK_GRAY);
for(int x = 0; x < COL_COUNT; x++) {
for(int y = 0; y < VISIBLE_ROW_COUNT; y++) {
g.drawLine(0, y * TILE_SIZE, COL_COUNT * TILE_SIZE, y * TILE_SIZE);
g.drawLine(x * TILE_SIZE, 0, x * TILE_SIZE, VISIBLE_ROW_COUNT * TILE_SIZE);
}
}
Ceas
Clasa Ceas este responsabila pentru urmarirea numarului de cicli care au trecut peste o anumita perioada de timp.
Numarul de milisecunde care acopera un ciclu:
private float millisPerCycle;
Ultima data cand ceasul a fost updatat (folosit pentru calcularea timpului delta):
private long lastUpdate;
Numarul de cicli care au trecut si nu au fost inca numarati:
private int elapsedCycles;
Cantitatea de timp in exces fata de urmatorul ciclu scurs:
private float excessCycles;
Daca ceasul este oprit sau nu:
private boolean isPaused;
Crearea unui nou ceas si setarea ciclilor pe secunda aferenti:
(cyclesPerSecond – numarul ciclilor care se trec intr-o secunda)
public Ceas(float cyclesPerSecond) {
setCyclesPerSecond(cyclesPerSecond);
reset();
}
Setarea numarului de cicli care se scurg pe secunda:
public void setCyclesPerSecond(float cyclesPerSecond) {
this.millisPerCycle = (1.0f / cyclesPerSecond) * 1000;
}
Resetarea starii ceasului. Ciclii in exces si cei scursi vor fi resetati la 0, ultimul update de timp va fi resetat la timpul actual iar declaratia de pauza va fi setata ca false:
public void reset() {
this.elapsedCycles = 0;
this.excessCycles = 0.0f;
this.lastUpdate = getCurrentTime();
this.isPaused = false;
}
Updatarea starii ceasului. Numarul ciclilor scursi, la fel ca si cei in exces vor fi calculati doar daca ceasul nu este oprit.
– obtinerea si calcularea timpului delta;
– updatarea numarului de batai ale ceasului care s-au scurs sau sunt in exces daca nu este pus pe pauza:
– setarea ultimului update de timp pentru urmatorul update de ciclu:
public void update() {
long currUpdate = getCurrentTime();
float delta = (float)(currUpdate – lastUpdate) + excessCycles;
if(!isPaused) {
this.elapsedCycles += (int)Math.floor(delta / millisPerCycle);
this.excessCycles = delta % millisPerCycle;
}
this.lastUpdate = currUpdate;
}
Oprirea sau pornirea ceasului. Cand este pe pauza, un ceas nu va updata cicli trecuti sau pe cei in exces, cu toate ca metoda update ar trebui totusi sa fie accesata la fiecare cadru pentru a preveni problemele ("paused" – daca se porneste ceasul sau nu):
public void setPaused(boolean paused) {
this.isPaused = paused;
}
Verificarea daca ceasul este oprit:
public boolean isPaused() {
return isPaused;
}
Verificarea daca a trecut un ciclu pentru acest ceas. Daca da, numarul ciclilor trecuti vor scadea cu unu:
public boolean hasElapsedCycle() {
if(elapsedCycles > 0) {
this.elapsedCycles–;
return true;
}
return false;
}
Aceeasi verificare, dar spre deosebire de hasElapsedCycle, numarul ciclilor nu va scadea daca numarul ciclilor trecuti este mai mare de zero:
public boolean peekElapsedCycle() {
return (elapsedCycles > 0);
}
Calcularea timpului curent in milisecunde folosind ceasul computerului. Este mult mai fiabil decat System.getCurrentTimeMillis() si mai rapid decat System.nanoTime():
private static final long getCurrentTime() {
return (System.nanoTime() / 1000000L);
}
PanouLateral
Clasa PanouLateral este responsabila cu afisarea informatiilor de scor, nivel, piesa care urmeaza si tastele pentru controlul jocului.
Ca si in cadrul clasei "CadruJoc", desenarea piesei care urmeaza sa coboare si modificarile afisate pentru scor si nivel, se realizeaza cu ajutorul aceluiasi API Java2D prin intermediul metodei paint():
public void paintComponent(Graphics g) {
super.paintComponent(g);
Se deseneaza previzualizarea piesei care urmeaza sa apara, codul fiind relativ asemanator cu cel al desenarii pentru clasa "CadruJoc", doar ca este mult mai mic si mai centralizat, decat constrans pe un cadru.
Piese type = tetris.getNextPieceType();
if(!tetris.isGameOver() && type != null)
Piese
Dupa cum ii spune si numele, clasa Piese, descrie proprietatile diferitelor piese folosite in joc. In aceasta clasa se regasesc codurile pentru dimnesiunile si culoarea fiecarei piese, nuantele culorilor pentru umbra lor, coloana si randul pe care apar, cate randuri si cate coloane ocupa fiecare piesa, incluzand toate combinatiile rezultate din rotirea lor.
Culorile si formele pieselor:
Z T L
J O I
S
Tetris
In principal clasa Tetris se ocupa de manipularea mecanicii jocului, respectiv citirea comenzilor date de utilizator.
Aceasta clasa este responsabila de pornirea si oprirea jocului, numarul de milisecunde pe cadru, numarul pieselor existente, instanta pentru clasele "CadruJoc" si "PanouLateral", scor, nivel, generatorul de numere aleatorii responsabil cu alegerea pieselor ce urmeaza sa cada etc.
Tot in clasa "Tetris" a fost adaugat un "KeyListener", care proceseaza apasarea butoanelor tastaturii:
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode())
Caderea (tasta "S") – cand este apasata se verifica daca jocul nu este pus pe pauza si ca nu avem nicio intarziere de cadere, apoi setam temporizatorul logic sa functioneze la viteza de 25 de cicli pe secunda:
case KeyEvent.VK_S:
if(!isPaused && dropCooldown == 0) {
logicTimer.setCyclesPerSecond(25.0f);
}
break;
Miscarea la stanga (tasta "A") – cand este apasata se verifica daca jocul nu este pus pe pauza si ca pozitia din stanga a pozitiei curente este valida (spre exemplu in cazul in care piesa este la marginea stanga a tabelei de joc, piesa nu va putea fi mutata mai mult, pentru ca in acest caz s-ar depasi limita cadrului). In acest caz, mutam piesa cu o coloana:
case KeyEvent.VK_A:
if(!isPaused && board.isValidAndEmpty(currentType, currentCol – 1, currentRow, currentRotation)) {
currentCol–;
}
break;
Miscarea la dreapta (tasta "D") – aceleasi proprietati ca si la miscarea la stanga, doar ca mutarea se face spre dreapta:
case KeyEvent.VK_D:
if(!isPaused && board.isValidAndEmpty(currentType, currentCol + 1, currentRow, currentRotation)) {
currentCol++;} break;
Rotirea la stanga (tasta "Q") – cand este apasata se verifica daca jocul nu este pus pe pauza si se incearca rotirea piesei spre stanga. Din cauza marimii si complexitatii codului de rotatie, la fel ca si asemanarea cu rotatia la dreapta, codul pentru rotirea piesei este manipulat cu alta metoda:
case KeyEvent.VK_Q:
if(!isPaused) {
rotatePiece((currentRotation == 0) ? 3 : currentRotation – 1);
}
break;
Rotirea la dreapta (tasta "E") – aceleasi proprietati ca si rotirea la stanga, doar ca rotatia se va face spre dreapta:
case KeyEvent.VK_E:
if(!isPaused) {
rotatePiece((currentRotation == 3) ? 0 : currentRotation + 1);
}
break;
Oprirea jocului (tasta "P") – cand este apasata se verifica daca jocul este in desfasurare. Daca da, atunci se activeaza variabila de pauza si se updateaza temporizatorul logic pentru aceasta schimbare, altfel jocul va executa un numar imens de update-uri daca pauza este mai mare de un minut si in principiu va termina jocul instantaneu atunci cand revenim.
case KeyEvent.VK_P:
if(!isGameOver && !isNewGame) {
isPaused = !isPaused;
logicTimer.setPaused(isPaused);
}
break;
Pornirea jocului (tasta "ENTER") – cand este apasata se verifica daca jocul este nou inceput sau tocmai s-a terminat. In acest caz, jocul se reseteaza:
case KeyEvent.VK_ENTER:
if(isGameOver || isNewGame) {
resetGame();
}
break;
4.3. Simularea jocului
Fereastra care apare la pornirea jocului:
In timpul jocului:
Pentru a opri temporar jocul, tot ce trebuie facut este apasarea tastei P, pentru pauza. Pentru reluarea jocului se apasa inca odata tasta P si jocul va continua exact din momentul in care a fost pusa pauza.
Jocul se va termina in momentul in care piesa care urmeaza sa cada va atinge piesa de pe ultimul rand de sus.
Pentru inceperea unui nou joc se va apasa din nou tasta ENTER iar scorul si nivelul se vor reseta.
CAPITOLUL 5 – CONCLUZII
BIBLIOGRAFIE
Orlando, Greg (2007). "Console Portraits: A 40-Year Pictorial History of Gaming"
Jason Whittaker (2004). The cyberspace handbook.
Vargas, Jose Antonio (2006). "In Game World, Cheaters Proudly Prosper"
"Eclipse Foundation". Eclipse.org. 2004
Cristian Frasinaru – Curs practic de Java
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Programarea Jocurilor cu Ajutorul Limbajului de Porgramare Java (ID: 150173)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
