首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中向游戏中添加文本

如何在Java中向游戏中添加文本
EN

Stack Overflow用户
提问于 2018-09-15 00:50:55
回答 1查看 515关注 0票数 0

我一直在做一个蛇游戏,但我想要做的一个改进是在游戏中添加文本,给出指令并跟踪点数。我摆弄了一下JPanel和其他一些东西,它们都会打开一个新的小窗口,显示文本,而不是在主窗口上打印文本

编辑:

感谢几个乐于助人的人,我知道了正确的用法,但当我在尝试改变颜色时使用它时,它也改变了背景的颜色。我假设这是因为它与背景在同一个类中,所以当我将g.setColor放在背景的颜色下时,它会改变它。

当背景在paint()中时,我尝试使用paintComponent()创建一个新对象,但文本没有显示。

有什么建议吗?

下面是主要的java文件:

代码语言:javascript
复制
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random;

public class Gamepanel extends JPanel implements Runnable, KeyListener { 

    private static final long serialVersionUID = 1L;

    public static final int WIDTH = 500, HEIGHT = 500; //window size

    private Thread thread;

    private boolean running; //allows the game to be started/stopped

    private boolean right = true, left = false, up = false, down = false; //setting default movement

    private BodyPart b;
    private ArrayList<BodyPart> snake;

    private Food food;
    private ArrayList<Food> foods;

    private Random r; //creating random integer for food spawn

    private int xCoor = 10, yCoor = 10, size = 5; //setting location and coordinate size, along with snake length
    private int ticks = 0;

    private int points = 0;

    public Gamepanel() {

        setFocusable(true);

        setPreferredSize(new Dimension(WIDTH, HEIGHT)); //window size
        addKeyListener(this); //allows key input from user

        snake = new ArrayList <BodyPart>();
        foods = new ArrayList <Food>();

        r = new Random(); //random integer

    }

    public void start() {
        running = true; //allows the game to start
        thread = new Thread(this);
        thread.start();

    }
    public void stop() {
        running = false; //stops the game from running
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void tick() {
        if(snake.size() == 0) { //sets location
            b = new BodyPart(xCoor, yCoor, 10);
            snake.add(b);
        }
        ticks++; //constant tick increase
        if(ticks > 750000) { //sets speed (higher = slower)
            if(right) xCoor ++;
            if(left) xCoor --;
            if(up) yCoor --;
            if(down) yCoor ++;

            ticks = 0; 

            b = new BodyPart(xCoor, yCoor, 10);
            snake.add(b);

            if(snake.size() > size) {
                snake.remove(0); //removes earliest value in snake size
            }
        }
        if(foods.size() == 0) { //sets food in window range(multiplies by 10)
            int xCoor = r.nextInt(48);
            int yCoor = r.nextInt(48);

            points++;

            food = new Food(xCoor, yCoor, 10);
            foods.add(food);
        }

        for (int i = 0 ; i < foods.size(); i++) { //spawns new food when old food is eaten
            if(xCoor == foods.get(i).getxCoor() && yCoor == foods.get(i).getyCoor()) {
                size ++;
                foods.remove(i);
                i++;
            }
        }
        //player body collision
        for(int i = 0 ; i < snake.size(); i++) {
            if(xCoor == snake.get(i).getxCoor() && yCoor == snake.get(i).getyCoor()) {
                if(i != snake.size() - 1) {
                    System.out.print("Game Over! " + "Points: " + points);
                    stop();
                }
            }
        }
        //border collision
        if(xCoor < 0 || xCoor > 49 || yCoor < 0 || yCoor > 49) {
            System.out.println("Game Over! " + "Points: " + points);
            stop();
        }

    }
    public void paint(Graphics g) { //background color/size setter

        g.clearRect(0, 0, WIDTH, HEIGHT);

        g.setColor(Color.BLACK); //background color
        g.fillRect(0, 0, WIDTH, HEIGHT);

        for(int i = 0; i < WIDTH/10 ; i++) {
            g.drawLine(i * 10, 0, i * 10, HEIGHT);
        }
        for(int i = 0; i < HEIGHT/10 ; i++) {
            g.drawLine(0, i * 10, HEIGHT, i * 10);
        }
        for(int i = 0 ; i < snake.size(); i++) {
            snake.get(i).draw(g);
        }

        for(int i = 0 ; i < foods.size(); i++) {
            foods.get(i).draw(g);
        }
    }

    @Override
    public void run() {
        while(running) {
            tick(); //runs ticks while running is true
            repaint(); 
        }

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_RIGHT && !left) { //right key = right movement
            right = true;
            up = false;
            down = false;
        }

        if(key == KeyEvent.VK_LEFT && !right) { //left key = left movement
            left = true;
            up = false;
            down = false;
        }

        if(key == KeyEvent.VK_UP && !down) { //up key = up movement 
            up = true;
            right = false;
            left = false;

        }

        if(key == KeyEvent.VK_DOWN && !up) { //down key = down movement
            down = true;
            right = false;
            left = false;

        }

        if(key == KeyEvent.VK_SPACE) {
            snake.clear();
            start();
            size = 5;
            points = 0;
            xCoor = 10;
            yCoor = 10;

        }

    }

    @Override
    public void keyReleased(KeyEvent arg0) {    
    }

    @Override
    public void keyTyped(KeyEvent arg0) {   
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-15 01:17:56

你试过这个吗?

代码语言:javascript
复制
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Font font = new Font("Verdana", Font.BOLD, 14);
    g.setFont(font);
    g.setColor(Color.black);
    g.drawString("instructions", 75, 75);
}

正如@Hovercraft所指出的,也许您应该重写paintComponent()方法,而不是paint()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52336258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档