그래픽 API
작성자 정보
- 작성자 최고관리자
- 작성일
컨텐츠 정보
- 조회 358
본문
요구사항
초기 화면에 3개의 다른 도형이 그려지도록 구현하시오.
BouncingBox 인스턴스를 사용하여 각각의 도형이 다른 방향으로 움직이도록 할 것.
(ArrayList를 사용하여 도형들을 관리 할 것.)
초기설정
이클립스로부터 프로젝트를 생성합니다.
다음 3개의 클래스를 생성하고 주어진 소스코드를 복사하여 붙여넣습니다.
SimpleDraw
BouncingBox
DrawGraphics
프로그램을 실행해 봅니다. 정상실행이 된 경우 아래의 화면이 나오게 됩니다.
SimpleDraw.java
문제해결
Part One: Drawing Graphics
먼저 DrawGraphics 클래스를 열어줍니다. 초기 실행시 보이는 정사각형과 직선이 보이는데 이를 그려주는 메쏘드가 draw 입니다. 요구사항1에서 3개의 도형을 그려달라 했으므로 우리는 하나의 다른 도형만 추가해 주면 되겠습니다~ (초기 2개의 도형을 지우고 다른 도형으로 바꾸셔도 됩니다~ Be Creative!)
Java API에서 java.awt.Graphics를 참고하시면 직사각형, 직선, 타원, 등등 기타 여러가지 도형을 그릴 수 있는데, 저는 타원을 그려보겠습니다.
Part Two: Containers and Animation
우리가 만든 DrawGraphics클래스와 BouncingBox클래스는 애니메이션 효과를 지원합니다. DrawGraphics는 초당 20번 draw메쏘드를 호출함으로써 화면을 지속적으로 새로이 보여줍니다. BouncingBox에서는 박스의 움직임에 대한 설정을 setMovementVector메쏘드를 통해 제공합니다. 예를들면 setMovementVector(1,0)은 오른쪽방향으로 박스가 천천히 움직이고, setMovementVector(0,-2)는 위쪽으로 빠르게 움직입니다.
그럼 이제 요구사항2를 만족하기 위해 DrawGraphics클래스를 변경해봅시다. (setMovementVector()메쏘드는 DrawGraphics의 생성자에서 한번만 설정해 주면 됩니다)
BouncingBox 생성
ArrayList를 만들고, 3개의 BouncingBox 인스턴스를 추가해주었습니다.
다음으로 draw메쏘드를 통 박스를 그려주도록 하겠습니다~
BouncingBox 움직이기
DrawGraphics의 생성자에서 이동속도를 설정해 줍니다~
초기 화면에 3개의 다른 도형이 그려지도록 구현하시오.
BouncingBox 인스턴스를 사용하여 각각의 도형이 다른 방향으로 움직이도록 할 것.
(ArrayList를 사용하여 도형들을 관리 할 것.)
초기설정
이클립스로부터 프로젝트를 생성합니다.
다음 3개의 클래스를 생성하고 주어진 소스코드를 복사하여 붙여넣습니다.
SimpleDraw
BouncingBox
DrawGraphics
프로그램을 실행해 봅니다. 정상실행이 된 경우 아래의 화면이 나오게 됩니다.
SimpleDraw.java
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** Displays a window and delegates drawing to DrawGraphics. */
public class SimpleDraw extends JPanel implements Runnable {
private static final long serialVersionUID = -7469734580960165754L;
private boolean animate = true;
private final int FRAME_DELAY = 50; // 50 ms = 20 FPS
public static final int WIDTH = 300;
public static final int HEIGHT = 300;
private DrawGraphics draw;
public SimpleDraw(DrawGraphics drawer) {
this.draw = drawer;
}
/** Paint callback from Swing. Draw graphics using g. */
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Enable anti-aliasing for better looking graphics
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
draw.draw(g2);
}
/** Enables periodic repaint calls. */
public synchronized void start() {
animate = true;
}
/** Pauses animation. */
public synchronized void stop() {
animate = false;
}
private synchronized boolean animationEnabled() {
return animate;
}
public void run() {
while (true) {
if (animationEnabled()) {
repaint();
}
try {
Thread.sleep(FRAME_DELAY);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String args[]) {
final SimpleDraw content = new SimpleDraw(new DrawGraphics());
JFrame frame = new JFrame("Graphics!");
Color bgColor = Color.white;
frame.setBackground(bgColor);
content.setBackground(bgColor);
// content.setSize(WIDTH, HEIGHT);
// content.setMinimumSize(new Dimension(WIDTH, HEIGHT));
content.setPreferredSize(new Dimension(WIDTH, HEIGHT));
// frame.setSize(WIDTH, HEIGHT);
frame.setContentPane(content);
frame.setResizable(false);
frame.pack();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
public void windowDeiconified(WindowEvent e) { content.start(); }
public void windowIconified(WindowEvent e) { content.stop(); }
});
new Thread(content).start();
frame.setVisible(true);
}
}
BouncingBox.java
[code=php]
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class BouncingBox {
int x;
int y;
Color color;
int xDirection = 0;
int yDirection = 0;
final int SIZE = 20;
/**
* Initialize a new box with its center located at (startX, startY),
* filled with startColor.
*/
public BouncingBox(int startX, int startY, Color startColor) {
x = startX;
y = startY;
color = startColor;
}
/** Draws the box at its current position on to surface. */
public void draw(Graphics surface) {
// Draw the object
surface.setColor(color);
surface.fillRect(x - SIZE/2, y - SIZE/2, SIZE, SIZE);
surface.setColor(Color.BLACK);
((Graphics2D) surface).setStroke(new BasicStroke(3.0f));
surface.drawRect(x - SIZE/2, y - SIZE/2, SIZE, SIZE);
// Move the center of the object each time we draw it
x += xDirection;
y += yDirection;
// If we have hit the edge and are moving in the wrong direction, reverse direction
// We check the direction because if a box is placed near the wall, we would get "stuck"
// rather than moving in the right direction
if ((x - SIZE/2 <= 0 && xDirection < 0) ||
(x + SIZE/2 >= SimpleDraw.WIDTH && xDirection > 0)) {
xDirection = -xDirection;
}
if ((y - SIZE/2 <= 0 && yDirection < 0) ||
(y + SIZE/2 >= SimpleDraw.HEIGHT && yDirection > 0)) {
yDirection = -yDirection;
}
}
public void setMovementVector(int xIncrement, int yIncrement) {
xDirection = xIncrement;
yDirection = yIncrement;
}
}
DrawGraphics.java
[code=php]
import java.awt.Color;
import java.awt.Graphics;
public class DrawGraphics {
BouncingBox box;
/** Initializes this class for drawing. */
public DrawGraphics() {
box = new BouncingBox(200, 50, Color.RED);
}
/** Draw the contents of the window on surface. Called 20 times per second. */
public void draw(Graphics surface) {
surface.drawLine(50, 50, 250, 250);
box.draw(surface);
}
}
문제해결
Part One: Drawing Graphics
먼저 DrawGraphics 클래스를 열어줍니다. 초기 실행시 보이는 정사각형과 직선이 보이는데 이를 그려주는 메쏘드가 draw 입니다. 요구사항1에서 3개의 도형을 그려달라 했으므로 우리는 하나의 다른 도형만 추가해 주면 되겠습니다~ (초기 2개의 도형을 지우고 다른 도형으로 바꾸셔도 됩니다~ Be Creative!)
Java API에서 java.awt.Graphics를 참고하시면 직사각형, 직선, 타원, 등등 기타 여러가지 도형을 그릴 수 있는데, 저는 타원을 그려보겠습니다.
public void draw(Graphics surface) {
surface.drawLine(50, 50, 250, 250);
box.draw(surface);
surface.drawOval(100, 100, 100, 200);
}
Part Two: Containers and Animation
우리가 만든 DrawGraphics클래스와 BouncingBox클래스는 애니메이션 효과를 지원합니다. DrawGraphics는 초당 20번 draw메쏘드를 호출함으로써 화면을 지속적으로 새로이 보여줍니다. BouncingBox에서는 박스의 움직임에 대한 설정을 setMovementVector메쏘드를 통해 제공합니다. 예를들면 setMovementVector(1,0)은 오른쪽방향으로 박스가 천천히 움직이고, setMovementVector(0,-2)는 위쪽으로 빠르게 움직입니다.
그럼 이제 요구사항2를 만족하기 위해 DrawGraphics클래스를 변경해봅시다. (setMovementVector()메쏘드는 DrawGraphics의 생성자에서 한번만 설정해 주면 됩니다)
BouncingBox 생성
ArrayList를 만들고, 3개의 BouncingBox 인스턴스를 추가해주었습니다.
public class DrawGraphics {
ArrayList<BouncingBox> boxes;
public DrawGraphics() {
boxes = new ArrayList<BouncingBox>();
// BouncingBox 생성자의 전달인자는 박스의 x, y 좌표와 색상입니다.
BouncingBox boxA = new BouncingBox(200, 50, Color.RED);
BouncingBox boxB = new BouncingBox(150, 50, Color.GREEN);
BouncingBox boxC = new BouncingBox(100, 50, Color.BLUE);
boxes.add(boxA);
boxes.add(boxB);
boxes.add(boxC);
}
...
}
다음으로 draw메쏘드를 통 박스를 그려주도록 하겠습니다~
public class DrawGraphics {
...
public void draw(Graphics surface) {
surface.drawLine(50, 50, 250, 250);
surface.drawOval(100, 100, 100, 150);
for(BouncingBox box : boxes) {
box.draw(surface);
}
}
}
BouncingBox 움직이기
DrawGraphics의 생성자에서 이동속도를 설정해 줍니다~
public DrawGraphics() {
boxes = new ArrayList<BouncingBox>();
BouncingBox boxA = new BouncingBox(200, 50, Color.RED);
BouncingBox boxB = new BouncingBox(150, 50, Color.GREEN);
BouncingBox boxC = new BouncingBox(100, 50, Color.BLUE);
boxA.setMovementVector(1, 2);
boxB.setMovementVector(4, 3);
boxC.setMovementVector(4, 3);
boxes.add(boxA);
boxes.add(boxB);
boxes.add(boxC);
}
관련자료
-
이전
-
다음
댓글 0개
등록된 댓글이 없습니다.