두서없는 공부 노트/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();

				}

			}

		}

	}

}
반응형