如何在Java中向游戏添加文本
我一直在开发一款蛇类游戏,但我想做的一个改进是在游戏中添加文本,给出说明并跟踪分数。我搞乱了JPanel和其他一些东西,它们都打开了一个新的小窗口,显示文本,而不是在主窗口上打印文本 编辑: 多亏了几个有帮助的人,我理解了正确的用法,但是当我试图改变颜色时,它也会改变背景的颜色。我假设这是因为它和背景在同一个类中,所以当我把g.setColor放在背景的颜色下时,它改变了它 当背景在paint()中时,我尝试使用paintComponent()创建一个新对象,但文本没有显示 有什么建议吗 以下是主java文件:如何在Java中向游戏添加文本,java,jpanel,Java,Jpanel,我一直在开发一款蛇类游戏,但我想做的一个改进是在游戏中添加文本,给出说明并跟踪分数。我搞乱了JPanel和其他一些东西,它们都打开了一个新的小窗口,显示文本,而不是在主窗口上打印文本 编辑: 多亏了几个有帮助的人,我理解了正确的用法,但是当我试图改变颜色时,它也会改变背景的颜色。我假设这是因为它和背景在同一个类中,所以当我把g.setColor放在背景的颜色下时,它改变了它 当背景在paint()中时,我尝试使用paintComponent()创建一个新对象,但文本没有显示 有什么建议吗 以下是
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) {
}
}
import javax.swing.JPanel;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入java.util.Random;
公共类Gamepanel扩展了JPanel实现可运行的KeyListener{
私有静态最终长serialVersionUID=1L;
公共静态最终整型宽度=500,高度=500;//窗口大小
私有线程;
private boolean running;//允许启动/停止游戏
私有布尔值right=true,left=false,up=false,down=false;//设置默认移动
私人机构乙部;
私家蛇;
私人食品;
私人ArrayList食品;
private Random r;//为食物产卵创建随机整数
private int xCoor=10,yCoor=10,size=5;//设置位置和坐标大小以及蛇的长度
私有整数=0;
私人积分=0;
公共游戏小组(){
设置聚焦(真);
setPreferredSize(新尺寸(宽度、高度));//窗口大小
addKeyListener(this);//允许用户输入密钥
snake=newarraylist();
食品=新ArrayList();
r=new Random();//随机整数
}
公开作废开始(){
running=true;//允许游戏开始
线程=新线程(此);
thread.start();
}
公共停车场(){
running=false;//停止游戏运行
试一试{
thread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共空白勾号(){
如果(snake.size()==0){//设置位置
b=新车身部件(xCoor,yCoor,10);
蛇.加入(b);
}
滴答声+++;//滴答声持续增加
如果(滴答声>750000){//设置速度(越高=越慢)
if(右)xCoor++;
如果(左)xCoor--;
如果(向上)yCoor--;
如果(向下)yCoor++;
滴答声=0;
b=新车身部件(xCoor,yCoor,10);
蛇.加入(b);
if(snake.size()>size){
snake.remove(0);//删除snake大小中最早的值
}
}
如果(foods.size()==0){//设置窗口范围内的食物(乘以10)
int xCoor=r.nextInt(48);
int yCoor=r.nextInt(48);
积分++;
食品=新食品(xCoor,yCoor,10);
添加(食物);
}
for(inti=0;i49 | | yCoor<0 | | yCoor>49){
System.out.println(“游戏结束!”+“点数:”+);
停止();
}
}
公共空白绘制(图形g){//背景色/尺寸设置器
g、 clearRect(0,0,宽度,高度);
g、 setColor(Color.BLACK);//背景色
g、 fillRect(0,0,宽度,高度);
对于(int i=0;i
你试过这个吗
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 may所指出的