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