Java 将敌人从一个类实现到另一个类时出错

Java 将敌人从一个类实现到另一个类时出错,java,applet,Java,Applet,我对java非常陌生,我正在尝试创建一个基本游戏,在这个游戏中,一种类型的敌人可以通过另一个类和方法多次繁殖。到目前为止,我已经成功地为这个敌人创造了设定速度、x、y和dmg的能力,但是敌人的移动没有正常工作。出于某种原因,我的敌人似乎在玩家第一次产卵的地方停下来,而不是跟随玩家。我相信我的方法有问题,但我不太确定。如果您看到任何不好的编码实践或任何我可以改进的代码,请让我知道,并提前感谢 主程序: import java.awt.*; import java.applet.Applet; im

我对java非常陌生,我正在尝试创建一个基本游戏,在这个游戏中,一种类型的敌人可以通过另一个类和方法多次繁殖。到目前为止,我已经成功地为这个敌人创造了设定速度、x、y和dmg的能力,但是敌人的移动没有正常工作。出于某种原因,我的敌人似乎在玩家第一次产卵的地方停下来,而不是跟随玩家。我相信我的方法有问题,但我不太确定。如果您看到任何不好的编码实践或任何我可以改进的代码,请让我知道,并提前感谢

主程序:

import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import java.util.Random;
public class platformer extends Applet implements Runnable, KeyListener, MouseListener
{
    Thread main = new Thread (this);
    Graphics bufferG;
    Image buffer;
    boolean playerright=false,playerleft=false,jump=false,playerdown=false,shotleft=false,shotright=false;
    int playerx=500,playery=400,yChange=0, height=200, pageCt=1, shotrx=playerx,shotry=playery,shotlx=playerx,shotly=playery,enemyx=1500,enemyy=400,hp=5,enemyhp=2;
    Random r = new Random();
    Enemy2 enemy= new Enemy2(4,enemyx,enemyy,50,1,playerx,playery,3);
    public void init()
    {
        this.addMouseListener(this);
        this.addKeyListener(this);
        this.resize (1400,756);
        buffer= createImage(this.getWidth(),this.getHeight());
        bufferG = buffer.getGraphics();
        main.start();

    }

    public void paint(Graphics g )
    {
        Font font1 = new Font ( " Bodoni MT",1,25);
        if(pageCt==1){
            bufferG.setColor(Color.black);
            bufferG.fillRect(0,0,1400,800);
            bufferG.setColor(Color.gray);
            bufferG.fillRect(0,450,1450,350);

            enemy.draw(bufferG);
            bufferG.setColor(Color.green);
            if (playerdown==true){
                bufferG.fillRect(playerx,playery+15,50,35);
            }
            else
                bufferG.fillRect(playerx,playery,50,50);

            if(shotright==true ){
                bufferG.fillOval(shotrx,shotry,25,25);
            }
            if(shotleft==true ){
                bufferG.fillOval(shotlx,shotly,25,25);
            }
        }
        if(pageCt==2){
            bufferG.setFont(font1);
            bufferG.drawString("You lose",675,150);
        }

        g.drawImage(buffer,0,0,this);
    }

    public void run()
    {
        while(true)
        {
            repaint();
            try
            { main.sleep(10); }
            catch (Exception e ) {}
            if(pageCt==1){

                if (playerright==true ){
                    playerx+=5;
                }
                if (playerleft==true ){
                    playerx-=5;
                }
                if (jump==true ){
                    yChange++;
                    playery=playery+yChange;

                    if(playery>height){
                        jump=false;
                        playery=height;
                    }

                }

                if(shotrx>0 && shotrx<1300 && shotright==true)
                {
                    shotrx+=7;
                }
                else{
                    shotright=false;
                    shotrx=playerx;
                    shotry=playery;
                }

                if(shotlx>0 && shotlx<1300 && shotleft==true)
                {
                    shotlx-=7;
                }
                else{
                    shotleft=false;
                    shotlx=playerx;
                    shotly=playery;
                }


                enemy.move();

                if(enemyhp<=0){
                    enemyhp=2;
                    int c=r.nextInt(3);
                    if(c==1)
                        enemyx=1500;
                    if(c==2)
                        enemyx=-200;
                }

                if(hp<=0)
                {
                    pageCt=2;
                }

                Rectangle playerRect2 = new Rectangle ( playerx,playery+15,50,35);
                Rectangle playerRect1 = new Rectangle ( playerx,playery,50,50);
                Rectangle enemyRect = new Rectangle ( enemyx,enemyy,50,50);
                Rectangle shotr = new Rectangle(shotrx,shotry,25,25);
                Rectangle shotl = new Rectangle(shotlx,shotly,25,25);
                if(enemyRect.intersects(playerRect1)){
                    hp--;
                    if(enemyx>playerx)
                        enemyx+=150;
                    if(enemyx<playerx)
                        enemyx-=150;
                }
                if(shotr.intersects(enemyRect)|| shotl.intersects(enemyRect)){
                    enemyhp--;
                    shotright=false;
                    shotleft=false;
                    if(enemyx>playerx)
                        enemyx+=100;
                    if(enemyx<playerx)
                        enemyx-=100;
                }
            }

        }
    }

    public void keyReleased(KeyEvent e)
    {
        int key= e.getKeyCode();
        if (key == KeyEvent.VK_A )
        {
            playerleft=false;
        }
        if (key == KeyEvent.VK_S )
        {
            playerdown=false;
        }
        if (key == KeyEvent.VK_D )
        {
            playerright=false;
        }

    }

    public void keyPressed(KeyEvent e)
    {
        int key= e.getKeyCode();
        if (key == KeyEvent.VK_A )
        {
            playerleft=true;
        }

        if(key == KeyEvent.VK_W && jump==false && playery>=height)
        {
            jump=true;
            yChange=-20;
            height=playery;
        }
        if (key == KeyEvent.VK_S )
        {
            playerdown=true;
        }
        if (key == KeyEvent.VK_D )
        {
            playerright=true;
        }

        repaint();
    }

    public void keyTyped(KeyEvent e) {}

    public void update(Graphics g)
    {
        paint(g);
    }

    public void mouseClicked ( MouseEvent e )
    {
        int mouseX = e.getX();
        int mouseY = e.getY();
        if(mouseX>=playerx && shotright==false && shotleft==false)
            shotright=true;
        if(mouseX<playerx && shotleft==false&& shotright==false)
            shotleft=true;
    }

    public void mousePressed ( MouseEvent e ) 
    {

    }

    public void mouseReleased ( MouseEvent e ) {}

    public void mouseEntered ( MouseEvent e ) {}

    public void mouseExited ( MouseEvent e ) {}

}
import java.awt.*;
导入java.applet.applet;
导入java.awt.event.*;
导入java.util.Random;
公共类platformer扩展小程序实现可运行、KeyListener、MouseListener
{
主线程=新线程(此线程);
图形缓冲;
图像缓冲区;
布尔playerright=false,playerleft=false,jump=false,playerdown=false,shotleft=false,shotright=false;
int playerx=500,playery=400,yChange=0,height=200,pageCt=1,shotrx=playerx,shotry=playerx,shotlx=playerx,shotly=playery,enemyx=1500,enemyy=400,hp=5,enemyhp=2;
随机r=新随机();
Enemy2敌人=新Enemy2(4,enemyx,enemyy,50,1,playerx,playery,3);
公共void init()
{
这个。addMouseListener(这个);
this.addKeyListener(this);
这是1400756;
buffer=createImage(this.getWidth(),this.getHeight());
bufferG=buffer.getGraphics();
main.start();
}
公共空间涂料(图g)
{
Font font1=新字体(“Bodoni MT”,1,25);
如果(pageCt==1){
bufferG.setColor(Color.black);
bufferG.fillRect(0,0140080);
缓冲设置颜色(颜色为灰色);
bufferG.fillRect(04501450350);
敌人。抽签(bufferG);
bufferG.setColor(Color.green);
如果(playerdown==true){
bufferG.fillRect(playerx,playery+15,50,35);
}
其他的
bufferG.fillRect(playerx,playery,50,50);
if(shotright==true){
缓冲填充(shotrx,shotry,25,25);
}
如果(shotleft==true){
bufferG.fillOval(shotlx,shotly,25,25);
}
}
如果(pageCt==2){
bufferG.setFont(font1);
拉丝(“你输了”,675150);
}
g、 drawImage(缓冲区,0,0,this);
}
公开募捐
{
while(true)
{
重新油漆();
尝试
{main.sleep(10);}
捕获(例外e){}
如果(pageCt==1){
如果(playerright==true){
playerx+=5;
}
如果(playerleft==true){
playerx-=5;
}
如果(跳转==真){
yChange++;
playery=playery+yChange;
如果(游戏>高度){
跳跃=假;
玩耍=身高;
}
}

如果(shotrx>0&&shotrx0&&shotlx当您创建一个Enemy2对象时,您为构造函数提供了playx和playy整数值,并将它们复制到两个新的整数playerx和playery中

整数playerx和playery不能在Enemy2类中更改(因为您没有创建代码来更改)

您可能认为它们以某种方式连接到您获取位置的播放器对象的变量,但这不是真的

相反,您可以尝试在Enemy2构造函数中传递Player对象,并使用getter方法获取Player对象的当前值,而不是传递两个整数(playerx和playery)

应该是这样的:

public Enemy2(int s, int sX,int sY,int rad, int dmg, **Player player**, int hp) {
    //constructor code here
}
public void move(){
    if (startX > player.getPlayerX() //or player.playerx if the fields are not private) {
        startX -= speed;
    } else if (startX < player.getPlayerX()) {
        startX -= speed * (-1);    
    }
}
move()方法应该如下所示:

public Enemy2(int s, int sX,int sY,int rad, int dmg, **Player player**, int hp) {
    //constructor code here
}
public void move(){
    if (startX > player.getPlayerX() //or player.playerx if the fields are not private) {
        startX -= speed;
    } else if (startX < player.getPlayerX()) {
        startX -= speed * (-1);    
    }
}
公共作废移动(){
if(startX>player.getPlayerX()//或player.playerx,如果字段不是私有的){
startX-=速度;
}else if(startX
顺便说一下,建议几乎总是将类的字段设置为private,并使用getter和setter获取或更改它们的值

只是想补充一点,这是我在堆栈溢出中的第一个答案。
希望我能帮上忙!

不要使用小程序。小程序已经死了..Applet?你真的不想学习或练习创建在今天这个时代早已过时的技术。至于你的问题,深入研究——将你的代码提炼成一个小程序,试着先分离错误。你的
敌人。move()
方法在创建时只考虑玩家的初始位置。更改
移动()
获取播放器当前X和Y坐标的方法。我意识到小程序已经死了,但我的Java老师没有,因为不学习JFrames创建窗口更容易。我想在没有小程序的情况下学习Java,但我甚至不知道从哪里开始。@JeffreyM是在2013年写的。要拿回你的钱,你不是在学习Java。而且它甚至不是一个
JApplet
(你没有秋千),所以它是双重死亡(我不得不佩服)。