2016-06-06 3 views
2

Я создаю игру Hangman, где игрок вводит слово, а другой игрок пытается угадать это слово. На экране есть 26 JButtons (с каждой буквой алфавита).счетчик обновления/перекрашивание графики

Каждый раз, когда выбрана правильная буква, счетчик с переменными приращениями. Количество счетчика переменная определяет, сколько из палача нарисовано (7 - это когда палач полностью нарисован). Я могу получить счетчик, чтобы увеличить, когда выбрана правильная буква, но я не могу заставить части палача рисоваться, когда он увеличивается.

Вот мой палач класс, который рисует Виселица и включает в себя incrementCounter метод:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class HangMan extends JPanel implements ActionListener { 

private int xS = 8; 
private int yS = 30; 
public int counter; 
private Color hatColor = Color.BLACK; 

private int dx = 0; 
private int dy = 0; 

public HangMan(int initalX, int initalY) { 
    // starting location 
    xS = initalX; 
    yS = initalY; 
    counter = 0; 

    Dimension dim = new Dimension(250, 475); 
    this.setPreferredSize(dim); 
    setFocusable(true); 
    requestFocusInWindow(); 
    this.setVisible(true); 

} 

public void drawHangMan(Graphics g) { 
    g.setColor(Color.BLACK); 
    if (counter == 0) { 
     repaint(); 

    } 
    if (counter == 1) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     repaint(); 

    } 
    if (counter == 2) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     drawHead(xS, yS + 30, 50, 50, g); // head 
     repaint(); 

    } 
    if (counter == 3) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     drawHead(xS, yS + 30, 50, 50, g); // head 
     drawBody(xS + 25, yS + 80, xS + 25, yS + 175, g); // body 
     repaint(); 

    } 
    if (counter == 4) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     drawHead(xS, yS + 30, 50, 50, g); // head 
     drawBody(xS + 25, yS + 80, xS + 25, yS + 175, g); // body 
     drawLeftLeg(xS - 20, yS + 225, xS + 25, yS + 175, g); //left leg 
     repaint(); 

    } 
    if (counter == 5) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     drawHead(xS, yS + 30, 50, 50, g); // head 
     drawBody(xS + 25, yS + 80, xS + 25, yS + 175, g); // body 
     drawLeftLeg(xS - 20, yS + 225, xS + 25, yS + 175, g); //left leg 
     drawRightLeg(xS + 25, yS + 175, xS + 65, yS + 225, g); //right leg 
     repaint(); 

    } 
    if (counter == 6) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     drawHead(xS, yS + 30, 50, 50, g); // head 
     drawBody(xS + 25, yS + 80, xS + 25, yS + 175, g); // body 
     drawLeftLeg(xS - 20, yS + 225, xS + 25, yS + 175, g); //left leg 
     drawRightLeg(xS + 25, yS + 175, xS + 65, yS + 225, g); //right leg 
     drawLeftArm(xS - 20, yS + 90, xS + 25, yS + 120, g); //left arm 
     repaint(); 

    } 

    if (counter == 7) { 
     drawHat(xS + 15, yS - 1, 20, 25, g); // hat 
     drawBrim(xS + 10, yS + 25, 30, 6, g); // brim 
     drawHead(xS, yS + 30, 50, 50, g); // head 
     drawBody(xS + 25, yS + 80, xS + 25, yS + 175, g); // body 
     drawLeftLeg(xS - 20, yS + 225, xS + 25, yS + 175, g); //left leg 
     drawRightLeg(xS + 25, yS + 175, xS + 65, yS + 225, g); //right leg 
     drawLeftArm(xS - 20, yS + 90, xS + 25, yS + 120, g); //left arm 
     drawRightArm(xS + 25, yS + 120, xS + 70, yS + 90, g); //right arm 
     repaint(); 

    } 

} 

public void drawLeftArm(int a, int b, int x, int y, Graphics g) { 
    g.drawLine(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawRightArm(int a, int b, int x, int y, Graphics g) { 
    g.drawLine(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawLeftLeg(int a, int b, int x, int y, Graphics g) { 
    g.drawLine(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawRightLeg(int a, int b, int x, int y, Graphics g) { 
    g.drawLine(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawBody(int a, int b, int x, int y, Graphics g) { 
    g.drawLine(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawHead(int a, int b, int x, int y, Graphics g) { 
    g.drawOval(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawHat(int a, int b, int x, int y, Graphics g) { 
    g.drawRect(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawBrim(int a, int b, int x, int y, Graphics g) { 
    g.drawRect(a, b, x, y); //left arm 
    repaint(); 

} 

public void drawHanger(Graphics g) { 
    g.fillRect(xS - 125, yS + 300, 80, 20); 
    g.drawLine(xS - 85, yS + 300, xS - 85, yS + 80); 
    g.drawLine(xS - 85, yS + 80, xS + 22, yS + 80); 

} 

public void incrementCounter() { 
    counter++; 
    System.out.println("counter = " + counter); 
    repaint(); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    drawHangMan(g); 
    drawHanger(g); 
    repaint(); 
    g.setFont(new Font("Sherif", Font.BOLD, 40)); 

} 

public void actionPerformed(ActionEvent e) { 
    repaint(); 
} 

} 

Теперь вот моя кнопка класса, который привлекает 26 JButtons и включает в себя ActionListener, который будет вызывать метод обновления каждый раз, нажимается кнопка

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class Button extends JPanel { 

JButton[] grid = new JButton[26]; 

Dashes dash; 


public Button(String str, Dashes dash) { 

    this.dash = dash; 
    final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    Dimension dim = new Dimension(360, 360); 
    this.setPreferredSize(dim); 

    ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 

      String action = e.getActionCommand(); 
      System.out.println(action); 


      dash.update(action); 
      dash.repaint(); 
      /* 
        add(new JLabel(action + "")); 
        setVisible(true); 
      */ 

     } 
    }; 

    for (int i = 0; i < grid.length; i++) { 
     grid[i] = (JButton) this.add(new JButton(alphabet.charAt(i) + "")); 
     grid[i].addActionListener(listener); 
     this.setVisible(true); 
    } 

} 

} 

и вот мой Штрихи класс, который содержит метод обновления

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Dashes extends JPanel { 

JLabel label; 
String word; 
String guess = ""; 
HangMan hang; 

public Dashes(String word) { 

    this.word = word; 
    hang = new HangMan(150, 150); 
    for (int i = 0; i < word.length(); i++) { 
     guess += " "; 
    } 
    word = word.toUpperCase(); 
    Dimension dim = new Dimension(1500, 300); 
    this.setPreferredSize(dim); 

    this.setVisible(true); 

} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    drawDashes(g2d); 

} 

private void drawDashes(Graphics2D g2d) { 

    for (int i = 0; i < word.length() * 50; i += 50) { 
     g2d.draw(new Line2D.Double(100.0 + i, 200.0, 125.0 + i, 200.0)); 

     for (int j = 0; j < guess.length(); j++) { 
      g2d.drawString(guess.charAt(j) + "", 108 + j * 50, 198); 
     } 
     // g2d.drawString("m", 108 + i, 198); 
    } 

} 

public void update(String str) { 
    for (int i = 0; i < word.length(); i++) { 
     if (str.equals(word.charAt(i) + "")) { 

      guess = guess.substring(0, i) + str + guess.substring(i + 1); 
      hang.incrementCounter(); 
      hang.repaint(); 
     } 

    } 

} 

} 

Прошу прощения за столь маленькую проблему. Хотел бы упомянуть, что если я изначально установил счетчик как 2, он бы правильно нарисовал шляпу, краю и голову. Некоторая предыстория: мне был назначен проект графики на Java, который никогда не преподавался графикой!

+0

попробовать удалить 'перекрасить()' звонки в палача классе. Вы уведомляете компонент о перерисовании в логике рисования (это неправильно). – fhofmann

+0

Я попытался удалить все вызовы перерисовки в классе Hangman и, к сожалению, ничего не изменилось в проекте –

ответ

0

1 - Удалить repaint() из логики краски (как сказано в комментарии)
2 - в Dashes.update() использовании String.equalsIgnoreCase() вместо String.equals() (вероятно, у вас есть строчное слово и сравниваете с прописной charactere из Button класса).
3 - в Dashes.update() приращения счетчика и перекрашивать HangMan только если вы пропустите:

public void update(String str) { 
    boolean found = false; 
    for (int i = 0; i < word.length(); i++) { 
     if (str.equalsIgnoreCase(word.charAt(i) + "")) { 
      guess = guess.substring(0, i) + str + guess.substring(i + 1); 
      found = true; 
     } 

    } 
    if(!found) { 
     hang.incrementCounter(); 
     hang.repaint(); 
    } 
}