簡體   English   中英

g.drawString 在兩個方塊碰撞時不繪制游戲結束

[英]g.drawString not drawing Game Over when the Two Squares Collide

我正在嘗試用正方形制作一個虛擬標簽。 現在,我專注於讓游戲結束游戲並在一秒鍾后當它的玩家抓住另一個玩家時關閉。 但是,當兩個方塊碰撞時,程序不會向屏幕寫入任何內容。

我知道調用 g.drawString 的 if 語句之所以有效,是因為它在此處被輸出到控制台兩次,所以我對為什么 g.drawString 不起作用感到困惑。

package com.Arman;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashSet;

public class Virtual_Tag {

    static int x1 = 0;
    static int y1 = 0;
    static Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    static int height = (int) dimension.getHeight();
    static int width = (int) dimension.getWidth();
    static int sWidth = (int) (Math.round(100 * width / 1366.0));
    static int sHeight = (int) (Math.round(100 * height / 768.0));
    static int x2 = width - sWidth;
    static int y2 = height - sHeight;
    static myGraphicsPanel graphics = new myGraphicsPanel();
    static boolean[] move = new boolean[8];
    static int xSpeed1;
    static int ySpeed1;
    static int xSpeed2;
    static int ySpeed2;
    static boolean xcol, ycol;
    static JFrame frame = new JFrame();

    public static void main(String[] args) throws Exception {
        frame.setSize(width, height);
        JPanel left = new JPanel();
        JTextField text1 = new JTextField();
        text1.addKeyListener(new keyListener());
        left.add(text1);
        JTextField text2 = new JTextField();
        text2.addKeyListener(new keyListener());
        JPanel right = new JPanel();
        right.add(text2);
        frame.add(left);
        frame.add(right);
        frame.add(graphics);
        frame.setVisible(true);
        while (!xcol || !ycol) {
            keyListener.move();
            x1 += xSpeed1;
            x2 += xSpeed2;
            y1 += ySpeed1;
            y2 += ySpeed2;
            int s1 = x1;
            int e1 = x1 + sWidth;
            int s2 = x2;
            int e2 = x2 + sWidth;
            xcol = (s1 <= s2 && s2 <= e1) || (s1 <= e2 && e2 <= e1);
            s1 = y1;
            e1 = y1 + sHeight;
            s2 = y2;
            e2 = y2 + sHeight;
            ycol = (s1 <= s2 && s2 <= e1) || (s1 <= e2 && e2 <= e1);
            Thread.sleep(10);
            frame.repaint();
        }
        Thread.sleep(1000);
        System.exit(0);
    }

    static class keyListener extends KeyAdapter {
        private HashSet<Integer> pressed = new HashSet<>();
        private final int[] KEYS = {KeyEvent.VK_W, KeyEvent.VK_A, KeyEvent.VK_D, KeyEvent.VK_S, KeyEvent.VK_DOWN,
            KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, KeyEvent.VK_UP};

        public static void move() {
            ySpeed1 = 0;
            xSpeed1 = 0;
            ySpeed2 = 0;
            xSpeed2 = 0;
            if (move[0]) ySpeed1 -= 10;
            if (move[1]) xSpeed1 -= 10;
            if (move[2]) xSpeed1 += 10;
            if (move[3]) ySpeed1 += 10;
            if (move[4]) ySpeed2 += 10;
            if (move[5]) xSpeed2 -= 10;
            if (move[6]) xSpeed2 += 10;
            if (move[7]) ySpeed2 -= 10;
        }

        public void keyPressed(KeyEvent e) {
            pressed.add(e.getKeyCode());
            for (int f : pressed) {
                boolean found = false;
                for (int i = 0; i < 8 && !found; i++) {
                    if (f == KEYS[i]) {
                        move[i] = true;
                        found = true;
                    }
                }
            }
        }

        public void keyReleased(KeyEvent e) {
            boolean found = false;
            for (int i = 0; i < 8 && !found; i++) {
                if (e.getKeyCode() == KEYS[i]) {
                    move[i] = false;
                    found = true;
               }
           }
            pressed.remove(e.getKeyCode());
        }

        public void keyTyped(KeyEvent e) {
            // not used
        }
    }

    static class myGraphicsPanel extends JPanel {
        public void paintComponent(Graphics g) {
            g.setColor(Color.BLUE);
            g.fillRect(x1, y1, 100, 100);
            g.setColor(Color.RED);
            g.fillRect(x2, y2, 100, 100);
            if (xcol && ycol) {
                g.setFont(new Font("Verdana", Font.PLAIN, 36));
                g.drawString("Game Over!", 0, 0);
                System.out.println("Made it here");
            }
        }
    }
}

更改打印坐標以向右和向下移動字符串。 嘗試200,200

此外,您應該執行以下操作:

  • 擺脫你的靜態語句。
  • 然后將 main 中的代碼移動到方法start() 然后,您可以通過執行以下操作來調用您的程序:
  new VirtualTag().start();

通常你應該在 main 中啟動你的程序,如下所示:

 SwingUtilities.invokeLater(()->new Virtual_Tag().start());

但在這種情況下,這是行不通的,因為您將在Event Dispatch Thread不斷循環,並且不會繪制任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM