2014-12-16 4 views
1

전 세계의 기사를 이동시키고 다른 기사와 싸울 수있는 게임을 만들고 있습니다.JButton 자식이 텍스트를 업데이트하지 않습니다

게임 시작 I 클래스 홈페이지있어

:

public class Main { 

    public static void main(String[] args) {  
    new Game(); 
    } 
} 

JFrame의 생성하는 클래스 게임 : (! 당신이 그것을 짐작)

import java.awt.GridLayout; 

import javax.swing.JFrame; 

public class Game { 

    public Game() { 
     JFrame frame = new JFrame(); 
     frame.setTitle("Knights Tournament"); 
     frame.add(new Board()); 
     frame.setSize(700, 700); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

그리고 클래스 보드를 생성 게임 보드 :

public class Board extends JPanel { 

    Tile[][] grid = new Tile[15][15]; 

    public Board(){ 

     // Create the grid 
     CreateGrid(); 

     // Add the player 
     grid[0][0] = new Player(0, 0); 
    } 

    // Method that creates a grid of tiles 
    private void CreateGrid() { 
     setLayout(new GridLayout (15, 15)); 
     for(int i = 0; i < 15; i++){ 
      for(int j = 0; j < 15; j++){ 
       grid[i][j] = new Tile(i, j); 
       add(grid[i][j]); 
      } 
     } 
    } 
} 

그리드 초기 값은 15x15 타일로 구성됩니다.

public class Tile extends JButton implements ActionListener { 

    public int xCo; 
    public int yCo; 

    public Tile(int x, int y) { 
     setXCo(x); 
     setYCo(y); 
    } 

    public void setXCo(int x) { 
     this.xCo = x; 
    } 

    public void setYCo(int y) { 
     this.yCo = y; 
    } 

    public int getXCo() { 
     return xCo; 
    } 

    public int getYCo() { 
     return yCo; 
    } 
} 

내가 직면 해요 문제는 다음이다 : 나는 그리드를 교체하고 싶습니다 [0] [0] 타일을 확장 다른 클래스의 플레이어. 타일과 선수 사이의 차이가하는 JButton가 'P'를 말하는 텍스트를 얻을 수 있다는 것입니다 나는이 시도했다 : 클래스 보드의 생성자에서

public class Player extends Tile{ 

    public Player(int x, int y) { 
     super(x, y); 
     this.setText("P"); 
    } 

} 

내가 그리드를 변경 시도 [0] [0] 타일에서 플레이어에게 P를 표시 할 것이지만 어떤 이유로 든 그렇게하지는 않습니다 (그리드 [0] [0]의 유형을 플레이어로 변경합니다 ...) 누군가가 도울 수 있기를 바랍니다.

+0

보드에서 보드를 교체하는 대신 기존의 '타이틀'상태를 업데이트하지 않는 이유는 무엇입니까? – MadProgrammer

+0

플레이어 클래스는 '공격', '방어'등과 같은 추가 변수를 얻습니다. 또한 내가 싸울 수있는 적들을 추가 할 것입니다. 타일에 적을 포함하고 있는지 확인하려면 instanceof 함수를 사용하고 싶습니다. ... –

+0

무슨 뜻인지 알면 타일을 플레이어로 교체해야합니다. –

답변

1

UI를 사용하여 개체의 상태를 유지하려고 시도하면 안됩니다. 오히려 UI는 게임 (또는 모델)의 기본 논리의 상태를 시각화해야합니다. 이렇게하면 UI를 물리적으로 수정할 필요없이이 규칙을 시각적으로 표현할 필요없이 모델 수정, 규칙 변경, 요소 추가/제거 (예 : 새로운 몬스터 또는 전리품 추가)를 수행 할 수 있습니다.

아이디어는 Player 속성이 모델에 의해 관리되는 자체 클래스로 유지되어야한다는 것입니다. 그러면 UI가 모델의 상태를 시각화하는 데 사용됩니다.

클릭하면 Tile이 "컨트롤러"에 알립니다. 컨트롤러는 게임 "모델"의 상태 정보를 요청하고 "컨트롤러"는 "모델"의 요구 사항을 충족시키기 위해 버튼의 상태를 변경합니다.

이렇게하면 " 컨트롤러 "를 사용하여 물리적 단추를 변경할 필요없이 단추 정보 (텍스트/아이콘)를 업데이트 할 수 있습니다.

이것은 책임을 정의 된 레이어로 분리하고 코드 결합을 줄이므로 하나 이상의 레이어가 변경 될 수 있지만 전체 구조가 무너 지거나 변경 사항을 처리하기 위해 많이 수정해야합니다.

이 모델은 게임의 가상 상태를 유지하고 개별 게임 개체 간의 상호 작용 (전투 등)을 관리합니다.

UI는 사용자를 위해 모델의 시각화를 제공하는 역할을하며 컨트롤러는 테이크와 사용자 입력을 받아 모델로 전달하고 모델 상태의 변경 사항을 모니터링하며 UI를 업데이트해야하는 경우

Model-view-controller 패러다임은 GUI를 통해 다양한 기능을 지원하는 일반적인 방법입니다.자세한 내용은 Model–view–controller을 참조하십시오.

+0

타일 또는 제목을 의미합니까? – dahui

+0

@Jpa 그게 전부 테스트의 일부입니다;) – MadProgrammer

+0

심각하게? 누군가가 downvote에 대한 이유에 나를 계몽 신경? – MadProgrammer

관련 문제