2015-12-08 10 views
1

im, создавая мир 2d, в котором есть игрок, который находится в форме прямоугольника, и что им нужно делать, когда игрок нажимает клавишу пробела, он рисует блок в зависимости от его направления, проблема в том, что он задает только один блок, и плюс он удаляет его после повторной обработки теперь, я знаю, что моя ошибка заключается в методе рисования. то, что я хочу знать, как сделать это рисует блок каждый раз я нажимаю пространство без удаления после перекрашивания и может быть установлена ​​на несколько раз я знаю, что я должен использовать цикл, но я не знаю точно, я должен написать егоJava, как сделать фигуру, которую можно нарисовать, нажав кнопку

private static final long serialVersionUID = -1401667790158007207L; 
int playerx = 450; 
int playery = 450; 
int playerDirection = 0;  //north = 0, west = 1, south = 2, east = 3 
boolean setBlock; 

public platform(){ 
    super("2D game"); 

    JPanel panel = new JPanel(); 
    panel.setBackground(Color.white); 

    addKeyListener(this); 
    this.setContentPane(panel); 
} 

public void paint(Graphics g){ 
    super.paint(g); 
    Graphics2D g2 = (Graphics2D)g; 

    Rectangle player = new Rectangle(playerx, playery, 50, 50); 
    g2.fill(player); 

    if(setBlock){ 

     if(playerDirection == 0){ 

      g2.fillRect(playerx, playery - 50, 50, 50); 
     }else if(playerDirection == 1){ 

      g2.fillRect(playerx + 50, playery, 50, 50); 
     }else if(playerDirection == 2){ 

      g2.fillRect(playerx, playery + 50, 50, 50); 
     }else if(playerDirection == 3){ 

      g2.fillRect(playerx - 50, playery, 50, 50); 
     } 

     setBlock = false; 
    } 
} 

public void keyPressed(KeyEvent e) { 

    if(e.getKeyCode() == KeyEvent.VK_UP){ 

     playerDirection = 0; 
     playery -=50; 
     repaint(); 
    } 
    if(e.getKeyCode() == KeyEvent.VK_DOWN){ 

     playerDirection = 2; 
     playery +=50; 
     repaint(); 
    } 
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 

     playerDirection = 1; 
     playerx += 50; 
     repaint(); 
    } 
    if(e.getKeyCode() == KeyEvent.VK_LEFT){ 

     playerDirection = 3; 
     playerx -=50; 
     repaint(); 
    } 
    if(e.getKeyCode() == KeyEvent.VK_SPACE){ 

     setBlock = true; 
    } 
} 

public void keyReleased(KeyEvent e) { 


} 

public void keyTyped(KeyEvent e) { 


} 

}

+2

Во-первых, избавиться от этого 'setBlock = ложь;' в методе краски, так как государственная программа не должна зависеть от способа окраски, которые являются методы, которые не имеют контроля над. Является ли это графическим интерфейсом Swing, если вам следует избегать переопределения краски в первую очередь и использовать paintComponent. –

+2

Вы должны сохранить свои прямоугольные блоки в списке. Потому что каждый раз, когда вы перерисовываете, вы в основном теряете все, что где-то не сохранилось. –

ответ

2

Вам нужно сохранить свои блоки в списке. И добавьте новый, нажав клавишу Space. Затем вы можете легко нарисовать все из них в цикле for. Также удалите этот setBlock boolean, потому что это не имеет смысла.

... 
// introduce this class to hold a block 
class Block{ 
    public int x; 
    public int y; 
    public Block(int _x, int _y){ 
     x = _x; 
     y = _y; 
    } 
} 
... 
// boolean setBlock; // remove this boolean 
ArrayList<Block> blocks = new ArrayList<Block>(); // list of all blocks 

public platform(){...} 

public void paint(Graphics g){ 
    ...  
    // if(setBlock){ // remove this boolean 

     if(playerDirection == 0){ 
      g2.fillRect(playerx, playery, 50, 50); 
     }else if(playerDirection == 1){ 
      g2.fillRect(playerx, playery, 50, 50); 
     }else if(playerDirection == 2){ 
      g2.fillRect(playerx, playery, 50, 50); 
     }else if(playerDirection == 3){ 
      g2.fillRect(playerx, playery, 50, 50); 
     } 
     // draw the blocks 
     for(Block b : blocks) 
      g2.fillRect(b.x, b.y, 50, 50); 

     // setBlock = false; // remove this boolean 
    //} // remove this boolean 
} 

public void keyPressed(KeyEvent e) { 
    ... 
    if(e.getKeyCode() == KeyEvent.VK_SPACE){ 
     // setBlock = true; // remove this boolean 
     // add a new block 
     blocks.add(new Block(playerx, playery)); 
     repaint(); 
    } 
} 
... 
+0

спасибо, что работает извините за вопрос о дамму, но im new @arcticlord – Heroxlegend

 Смежные вопросы

  • Нет связанных вопросов^_^