Senin, 17 Juni 2013

Pengantar Teknologi Game

Initial State
             Game ini terdiri dari dua buah garis sebagai bet dalam permainan bola pingpong  dan user sebagai player satu akan melawan computer.permainan ini bisa dimainkan oleh dua orang dengan cara salah satu pemain yang bertindak sebagai computer mengganti player menjadi manusia.pemain mencetak angka jika bola yang di lepas oleh musuh tidak dapat di tangkap oleh bet pingpong maka akan score akan bertambah 1 atau sebaliknya

                                                              Tampilan awal game


 ATURAN PERMAINAN

1.             Pemain melepaskan bola dengan cara menekan L kearah daerah lawan
2.             Jika bola tidak tertangkap oleh bet lawan maka score akan bertambah satu poin



KEY BINDINGS

 w               :    player 1 atas
  s               :    player 1 bawah
  l                :    player 1 lepas bola
 
  up             :    player 2 atas
  down       :    player 2 bawah
  left           :   player 2 lepas bola
 
  p               :    ganti player 2 : computer / human
  r                :    reset game
  +               :    computer level ++
  -                :    computer level --




LISTING PROGRAM


PFont scoreFont;
Ground ground;
Player player1;
Player player2;
Ball ball;
Message message;
boolean start = true;

void setup() {
  size(600, 450);
  ground = new Ground();
  player1 = new Player(1, 20, height/2, false);
  player2 = new Player(2, width - 20, height/2, true);
  ball = new Ball(0,0);
  ball.setPos(player1.posX + player1.size/9 + ball.size/2, player1.posY);
  message = new Message();
  scoreFont = createFont("Andalus", 40);
  textFont(scoreFont);
  ellipseMode(CENTER);
  frameRate(150);
}

void draw() {
  background(255,0,0);
  stroke(255); fill(255);
  ground.draw();
  player1.draw();
  player2.draw();
  ball.draw();
  message.draw();
  if (start) {
    player1.movY = 4;
    ball.stickRelease(1);
    start = false;
  }
}

void keyPressed() {
  if (key == 'r' || key == 'R') {
    resetGame();
  }
  if (key == 'p' || key == 'P') {
    player2.switchComputerDriven();
  }
  if (key == 'w' || key == 'W') {
    player1.up();
  }
  if (key == 's' || key == 'S') {
    player1.down();
  } 
  if (key == 'l' || key == 'L') {
    player1.releaseBall();
  }
  if (key == '+') {
    player2.setDifficulty(1);
    message.set("computer level " + (int)player2.getDifficulty());
  }
  if (key == '-') {
    player2.setDifficulty(-1);
    message.set("computer level " + (int)player2.getDifficulty());
  }
  if (key == CODED) {
    if (keyCode == UP) {
      player2.up();
    }
    if (keyCode == DOWN) {
      player2.down();
    }
    if (keyCode == LEFT) {
      player2.releaseBall();
    }
  }
}

void resetGame() {
  player1.setPos(20, height/2);
  player2.setPos(width - 20, height/2);
  player1.resetScore();
  player2.resetScore();
  ball.setSticky(1);
  player1.movY = 4;
  ball.stickRelease(1);
  message.set("new game");
}

class Ground {
 
  int scoreP1, scoreP2;
 
  Ground() {
    scoreP1 = 0;
    scoreP2 = 0;
  }
 
  void draw() {
    line(width/2, 0, width/2, height);
    text(player1.getScore(), width/3, 50);
    text(player2.getScore(), width/1.6, 50);
  }
}

class Message {
  String say;
  int time;
  int maxTime = 0;
 
  Message() {
    say = "";
    time = 0;
  }
 
  void set(String _say) {
    time = maxTime;
    say = _say;
  }
 
  void draw() {
    if ((say != "") && (time > 0)) {
      float a = 255 - ((maxTime - time) * 5);
      stroke(255,255,255,a); fill(255,255,255,a);
      text(say, width/2 - (say.length() * 18)/2, height/2);
      time--;
    } else {
      say = "";
    }
    stroke(255,255,255,255); fill(255,255,255,255);
  }
}

class Player {
  float posX, posY, movX, movY;
  int id, size, thickness, score;
  boolean computerDriven;
  int difficulty, pause, pauseTime, movPause, dir;
 
  Player(int _id, float _posX, float _posY, boolean _computerDriven) {
    id = _id;
    posX = _posX;
    posY = _posY;
    computerDriven = _computerDriven;
    size = 80;
    thickness = 5;
    score = 0;
    difficulty = 2;
    pause = 75;
    pauseTime = pause;
    movPause = 0;
    dir = 0;
  }
 
  void draw() {
    update();
    rect(posX - (size/16), posY - (size/2), thickness, size);
  }
 
  void up() {
    if (!computerDriven) movY = constrain (movY -= 12, -10, 10);
  }
 
  void down() {
    if (!computerDriven) movY = constrain (movY += 12, -10, 10);
  }
 
  void update() {
    if (computerDriven) {
      if (ball.sticky && (ball.stickOn == 2)) pausePlayer();
      else movY = constrain(ball.getPosY() - posY, -2 - difficulty, 2 + difficulty);
    }
    posY = constrain (posY+movY, 0, height);
    movY *= .7;
  }
 
  float getMovY() {
    return movY;
  }
 
  void pausePlayer() {
    if (computerDriven) {
      if (pause == pauseTime) {
        movPause = 5;
        dir = 1;
      }
      movY = constrain (movPause * dir, -5, 5);
      if ((posY < (size/2)) && (dir < 0)) dir = 1;
      else if ((posY > (height - (size/2))) && (dir > 0)) {
        println(height - (size/2));
        dir = -1;
      }
      pause--;
      if (pause < 1) {
        pause = 75;
        releaseBall();
      }
    }
  }
 
  void releaseBall() {
    ball.stickRelease(id);
  }
 
  void scorePlus() {
    score ++;
  }
 
  int getScore() {
    return score;
  }
 
  void resetScore() {
    score = 0;
  }
 
  void setDifficulty(int _d) {
    difficulty = constrain (difficulty += _d, 0, 10);
  }
 
  float getDifficulty() {
    return difficulty; 
  }
  void switchComputerDriven() {
    if (computerDriven) computerDriven = false;
    else computerDriven = true;
  }
 
  void setPos(int _posX, int _posY) {
    posX = _posX;
    posY = _posY;
  }
 
  boolean testRacketCollision(float x, float y, float s) {
    if ((y - (s / 2) > posY - (size / 2)) && (y + (s / 2) < posY + (size / 2))) {
      return true;
    } else return false;
  }
class Ball {

  float posX, posY, movX, movY, speedX, speedY, size;
  int stickOn;
  boolean sticky;
 
 
  Ball(float _posX, float _posY) {
    posX = _posX;
    posY = _posY;
    movX = 0;
    movY = 0;
    speedX = 0;
    speedY = 0;
    sticky = true;
    stickOn = 1;
    size = 6;
  }
  
  void setPos(float _posX, float _posY) {
    posX = _posX;
    posY = _posY;
  }
 
  void update() {
    if (sticky) {
      if (stickOn == 1) {
        posX = player1.posX + player1.thickness/2 + ball.size/2;
        posY = player1.posY;
      } else if (stickOn == 2) { 
        posX = player2.posX - player2.thickness/2 - ball.size/2;
        posY = player2.posY;     
      } 
    } else {
      posX = posX + movX;
      posY = posY + movY;
    }
   
   
    if (posY < size) movY = -movY;        // top bounce
    if (posY > height-size) movY = -movY; // bottom bounce
   
    if (posX < 0) { // out left side
      player2.scorePlus();
      sticky = true;
      stickOn = 1;
    }
   
    else if (posX > width) { // out right side
      player1.scorePlus();
      sticky = true;
      stickOn = 2;
    }
   
    else if (posX < (player1.posX + (player1.thickness / 2) + (size / 2))) {
      if (player1.testRacketCollision(posX, posY, size)) {
        movX = -movX;
        movY += player1.getMovY() / 5;
      }
    }

    else if (posX > player2.posX) { 
      if (player2.testRacketCollision(posX, posY, size)) {
        movX = -movX;
        movY += player2.getMovY() / 5;
      }
    }
  }
 
  void stickRelease(int idplayer) {
    sticky = false;
    if ((stickOn == 1) && (idplayer == 1)) {
      movY = player1.getMovY();
      movX = 5;
      stickOn = 0;
    } else if ((stickOn == 2) && (idplayer == 2)) {
      movY = player2.getMovY();
      movX = -5;
      stickOn = 0;
    }   
  }
 
  void setSticky(int _playerId) {
    sticky = true;
    stickOn = _playerId; 
  }
 
  float getPosY() {
    return posY;
  }
 
  void draw() {
    update();
    ellipse(posX, posY, size, size);
  }
}


LOGIKA PROGRAM

Untuk membuat game pingpong diperlukan beberapa variable seperti
1.      posX dan posy yang digunakan untuk menetukan posisi bola
2.                    movX dan movY yang digunakan untuk menggerakan bola pingpong yang            berhubungan dengan posX dab posy untuk mengerakan bola
3.                    speedX dan speedy yangdigunakan untuk mengukur kecepatan bola dengan menggunaka posisi posX dan posy dan  juga untuk mengaturkecepatannya berhubungan dengan  frame rate
4.                    sticky dan stickyon yang berguna untuk menempelkan bola jika bola sudah tida tertangkap bet pingpong lawan dan akan menepel di bet yang akan serve pertamakali
lalu juga ada beberapa method yang di buat
1.                    Void Setup yaitu method yang digunakan untuk pengaturan pertama kali permainan dijalankan seperti besar window yang digunakan  posisi bet pingpong pertama kali,letakbola,text score
2.                    Void Draw yaitu method  yang berfungsi mengatur background dalam permainan background disini mencakup posisi bola pertama kali warna background
3.                    Void keyPressed yaitu method yang mengatur configurator pemain void ini berfungsi sebagai pengatur permainan dengan  menggunkan keyboard jika keyboard di tekan sesuai key yang dimasukan maka akan menggerakan bet pinpong
4.                    Void ResetGame yaitu method yang mengatur untuk memulai permainan dari awal lagi jika user ingin memulai permainan baru hany denga menekan key R
5.                    Void set yaitu method yang berguna untuk mencetak atau  menampilkan score permainan
6.                    Void Update yaitu method yang berfungsi untuk mengupdate permainan jika bola tidak bisa ditangkap oleh lawan maka bola akan berada di user yang tidak bisa menangkap bola tadi bukan berada di pemain yang mencetak angka


Computer Driven        

                   Didalam game ini jika kita memainkan  melawan computer terdapat semacam ai yang digunakan dipermainan ini digunakan Boolean ComputerDriven. computerDriven ini berkerja dengan membaca posisi bet pingpong lawan dan  membaca  posisi bola jika bola naik maka computer driven akan mengarahkan bet pingpong nya sendiri untuk naik dan jika turun akan diarah kan turun oleh computerDriven tersebut computerDriven dapat men-serve bola juga jika player dapat mengarahkan bola untuk tidak dikena oleh bet pingpong computer selain itu computerDriven ini juga dapat diatur  tingkat kesulitannya dengan menekan key + maka tingkatnya akan semakin sulit dan bet pingpong yang dikendalikan computer dapat bergerak dengan cepat jika kita kurangi dengan menakan tombol – maka pergerakan bet akan lama dan memudahkan lawan untuk mengalahkan komputer

   

                                       Computer dapat serve dengan adanya ComputerDriven