2010-03-17 2 views
1

안녕하세요. 게임을 조금 만들었습니다.이 게임은 속도가 다른 모든 컴퓨터에서 작동합니다. 해상도가 맞다고 생각합니다. 저는 페인트 구성 요소에 모든 것을 사용했습니다. 화면 크기를 변경하면 게임 속도가 느려집니다. 또는 다른 컴퓨터에서이 게임을 실행하면 다른 해상도로 작동합니다. 이
http://rapidshare.com/files/364597095/ShooterGame.2.6.0.jar게임 속도 문제

여기에 코드

public class Shooter extends JFrame implements KeyListener, Runnable { 

JFrame frame = new JFrame(); 
String player; 
Font startFont, startSubFont, timerFont,healthFont; 
Image img; 
Image backGround; 
Graphics dbi; 
URL url1 = this.getClass().getResource("Images/p2.gif"); 
URL url2 = this.getClass().getResource("Images/p3.gif"); 
URL url3 = this.getClass().getResource("Images/p1.gif"); 
URL url4 = this.getClass().getResource("Images/p4.gif"); 
URL urlMap = this.getClass().getResource("Images/zemin.jpg"); 
Player p1 = new Player(5, 150, 10, 40, Color.GREEN, url3); 
Computer p2 = new Computer(750, 150, 10, 40, Color.BLUE, url1); 
Computer p3 = new Computer(0, 0, 10, 40, Color.BLUE, url2); 
Computer p4 = new Computer(0, 0, 10, 40, Color.BLUE, url4); 
ArrayList<Bullets> b = new ArrayList<Bullets>(); 
ArrayList<CBullets> cb = new ArrayList<CBullets>(); 
Thread sheap; 
boolean a, d, w, s; 
boolean toUp, toDown; 
boolean GameOver; 

boolean Level2; 
boolean newGame, resart, pause; 
int S, E; 
int random; 
int cbSpeed = 0; 
long timeStart, timeEnd; 
int timeElapsed; 
long GameStart, GameEnd; 
int GameScore; 
int Timer = 0; 
int timerStart, timerEnd; 

public Shooter() { 


    sheap = new Thread(this); 
    sheap.start(); 
    startFont = new Font("Tiresias PCFont Z", Font.BOLD + Font.ITALIC, 32); 
    startSubFont = new Font("Tiresias PCFont Z", Font.BOLD + Font.ITALIC, 25); 
    timerFont = new Font("Tiresias PCFont Z", Font.BOLD + Font.ITALIC, 16); 
    healthFont = new Font("Tiresias PCFont Z", Font.BOLD + Font.ITALIC, 16); 
    setTitle("Shooter 2.5.1"); 
    setBounds(350, 250, 800, 600); 

    // setResizable(false); 
    setBackground(Color.black); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    addKeyListener(this); 
    a = d = w = s = false; 
    toUp = toDown = true; 
    GameOver = true; 
    newGame = true; 
    Level2 = false; 
    S = E = 0; 

    setVisible(true); 

} 

public void paint(Graphics g) { 

    img = createImage(getWidth(), getHeight()); 
    dbi = img.getGraphics(); 
    paintComponent(dbi); 
    g.drawImage(img, 0, 0, this); 

} 

public void paintComponent(Graphics g) { 
    repaint(); 
    timeStart = System.currentTimeMillis(); 
    backGround = Toolkit.getDefaultToolkit().getImage(urlMap); 
    g.drawImage(backGround, 0, 0, null); 
    g.setColor(Color.red); 
    g.setFont(healthFont); 
    g.drawString("" + player + " Health : " + p1.health, 30, 50); 
    g.setColor(Color.red); 
    g.drawString("Computer Health : " + (p2.health + p3.health + p4.health), 600, 50); 
    g.setColor(Color.BLUE); 
    g.setFont(timerFont); 
    g.drawString("Time : " + Timer, 330, 50); 
    if (newGame) { 

     g.setColor(Color.LIGHT_GRAY); 
     g.setFont(startFont); 
     g.drawString("Well Come To Shoot Game", 200, 190); 
     g.drawString("Press ENTER To Start", 250, 220); 
     g.setColor(Color.LIGHT_GRAY); 
     g.setFont(startSubFont); 
     g.drawString("Use W,A,S,D and Space For Fire", 200, 250); 
     g.drawString("GOOD LUCK", 250, 280); 

     newGame(); 

    } 
    if (!GameOver) { 

     for (Bullets b1 : b) { 

      b1.draw(g); 
     } 
     for (CBullets b2 : cb) { 

      b2.draw(g); 

     } 
     update(); // Here MOvements for Player and For Fires 
    } 
    if (p1.health <= 0) { 
     g.setColor(p2.col); 
     g.setFont(startFont); 
     g.drawString("Computer Wins ", 200, 190); 
     g.drawString("Press Key R to Restart ", 200, 220); 
     GameOver = true; 

    } else if (p2.health <= 0 && p3.health <= 0 && p4.health <= 0) { 

     g.setColor(p1.col); 
     g.setFont(startFont); 
     g.drawString(""+player+" Wins ", 200, 190); 
     g.drawString("Press Key R to Resart ", 200, 220); 
     GameOver = true; 


     g.setColor(Color.MAGENTA); 
     g.drawString(""+player+"`s Score is " + Timer, 200, 120); 


    } 

    if (Level2) { 
     if (p3.health >= 0) { 
      p3.draw(g); 

      for (CBullets b3 : cb) { 
       b3.draw(g); 
      } 
     } else { 
      p3.x = 1000; 
     } 

     if (p4.health >= 0) { 
      p4.draw(g); 

      for (CBullets b4 : cb) { 
       b4.draw(g); 
      } 
     } else { 
      p4.x = 1000; 
     } 
    } 
    if (p1.health >= 0) { 
     p1.draw(g); 

    } 
    if (p2.health >= 0) { 
     p2.draw(g); 
    } else { 
     p2.x = 1000; 
    } 

} 

public void update() { 


    if (w && p1.y > 54) { 
     p1.moveUp(); 
    } 

    if (s && p1.y < 547) { 
     p1.moveDown(); 
    } 
    if (a && p1.x > 0) { 
     p1.moveLeft(); 
    } 

    if (d && p1.x < 200) { 
     p1.moveRight(); 
    } 
    random = 1 * (int) (Math.random() * 100); 

    if (random > 96) { 
     if (p2.health >= 0) { 
      CBullets bo = p2.getCBull(); 

      bo.xVel =-1-cbSpeed; 

      cb.add(bo); 
     } 
     if (Level2) { 
      if (p3.health >= 0) { 
       CBullets bo1 = p3.getCBull(); 
       bo1.xVel = -2-cbSpeed; 
       cb.add(bo1); 
      } 
      if (p4.health >= 0) { 
       CBullets bo2 = p4.getCBull(); 
       bo2.xVel = -4-cbSpeed; 
       cb.add(bo2); 
      } 
     } 

    } 

    if (S == 1) { 

     if (p1.health >= 0) { 
      Bullets bu = p1.getBull(); 
      bu.xVel = 5; 
      b.add(bu); 
      S += 1; 
     } 
    } 

    //Here Also Problem .. When COmputer have More fire then it gaves Array Exeption . Or Player have More Fire 
for (int i = cb.size() -1; i >= 0 ; i--) { 
     boolean bremoved = false; 
    for (int j = b.size() -1 ; j >=0 ; j--) { 
     if (b.get(j).rect.intersects(cb.get(i).rect) || 
      cb.get(i).rect.intersects(b.get(j).rect)) { 
       bremoved = true; 
      b.remove(j); 
     } 
    } 
    if(bremoved) 
     cb.remove(i); 
} 






    for (int i = 0; i < b.size(); i++) { 
     b.get(i).move(); 

     if (b.get(i).rect.intersects(p2.rect)) { 

      if (p2.health >= 0) { 
       p2.health--; 

       b.remove(i); 
      //  System.out.println("Hited P2"); 
       i--; 

       continue; 
      } 
     } 

     if (b.get(i).rect.intersects(p3.rect)) { 
      if (p3.health >= 0) { 
       p3.health--; 

       b.remove(i); 
      // System.out.println("Hited P3"); 
       i--; 

       continue; 
      } 
     } 
     if (b.get(i).rect.intersects(p4.rect)) { 
      if (p4.health >= 0) { 
       p4.health--; 

       b.remove(i); 
      // System.out.println("Hited P4"); 
       i--; 

       continue; 
      } 
     } 
     if (b.get(i).rect.x > 790) { 
      b.remove(i); 

     } 
    } 

    for (int j = 0; j < cb.size(); j++) { 
     cb.get(j).move(); 

     if (cb.get(j).rect.intersects(p1.rect) && cb.get(j).xVel < 0) { 

      p1.health--; 
      cb.remove(j); 
      j--; 
      continue; 
     } 
    } 

    timeEnd = System.currentTimeMillis(); 
    timeElapsed = (int) (timeEnd - timeStart); 
} 

public void level2() { 

    if (p2.health <= 10) { 

     Level2 = true; 
     cbSpeed = 4; 
     p3.x = 750; 
     p4.x = 750; 

     p2.speed = 10; 
     p3.speed = 20; 
     p4.speed = 30; 
    } 
} 

public void keyTyped(KeyEvent e) { 
} 

public void keyPressed(KeyEvent e) { 
    switch (e.getKeyCode()) { 
     case KeyEvent.VK_ENTER: 
      newGame = false; 

      break; 
     case KeyEvent.VK_P: 
      pause = true; 

      break; 
     case KeyEvent.VK_R: 
      resart = true; 

      break; 
     case KeyEvent.VK_A: 
      a = true; 

      break; 

     case KeyEvent.VK_D: 
      d = true; 
      break; 
     case KeyEvent.VK_W: 
      w = true; 
      break; 
     case KeyEvent.VK_S: 
      s = true; 
      break; 

     case KeyEvent.VK_SPACE: 
      S += 1; 

      break; 
    } 
} 

public void keyReleased(KeyEvent e) { 
    switch (e.getKeyCode()) { 

     case KeyEvent.VK_A: 
      a = false; 
      break; 
     case KeyEvent.VK_D: 

      d = false; 
      break; 
     case KeyEvent.VK_W: 
      w = false; 
      break; 
     case KeyEvent.VK_S: 
      s = false; 
      break; 

     case KeyEvent.VK_SPACE: 
      S = 0; 

      break; 

    } 
} 

public void newGame() { 

    p1.health = 20; 
    p2.health = 20; 
    p3.health = 20; 
    p4.health = 20; 
    p3.x = 0; 
    p4.x = 0; 
    p2.x = 750; 

    Level2 = false; 
    cbSpeed = 0; 
    p2.speed = 9; 
    b.removeAll(b); 
    cb.removeAll(cb); 

    timerStart = (int) System.currentTimeMillis(); 

    GameOver = false; 

} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
      KeyListener k = new Shooter(); 
     } 
    }); 

} 

@Override 
public void run() { 
    player = JOptionPane.showInputDialog(frame, "Enter Player Name", "New Player", JOptionPane.DEFAULT_OPTION); 

    while (true) { 

     timerEnd = (int) System.currentTimeMillis(); 

     if (resart) { 
      newGame(); 
      resart = false; 
     } 
     if (pause) { 
      Thread.currentThread().notify(); 
     } 
     try { 

      if (!GameOver) { 
Timer = timerEnd - timerStart; 
       level2(); 
       if (p1.y < p2.y && p2.y>60) { 
        p2.moveUp(); 
       } 
       if (p1.y < p3.y && p3.y>43) { 
        p3.moveUp(); 
       } 
       if (p1.y < p4.y && p4.y>43) { 
        p4.moveUp(); 

       } 
       if (p1.y > p2.y && p2.y<535) { 
        p2.moveDown(); 
       } 
       if (p1.y > p3.y && p3.y<535) { 
        p3.moveDown(); 
       } 
       if (p1.y > p4.y && p4.y<530) { 
        p4.moveDown(); 
       } 

      } 
      if (timeElapsed < 125) { 
       Thread.currentThread().sleep(125); 
      } 
     } catch (InterruptedException ex) { 
      System.out.print("FInished"); 

     } 

    } 

} 

} 그것은 당신의 과시에서 얘기하기 어렵다

답변

0

안녕하세요. 스레드에서 객체를 그리거나 움직이는 것과 같은 게임을 만들었습니다. 이제는 모든 컴퓨터 속도에서 작동합니다. 또한 크기를 변경하면 문제가 발생합니다. 그러나 문제는 J3DTimer.getValue()를 사용하는 것입니다. 이 라이브러리에서는 Java3d를 사용하지 않았습니다. 문제는 컴퓨터에이 라이브러리가 없거나 게임이 작동하지 않는 경우입니다. 어떻게이 문제를 해결할 수 있습니까? Java # d를 설정하는 모든 사람에게 말해야합니까? :)) 또한 나는 standart System.currentTimeMillis()를 사용했다; 하지만 지금은 내 게임이 매우 느리게 작동합니다 ... 어떤 생각?

+1

이 게시물을 원래 질문으로 편집하거나 새 스레드를 시작하십시오. 각 스레드의 "Answers"부분은 답변에만 쓰입니다. 답변은 작성된 시점까지 정리되지 않으므로 이와 같은 토론은 실제로 작동하지 않습니다. – Ponkadoodle

+0

@Wallacoloo 조언 해 주셔서 감사합니다. – Ercan

4

내 게임이다, 그러나 나는 바로 가서 어쨌든 답변거야 : 문제 너는 틀을 떨어 뜨리지 않는 것처럼 보인다. 단지 그들을 실속시킵니다. 기본적으로 게임 논리를 그리기 논리와 분리하고 가능한 많은 프레임을 그려야합니다. 두 개는 서로 다른 스레드에 있어야하지만 다시 스레드는 악합니다.

+0

적절한 래퍼 또는 라이브러리를 사용하는 한 스레드는 유용합니다. SwingWorker, Future 's 등등과 마찬가지로 – extraneon

+0

+1 당신은 모두가 지금까지 알아야한다고 상상할 것입니다. :) – extraneon

+0

@ Williham 당신은 내가 다른 페인트 메톤을 만들어야하고 쓰레드에서 사용해야한다는 것을 의미합니까? – Ercan

3

찾고있는 주제는 "시간 기반 동작"입니다. 나는 당신의 소스 코드를 읽지는 않았지만, 프레임 기반의 움직임처럼 보이는 당신이 묘사 한 행동은 문제이다. http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial10.php

이 포스트는 더 자세히 문제가 포함 물리학에 초점을 맞추고뿐만 아니라 오히려 간단한 게임에 적용 : http://gafferongames.com/game-physics/fix-your-timestep/

편집 여기

는 시간 기반의 이동을 커버하는 짧은 튜토리얼입니다 : 다른 응답 상태와 마찬가지로 렌더링 및 게임 논리 분리가 크게 도움이됩니다.

0

마지막 "틱"(아마도 화면 다시 그리기) 이후의 밀리 초 수를 추적하고 일정 시간이 지나면 월드 상태 (예 : 위치) 만 업데이트해야합니다. 그렇지 않으면 게임이 일관성이없는 화면 다시 그리기 속도로 실행됩니다.

당신은 25fps로 실행하고 싶다고 말하면, 게임 상태를 초당 25 번, 즉 40 번째 밀리 초마다 업데이트해야한다는 것을 의미합니다.