두서없는 공부 노트/JAVA
Day 15 - frame을 더 응용해서 , 공을 여러개 돌려보기
kkm8257
2020. 9. 3. 19:56
반응형
package frame_Random_ball__Multi_ball;
import java.awt.Color;
public class Ball {
private int posX ;
private int posY ;
private int speedX ;
private int speedY ;
private int size;
private Color color;
public Ball(int posX, int posY, int speedX, int speedY, int size, Color color) {
super();
this.posX = posX;
this.posY = posY;
this.speedX = speedX;
this.speedY = speedY;
this.size = size;
this.color = color;
}
public void setPosX(int posX) {
this.posX = posX;
}
public void setPosY(int posY) {
this.posY = posY;
}
public int getPosX() {
return posX;
}
public void setSpeedX(int speedX) {
this.speedX = speedX;
}
public void setSpeedY(int speedY) {
this.speedY = speedY;
}
public int getPosY() {
return posY;
}
public int getSpeedX() {
return speedX;
}
public int getSpeedY() {
return speedY;
}
public int getSize() {
return size;
}
public Color getColor() {
return color;
}
public void move() {
//객체지향에서 움직임은 메소드로 만들고
//필드는 생성자로
posX+=speedX;
posY+=speedY;
}
}
package frame_Random_ball__Multi_ball;
public class Main {
public static void main(String[] args) {
//원이 왓다리갔다리 쓰레드 활용
Control ct= new Control();
}
}
package frame_Random_ball__Multi_ball;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class Control {
public Control() {
Frame fr=new Frame();
setLayout(fr);
MyCanvas cv = new MyCanvas(100,100);
cv.setSize(600,600);
cv.setLocation(0,0);
fr.add(cv);
fr.setVisible(true);
}
public void setLayout(Frame frame) {
//중앙에 위치
Dimension res = Toolkit.getDefaultToolkit().getScreenSize();
System.out.println("해상도 : " + res.width + " x " + res.height);
int frame_width = 600;
int frame_height = 600;
frame.setSize(frame_width, frame_height);
frame.setLocation(res.width / 2 - frame_width / 2, res.height / 2 - frame_height / 2);
frame.setLayout(null);
//
frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
}
}
package frame_Random_ball__Multi_ball;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.ArrayList;
public class MyCanvas extends Canvas {
Image bufferImage;
Graphics buffg;
// 객체 지향적으로 재설계
MoveLeftRight th1;
// Ball ball;
ArrayList<Ball> ball_box = new ArrayList<>();
public MyCanvas(int posX, int posY) {
//랜덤변수나 혹은 공을 추가하는 부분을 메소드로 만둘어 추가가능
ball_box.add(new Ball(100, 100, 5, 8, 50, Color.BLACK));
ball_box.add(new Ball(100, 50, 12, 5, 50, Color.BLACK));
ball_box.add(new Ball(100, 50, 4, 10, 50, Color.BLACK));
ball_box.add(new Ball(100, 50, 6, 13, 50, Color.BLACK));
ball_box.add(new Ball(100, 50, 15, 11, 50, Color.BLACK));
// ball=new Ball(100,100,5,8,50,Color.BLACK);
th1 = new MoveLeftRight();
th1.start();
}
@Override
public void paint(Graphics g) {
if (buffg == null) {
bufferImage = createImage(getWidth(), getHeight());
if (bufferImage == null)
System.out.println("생성 실패");
else
buffg = bufferImage.getGraphics();
}
}
@Override
public void update(Graphics g) {
buffg.drawImage(bufferImage, 0, 0, this);// 버퍼세팅
//
buffg.setColor(new Color(41, 128, 185));
buffg.fillRect(0, 0, getWidth(), getHeight());
//
for (int i = 0; i < ball_box.size(); i++) {
buffg.setColor(Color.red);
buffg.fillOval(ball_box.get(i).getPosX(), ball_box.get(i).getPosY(), ball_box.get(i).getSize(), ball_box.get(i).getSize());
}
g.drawImage(bufferImage, 0, 0, this); // 버퍼에있는거 그려주기
} // 43번쨰 줄부터 52번쨰줄은 껌뻑거림을 없애기위한 코드 , 이해할 필요는 없고 buffg 변수 뒤에 세팅값은
// 기존의 canvas 그리듯 사용하면 됨. 실제로 깜빡거림 방지는 요즘 기술에는 구현되어있어서 굳이 깊게 안봐도댐
class MoveLeftRight extends Thread {
// 좌우 왓다리 갔다리 , 숫자는 프레임창의 크기 값 - 동그라미크기(50) 을 뺴준값
@Override
public void run() {
while (true) {
for (int i = 0; i < ball_box.size(); i++) {
ball_box.get(i).move();
if (ball_box.get(i).getPosX() > getWidth() - 50 || ball_box.get(i).getPosX() < 0) {
ball_box.get(i).setSpeedX(ball_box.get(i).getSpeedX() * -1);
}
if (ball_box.get(i).getPosY() > getHeight() - 50 || ball_box.get(i).getPosY() < 0) {
ball_box.get(i).setSpeedY(ball_box.get(i).getSpeedY() * -1);
}
try {
Thread.sleep(5);
} catch (Exception e) {
System.out.println(e);
}
repaint();
}
}
}
}
}
반응형