Java中的图像分层

时间:2014-01-24 05:49:59

标签: java bluej

我是网站的新手,也是Java的新手。我正在BlueJ中为我的一个编程课程玩游戏,我们使用slowMoveVertical创建了一个绘图和日落,但我无法让我的太阳照射到#34;设置"在地平线之后......你继续看到它高于它。有没有办法改变分层,所以我可以把它变成"设置"地平线背后?这是"图片"的完整代码。类。

public class Picture
{
private Circle hill;
private Square wall;
private Square window;
private Triangle roof;
private Circle sun;

/**
 * Constructor for objects of class Picture
 */
public Picture()
{
    // nothing to do... instance variables are automatically set to null
}

/**
 * Draw this picture.
 */
public void draw()
{
    wall = new Square();
    wall.moveVertical(80);
    wall.changeSize(100);
    wall.makeVisible();

    window = new Square();
    window.changeColor("black");
    window.moveHorizontal(20);
    window.moveVertical(100);
    window.makeVisible();

    roof = new Triangle();
    roof.changeSize(50, 140);
    roof.changeColor("blue");
    roof.moveHorizontal(60);
    roof.moveVertical(70);
    roof.makeVisible();

    sun = new Circle();
    sun.changeColor("yellow");
    sun.moveHorizontal(180);
    sun.moveVertical(-10);
    sun.changeSize(60);
    sun.makeVisible();

    hill = new Circle();
    hill.changeColor("green");
    hill.moveHorizontal(-360);
    hill.moveVertical(160);
    hill.changeSize(1000);
    hill.makeVisible();

}

/**
 * Change this picture to black/white display
 */
public void setBlackAndWhite()
{
    if(wall != null)   // only if it's painted already...
    {
        wall.changeColor("black");
        window.changeColor("white");
        roof.changeColor("black");
        sun.changeColor("black");
        hill.changeColor("black");
    }
}

/**
 * Change this picture to use color display
 */
public void setColor()
{
    if(wall != null)   // only if it's painted already...
    {
        wall.changeColor("red");
        window.changeColor("black");
        roof.changeColor("blue");
        sun.changeColor("yellow");
        hill.changeColor("green");
    }
}

/**
 * Change this picture to make the sun go down
 */
public void setSunset()
{
    if(wall != null) // only if the sun is already up...
    {
        sun.slowMoveVertical(255);
    }

以下是课程的代码" Circle"。

public class Circle
{
private int diameter;
private int xPosition;
private int yPosition;
private String color;
private boolean isVisible;

/**
 * Create a new circle at default position with default color.
 */
public Circle()
{
    diameter = 30;
    xPosition = 20;
    yPosition = 60;
    color = "blue";
    isVisible = false;
}

/**
 * Make this circle visible. If it was already visible, do nothing.
 */
public void makeVisible()
{
    isVisible = true;
    draw();
}

/**
 * Make this circle invisible. If it was already invisible, do nothing.
 */
public void makeInvisible()
{
    erase();
    isVisible = false;
}

/**
 * Move the circle a few pixels to the right.
 */
public void moveRight()
{
    moveHorizontal(20);
}

/**
 * Move the circle a few pixels to the left.
 */
public void moveLeft()
{
    moveHorizontal(-20);
}

/**
 * Move the circle a few pixels up.
 */
public void moveUp()
{
    moveVertical(-20);
}

/**
 * Move the circle a few pixels down.
 */
public void moveDown()
{
    moveVertical(20);
}

/**
 * Move the circle horizontally by 'distance' pixels.
 */
public void moveHorizontal(int distance)
{
    erase();
    xPosition += distance;
    draw();
}

/**
 * Move the circle vertically by 'distance' pixels.
 */
public void moveVertical(int distance)
{
    erase();
    yPosition += distance;
    draw();
}

/**
 * Slowly move the circle horizontally by 'distance' pixels.
 */
public void slowMoveHorizontal(int distance)
{
    int delta;

    if(distance < 0) 
    {
        delta = -1;
        distance = -distance;
    }
    else 
    {
        delta = 1;
    }

    for(int i = 0; i < distance; i++)
    {
        xPosition += delta;
        draw();
    }
}

/**
 * Slowly move the circle vertically by 'distance' pixels.
 */
public void slowMoveVertical(int distance)
{
    int delta;

    if(distance < 0) 
    {
        delta = -1;
        distance = -distance;
    }
    else 
    {
        delta = 1;
    }

    for(int i = 0; i < distance; i++)
    {
        yPosition += delta;
        draw();
    }
}

/**
 * Change the size to the new size (in pixels). Size must be >= 0.
 */
public void changeSize(int newDiameter)
{
    erase();
    diameter = newDiameter;
    draw();
}

/**
 * Change the color. Valid colors are "red", "yellow", "blue", "green",
 * "magenta" and "black".
 */
public void changeColor(String newColor)
{
    color = newColor;
    draw();
}

/*
 * Draw the circle with current specifications on screen.
 */
private void draw()
{
    if(isVisible) {
        Canvas canvas = Canvas.getCanvas();
        canvas.draw(this, color, new Ellipse2D.Double(xPosition, yPosition, 
                diameter, diameter));
        canvas.wait(10);
    }
}

/*
 * Erase the circle on screen.
 */
private void erase()
{
    if(isVisible) {
        Canvas canvas = Canvas.getCanvas();
        canvas.erase(this);
    }
}

1 个答案:

答案 0 :(得分:0)

slowMoveVertical中的循环几乎锁定你在前面绘制太阳。如果您的作业允许您绕过slowMoveVertical,那么您可以手动执行它所做的循环并自己渲染太阳和山丘,以便分层正确。

for(int i = 0; i < 190; i++) {
    sun.moveHorizontal(1);
    hill.draw();
}

...编辑

在绘制调用结束时有一个wait(),它实际上只用在“批处理”中的最后一个对象上。使用可选的等待调用制作另一个绘制方法允许调用者控制它而不是圆圈。示例...

public void draw() {
    draw(true);  // retain current behavior
{

public void draw(boolean useWait) {
    if(isVisible) {
        Canvas canvas = Canvas.getCanvas();
        canvas.draw(this, color, new Ellipse2D.Double(xPosition, yPosition, 
            diameter, diameter));
        if (useWait) {
            canvas.wait(10);
        }
    }
}

现在你可以调用sun.draw(false)和hill.draw(true),它不应该闪烁(或者至少少一点)。