使此代码更面向对象?

问题描述

| 我的朋友告诉我,我的代码不是很面向对象。我将如何使其更加面向对象和可重用? 我尝试创建一个名为level的类,该类按级别打印图像,但注意打印,因此无法正常工作。 (代码转储即将到来,对不起)
public class Main extends Applet implements Runnable,KeyListener,java.awt.event.MouseListener {
double x_pos = 300;
double y_pos = 200;
int radius = 20;
int appletsize_x = 640;
int appletsize_y = 440;
double speed = 3;
float speedModifier = 1f;
Image grass;
Image hero;
Image hero45;
Image hero90;
Image hero135;
Image hero180;
Image hero225;
Image hero270;
Image hero315;
Image sprite;
Image tree;
Image path;

private boolean leftPressed;
private boolean rightPressed;
private boolean downPressed;
private boolean upPressed;

private Image dbImage;
private Graphics dbg;

public void init() {
    Dimension dim = getMaximumSize();
    this.setSize(appletsize_x,appletsize_y);
    MediaTracker mt = new MediaTracker(this);
    tree = getImage(getCodeBase(),\"tree_64.png\");
    grass = getImage(getCodeBase(),\"grassTile.png\");
    path = getImage(getCodeBase(),\"path.png\");
    hero = getImage(getCodeBase(),\"hero.png\");
    hero45 = getImage(getCodeBase(),\"hero45.png\");
    hero90 = getImage(getCodeBase(),\"hero90.png\");
    hero135 = getImage(getCodeBase(),\"hero135.png\");
    hero180 = getImage(getCodeBase(),\"hero180.png\");
    hero225 = getImage(getCodeBase(),\"hero225.png\");
    hero270 = getImage(getCodeBase(),\"hero270.png\");
    hero315 = getImage(getCodeBase(),\"hero315.png\");
    sprite = getImage(getCodeBase(),\"hero.png\");
    mt.addImage(hero,0);
    mt.addImage(path,0);
    mt.addImage(tree,0);
    mt.addImage(grass,0);
    mt.addImage(hero45,0);
    mt.addImage(hero90,0);
    mt.addImage(hero135,0);
    mt.addImage(hero180,0);
    mt.addImage(hero225,0);
    mt.addImage(hero270,0);

    try {
        mt.waitForID(0);
    } catch (InterruptedException ie) {
    }
}

public void start() {

    this.addKeyListener(this);
    this.addMouseListener(this);
    Thread th = new Thread(this);
    th.start();
}

public void stop() {

}

public void destroy() {

}

public void run() {

    // lower ThreadPriority
    this.requestFocusInWindow();
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

    while (true) {

        if (downPressed && leftPressed) {
            double y_decr,x_incr;
            y_decr = Math.sqrt(Math.pow(speed,2)) / 1.5;
            x_incr = Math.sqrt(Math.pow(speed,2)) / 1.5;
            y_pos += y_decr;
            x_pos -= x_incr;
        } else if (downPressed && rightPressed) {
            y_pos += Math.sqrt(Math.pow(speed,2)) / 1.5;
            x_pos += Math.sqrt(Math.pow(speed,2)) / 1.5;
        } else if (upPressed && rightPressed) {
            y_pos -= Math.sqrt(Math.pow(speed,2)) / 1.5;
        } else if (upPressed && leftPressed) {
            y_pos -= Math.sqrt(Math.pow(speed,2)) / 1.5;
            x_pos -= Math.sqrt(Math.pow(speed,2)) / 1.5;
        } else {
            // Hitting (right)
            if (x_pos > this.getSize().width - radius) {

                // x_speed = -x_speed;
            }
            if (leftPressed == true) {
                x_pos -= speed * speedModifier;
            }

            if (rightPressed == true) {
                x_pos += speed * speedModifier;
            }

            if (upPressed == true) {
                y_pos -= speed * speedModifier;
            }

            if (downPressed == true) {
                y_pos += speed * speedModifier;

            }
        }

        // Hitting right

        if (x_pos > this.getSize().width - 32) {
            x_pos = this.getSize().width - 32;

        } // Hitting left
        if (x_pos < 0) {
            x_pos = 0;
        }
        // } // Hitting top
        if (y_pos < 0) {
            y_pos = 0;

        }

        // Hitting bottom
        if (y_pos > this.getSize().height - 32) {
            y_pos = this.getSize().height - 32;

        }


        repaint();

        try {
            // Stop thread for 1 milliseconds
            Thread.sleep(20);
        } catch (InterruptedException ex) {
            // do nothing
        }

        // set ThreadPriority to maximum value
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
    }
}

public void paint(Graphics g) {
    int layout = 0;
    int coll = 0;
    while (coll <= 440) {
        drawRows(layout,grass,g,coll);
        coll = coll + 32;
    }
    drawCollums(0,path,180);
    g.drawImage(tree,50,40,this);
    g.drawImage(tree,300,20,500,this);
    int x_posI = (int) x_pos;
    int y_posI = (int) y_pos;

    if (downPressed && leftPressed) {
        this.sprite = hero225;
    } else if (downPressed && rightPressed) {
        this.sprite = hero135;
    } else if (upPressed && rightPressed) {
        this.sprite = hero45;
    } else if (upPressed && leftPressed) {
        this.sprite = hero315;
    } else if (leftPressed == true) {
        this.sprite = hero270;
    } else if (rightPressed == true) {
        this.sprite = hero90;
    } else if (upPressed == true) {
        this.sprite = hero;
    } else if (downPressed == true) {
        this.sprite = hero180;
    }

    // this.sprite will contain value set on last \"movement\"
    g.drawImage(this.sprite,x_posI,y_posI,this);


}



public void update(Graphics g) {

    if (dbImage == null) {
        dbImage = createImage(this.getSize().width,this.getSize().height);
        dbg = dbImage.getGraphics();
    }

    dbg.setColor(getBackground());
    dbg.fillRect(0,this.getSize().width,this.getSize().height);

    dbg.setColor(getForeground());
    paint(dbg);

    g.drawImage(dbImage,this);
}

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        leftPressed = true;

    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        rightPressed = true;

    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        upPressed = true;
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        downPressed = true;
    }

}

@Override
public void keyReleased(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        leftPressed = false;
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

        rightPressed = false;
    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        upPressed = false;

    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        downPressed = false;
    }
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println(\"HIT!\");
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

public void drawRows(int x,Image image,Graphics g,int coll) {
    while (x <= appletsize_x) {
        g.drawImage(image,x,coll,this);
        x += 32;
    }
}

public void drawCollums(int y,int coll) {
    while (y <= appletsize_x) {
        g.drawImage(image,y,this);
        y += 32;
    }
}
}
    

解决方法

        好了,所有这些图像都应该放在一个数组中。并且它们应该包含文件名,以便您可以在一个不错的循环中加载它们。您有3页以上的复制和粘贴代码,这绝对是可怕的...如果您想更改它们加载的方式,该怎么办? 然后,
Math.sqrt(Math.pow(speed,2))
跳到我身上。那等于2英镑,大约是速度的1/200倍。 下一部分也特别有趣。我不会评论是否需要它(很可能不是,这是您的设计缺陷),但是..
        // Stop thread for 1 milliseconds
        Thread.sleep(20);
    ,        你应该问你的朋友他或她的意思。如果我猜到了,我会说您的Applet类正在做很多事情:动画循环;它是密钥处理程序;这是鼠标处理程序;这是用户界面。可以将这些对象分解为旨在一起工作的单独对象。 另一个改进可能是将四个
...Pressed
标志转换为0到7之间的整数,代表八个可能的方向。例如:
0 1 2
7   3
6 5 4
(您可以根据需要分配方向编号。)然后,您可以使用方向编号索引到图像数组中。 (这与面向对象无关,但可以简化您的代码。)     ,        我建议您阅读有关OOP的书籍和文章,在这种特殊情况下,您应该看一下MVC模式(维基百科中的MVC文章)。为了获得良好的OO概念,不应将事件(例如,ѭ6)与实际的“ graphics building”类放在同一个类中。     ,        为您的应用程序构建一个新程序包,并将所有数据结构分组。为您的英雄创建一个类,为树木和草类创建一个类。了解他们如何共享属性并创建类层次结构,也许可以使用抽象类。 这些只是一些提示,在这里为您提供面向对象的课程可能会很长;) 但是,请遵循此曲目并阅读。 另外,您应该学习如何优雅地停止线程。 您可以为侦听器使用内部类,甚至可以使用MouseAdater。 问候,  斯特凡     ,        您可能想研究该游戏,该游戏还可以使用键盘在网格上移动玩家。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...