gpt4 book ai didi

java - 当将其调用到 main 中时,Keylistener 和 actionlistener 不起作用。

转载 作者:行者123 更新时间:2023-12-02 11:29:16 28 4
gpt4 key购买 nike

我正在尝试制作一个小游戏,你可以在其中四处走动。我写了一段代码,确实有效。但是,当我尝试缩短代码并使其看起来更好时,我偶然发现了一个我无法自行解决的错误。

主要:

    package eksamenstest;

import javax.swing.JFrame;

public class Eksamenstest extends JFrame {

public Eksamenstest() throws InterruptedException
{
JFrame SOJ = new JFrame("Sword Of Justice");
SOJ.pack();
SOJ.setSize(1000,700);
SOJ.setVisible(true);
SOJ.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SOJ.add(new Grafik());
}

public static void main(String[] args) throws InterruptedException
{
new Eksamenstest();
new Musik();
new SpillerOne();
}
}

图形:

package eksamenstest;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class Grafik extends JPanel
{
int Menu = 1;
int Player1Liv = 3;
int Player2Liv = 3;
int DødP1 = 1;
int DødP2 = 1;
int WeaponON2;
int WeaponON1;
int Skjold;
int Skjold1;
int x = 100;
int y = 360;
int x_1 = 820;
int y_1 = 360;

public Grafik(){}

public void paint(Graphics g)
{
//Grafikken af banen

Image Bane2 = Toolkit.getDefaultToolkit().getImage("Bane2.png");
g.drawImage(Bane2, 0, 0, 1000, 800, this);

Image Plank = Toolkit.getDefaultToolkit().getImage("Plank.jpg");
g.drawImage(Plank, 100, 500, 800, 10, this);

Image lava = Toolkit.getDefaultToolkit().getImage("lava.png");
g.drawImage(lava, 0, 520, 1000, 260, this);

if(Menu == 1)
{
Image Menu2 = Toolkit.getDefaultToolkit().getImage("Menu.png");
g.drawImage(Menu2, 100, -30, 900, 700, this);
}

//Player 1 - Grafikken der viser hvordan spilleren står.

if(WeaponON1 == 0){
Image PlayerStå = Toolkit.getDefaultToolkit().getImage("Stå.png");
g.drawImage(PlayerStå, x, y, 80, 140, this);
}

if(WeaponON1 == 1){
Image PlayerSværdOP = Toolkit.getDefaultToolkit().getImage("OP.png");
g.drawImage(PlayerSværdOP, x, y, 80, 140, this);
}

if(WeaponON1 == 2){
Image PlayerSværdFrem = Toolkit.getDefaultToolkit().getImage("Frem.png");
g.drawImage(PlayerSværdFrem, x, y, 80, 140, this);
}
if(Skjold == 1){
Image Player1Skjold = Toolkit.getDefaultToolkit().getImage("Player1Skjold.png");
g.drawImage(Player1Skjold, x, y, 80, 140, this);
}
if(Player1Liv == 0){
Image DødP = Toolkit.getDefaultToolkit().getImage("DødP.png");
g.drawImage(DødP, x, y, 80, 140, this);
}
if(Player2Liv == 0){
Image Jubel = Toolkit.getDefaultToolkit().getImage("Jubel.png");
g.drawImage(Jubel, x, y, 80, 140, this);
}


//Player 2 - Grafikken der viser hvordan spilleren står.

if(WeaponON2 == 0){
Image PlayerStå1 = Toolkit.getDefaultToolkit().getImage("Stå1.png");
g.drawImage(PlayerStå1, x_1, y_1, 80, 140, this);
}
if(WeaponON2 == 1){
Image PlayerSværdOP1 = Toolkit.getDefaultToolkit().getImage("OP1.png");
g.drawImage(PlayerSværdOP1, x_1, y_1, 80, 140, this);
}
if(WeaponON2 == 2){
Image PlayerSværdFrem1 = Toolkit.getDefaultToolkit().getImage("Frem1.png");
g.drawImage(PlayerSværdFrem1, x_1, y_1, 80, 140, this);
}
if(Skjold1 == 1){
Image Player2Skjold = Toolkit.getDefaultToolkit().getImage("Player2Skjold.png");
g.drawImage(Player2Skjold, x_1, y_1, 80, 140, this);
}
if(Player2Liv == 0){
Image DødPA = Toolkit.getDefaultToolkit().getImage("DødP.png");
g.drawImage(DødPA, x_1, y_1, 80, 140, this);
}
if(Player1Liv == 0){
Image Jubel = Toolkit.getDefaultToolkit().getImage("Jubel.png");
g.drawImage(Jubel, x_1, y_1, 80, 140, this);
}



//Health Bars / Stamina / Navne / Win

//Player 1

Image PlayerNavn = Toolkit.getDefaultToolkit().getImage("Player1Navn.png");
g.drawImage(PlayerNavn, 30, 50, 70, 30, this);
if(Player1Liv == 3){
Image Liv100B = Toolkit.getDefaultToolkit().getImage("Liv100B.png");
g.drawImage(Liv100B, 30, 80, 120, 40, this);
}
if(Player1Liv == 2){
Image Liv75B = Toolkit.getDefaultToolkit().getImage("Liv75B.png");
g.drawImage(Liv75B, 30, 80, 120, 40, this);
}
if(Player1Liv == 1){
Image Liv50B = Toolkit.getDefaultToolkit().getImage("Liv25B.png");
g.drawImage(Liv50B, 30, 80, 120, 40, this);
}
if(Player1Liv == 0){
Image Liv0B = Toolkit.getDefaultToolkit().getImage("Liv0B.png");
g.drawImage(Liv0B, 30, 80, 120, 40, this);
DødP1 = 0;
Image Player2Win = Toolkit.getDefaultToolkit().getImage("Player2Wins.png");
g.drawImage(Player2Win, 350, 80, 350, 110, this);
}

// Player 2

Image PlayerNavn1 = Toolkit.getDefaultToolkit().getImage("Player2Navn.png");
g.drawImage(PlayerNavn1, 900, 50, 70, 30,this);
if(Player2Liv == 3){
Image Liv100R = Toolkit.getDefaultToolkit().getImage("Liv100R.png");
g.drawImage(Liv100R, 850, 80, 120, 40, this);
}
if(Player2Liv == 2){
Image Liv75R = Toolkit.getDefaultToolkit().getImage("Liv75R.png");
g.drawImage(Liv75R, 850, 80, 120, 40, this);
}
if(Player2Liv == 1){
Image Liv50R = Toolkit.getDefaultToolkit().getImage("Liv25R.png");
g.drawImage(Liv50R, 850, 80, 120, 40, this);
}
if(Player2Liv == 0){
Image Liv0R = Toolkit.getDefaultToolkit().getImage("Liv0R.png");
g.drawImage(Liv0R, 850, 80, 120, 40, this);
DødP2 = 0;
Image Player1Win = Toolkit.getDefaultToolkit().getImage("Player1Wins.png");
g.drawImage(Player1Win, 350, 80, 350, 110, this);
}
}
}

玩家移动

    package eksamenstest;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class SpillerOne extends JFrame implements ActionListener, KeyListener {

int x = 100;
int y = 360;
int xHøjre;
int xVenstre;
int DødP1;
int Player1Liv;
int iLava;
int x_1;
int Player2Liv;
int Skjold1;
int WeaponON1;
int Menu = 1;
int SværdTid;
int Sværd;
int Skjold;


public SpillerOne()
{
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}


@Override
public void actionPerformed(ActionEvent e)
{
PlayerOneMove();
repaint();
}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
int c = e.getKeyCode();

//Menu
if(c == KeyEvent.VK_O){
Menu = 1;
}
if(c == KeyEvent.VK_P){
Menu = 0;
}


// Player

if(DødP1 == 1){

if(c == KeyEvent.VK_A){
xVenstre = 1;
WeaponON1 = 0;
Sværd = 0;
}

if(c == KeyEvent.VK_D){
xHøjre = 1;
WeaponON1 = 0;
}

if(WeaponON1 == 1){
if(SværdTid < 3){
if(c == KeyEvent.VK_W){
WeaponON1 = 2;
SværdTid++;
}
}
}

if(c == KeyEvent.VK_S){
WeaponON1 = 1;
Sværd = 1;
}

if(c == KeyEvent.VK_Q){
Skjold = 1;
SværdTid++;
}
}

if(c == KeyEvent.VK_E){
SværdTid--;
WeaponON1 = 0;
}

}

@Override
public void keyReleased(KeyEvent e)
{
int c = e.getKeyCode();

// Spiller 1

if(c == KeyEvent.VK_A){
xVenstre = 0;
}

if(c == KeyEvent.VK_D){
xHøjre = 0;
}

if(c == KeyEvent.VK_Q){
Skjold = 0;
SværdTid = SværdTid;
}

if(c == KeyEvent.VK_W){
if(Sværd == 1)
WeaponON1 = 1;
}


if(c == KeyEvent.VK_E){
SværdTid = SværdTid;
WeaponON1 = 0;
}
}


public void PlayerOneMove()
{
// Spiller et Bevægelse

x = x + xHøjre; //Højre
x = x - xVenstre; //Venstre



if(WeaponON1 == 2){ //Tjekker om spilleren har våbnet fremme og hvis ja, så tjekker den om modspilleren har skjold på, hvis ikke, mister person 2 liv.
if(Skjold1 == 0){
if(x > x_1-80 && x < x_1 + 80){
x = 100;
x_1 = 820;
Player2Liv--;
}
}

if(WeaponON1 == 2){
if(Skjold1 == 1){
if(x > x_1-80 && x < x_1 + 80){
x_1 = x_1 + 60;
}
}
}

}



// Falder ned i lava

if(x < 100 && 100 > x + 80){ //Tjekker om player 1 er i lava ved venstre side.
DødP1 = 0;
Player1Liv = 0;
iLava = 1;
if(y < 500){
y++;
}
}

if(x > 900){ //Tjekker om player 1 er i lava ved højre side.
DødP1 = 0;
Player1Liv = 0;
iLava = 1;
if(y < 500){
y++;
}
}
}
}

我感觉这个错误是因为我没有在某个地方重新绘制而引起的。

最佳答案

所以,问题列表......

第一

有两个 JFrame - 哪一个实际上用于什么?据我所知,SpillerOne 从未显示,因此它无法对关键事件使用react。同样,您的 ActionListener 似乎没有附加到任何可以实际生成操作的东西。

这也引发了一系列有关 SpillerOneGrafik 之间关系的问题。它们似乎共享变量名称,但它们无法共享状态,因此即使 KeyListener 工作,Grafik 也永远不会反射(reflect) 中的更改>SpillerOne的状态

第二个

您以错误的方式实现了自定义绘画。强烈建议不要重写 paint,相反,您应该重写 paintComponent 并调用 super.paintComponent 以确保满足绘制链的要求

参见Performing Custom PaintingPainting in AWT and Swing了解更多详情

您似乎还在 Grafik 类中放入了大量状态逻辑,随着复杂性的增加,维护起来将变得更加困难。相反,每个不同的操作应该是它自己的类,专注于执行尽可能少的专用操作

第三

KeyListener 对于监视按键事件来说是一个糟糕的选择。虽然有一些“黑客”尝试使用 KeyListener“解决”与焦点相关的问题,但没有一个能够获得可靠的结果。

如果您对 KeyListener 相关问题进行任何研究,您很快就会发现 Key bindings API通常被视为解决问题的最可靠的解决方案

总体

你的代码毫无意义。为什么有两个框架? ActionListener 的用途是什么?它如何附加到生成操作的对象上?为什么 Grafik 不充当按键/操作监听器?

我认为您需要进行一些重要的思考和重新设计

关于java - 当将其调用到 main 中时,Keylistener 和 actionlistener 不起作用。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49392615/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com