2014-01-24 5 views
0

Я новичок на сайте, а также на Java. Я играю в BlueJ для одного из моих классов программирования, и мы создали рисунок и закат с использованием slowMoveVertical, но я не могу заставить солнце «заходить» за горизонт ... вы продолжаете видеть, что он установлен над ним , Есть ли способ изменить слои, чтобы я мог заставить его «зайти» за горизонт? Вот весь код для класса «Картинка».Наложение изображений в Java

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); 
    } 

А вот код для класса "Круг".

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

Вы должны опубликовать [** Минимальный, полный, испытанный и читаемый пример **] (http://stackoverflow.com/help/mcve) для лучшей помощи раньше. Трудно понять, что происходит с вашим кодом, и не запускать что-то. –

+0

@peeskillet Я добавил весь код для класса «Изображение». – asterlune

+0

@ user3230734 введите код Circle() – Aarav

ответ

0

Петля в slowMoveVertical довольно много замков вы в рисунке солнце спереди. Если ваше задание позволяет обойти slowMoveVertical, то вы можете вручную сделать цикл, который он делает, и сделать свое солнце и холм самостоятельно, чтобы расслоение было правильным.

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

редактировать ...

Там есть ожидание() в конце вызова отрисовки, который действительно можно использовать только на последнем объекте в «пакете». Создание другого метода рисования с дополнительным вызовом ожидания позволяет вызывающему пользователю управлять им, а не кругом. пример ...

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 (ложь) и hill.draw (истина), и он не должен мерцать (или по крайней мере, гораздо меньше).

+0

Вы столкнетесь с аналогичной проблемой, потому что вызовы draw() имеют вызовы wait() в конце. Это заставит ваше солнце мерцать перед холмом, поэтому вам придется переписать код рисования, чтобы он выглядел хорошо. –

+0

Когда я иду, чтобы скомпилировать код после того, как я изменил его на предлагаемое редактирование, он сообщает мне, что draw() имеет частный доступ в Circle. Смогу ли я исправить это, изменив его с «private void draw()» на «public void draw()»? – asterlune

+0

Да. Если вам разрешено редактировать этот код, вы можете сделать его приватным и, возможно, исправить вызов ожидания (сделайте его необязательным и вызовите его только для «холма»). –

Смежные вопросы