JAVA

랜덤으로 공 튀기기_AWT

장꾸꾸 2020. 9. 3. 14:44

출력결과

 

Main class

package main;

import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener; //캔버스에서 사용자 키보드 입력 받게

public class Main {

	public static void main(String[] args) {
		// TODO 객체지향적 설계가 포인트! 볼 클래스를 따로 만들어주자
		new Control().init();
	}

}

 

Control class

package main;

import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class Control {

	public void init() {
		Frame frame = new Frame("1st AWT");
		setLayout(frame);
		frame.setLayout(null);
		
		MyCanvas can = new MyCanvas();
		can.setSize(500,400);
		can.setLocation(100, 70);
		can.addKeyListener(new KeyListener() { //잘못 써진게 아니라  이 안에 밑에 애들이 오버라이딩됨
			
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) { // 프레임에서 키가 눌려지면 작동하도록
				// TODO Auto-generated method stub
//				System.out.println("P: " + e.getKeyCode()); //눌린 키의 키값을 보여줌
				switch(e.getKeyCode()) { //이 키가 눌리면 작동하세요
				case 32: //스페이스바)
					can.addBall(); //객체can이 addBall 기능하도록
					break; //키 눌림이 끝나면 멈춤
				}
			}
		});
		
		frame.add(can);
		frame.setVisible(true); //보여주기
		
		}
		
		private void setLayout(Frame frame) {
			int frwidth = 700; //프레임 사이즈
			int frheight = 500;
			Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();
			System.out.println(scr.width + ":" + scr.height);//모니터해상도
			int posX = scr.width/2 - (frwidth/2); //화면 중앙에 위치시키기
			int posY = scr.height/2 - (frheight/2);
			frame.setLocation(posX, posY); //프레임 위치
			frame.setSize(frwidth, frheight); //프레임 크기
			frame.setResizable(false); //프레임 크기 조정 가능여부
			
			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
					
				}
				
				@Override
				public void windowClosed(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void windowActivated(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}				
			});		
	}
}

MyCanvas class

package main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Paint;
import java.util.ArrayList;
import java.util.Random;

import model.Ball; //모델 패키지에서 Ball 가져옴

public class MyCanvas extends Canvas { //자바의 캔버스 클래스 상속받음
	ArrayList<Ball> ballArr = new ArrayList<Ball>(); //Ball클래스 넣을 어레이생성
//	Ball ball; 
	
	MyThread th = null; //스레드 가져옴
	
	public MyCanvas() {
//		ball = new Ball(100, 100, 3, 3, 50, Color,white); 
		th = new MyThread();
		th.start();
	}
	public void addBall() { //엔터누르면 ball추가되는 메소드
		Random rd = new Random();
		ballArr.add(new Ball(rd.nextInt(300)+100, 
					rd.nextInt(200)+50, rd.nextInt(7)+2, rd.nextInt(7)+2,
					(rd.nextInt(5)+1)*10, Color.white));
	}
	
	Image bufferImage; // 매끄럽게 보여지도록
	Graphics buffg;
	
	@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(Color.blue);
		buffg.fillRect(0, 0, getWidth(), getHeight());

		for (int i = 0; i < ballArr.size(); i++) {
			Ball ball = ballArr.get(i);
			buffg.setColor(ball.getColor());
			buffg.fillOval(ball.getPosX(), ball.getPosY(), ball.getSize(), ball.getSize());
		}

		g.drawImage(bufferImage, 0, 0, this); // 버퍼에 있는 것 그려주기
	}
//	int speedX = 5;
//	int speedY = 5;
//	int posX = 200;
//	int posY = 120;
	class MyThread extends Thread {
		@Override
		public void run() {
			while (true) {
				for (int i = 0; i < ballArr.size(); i ++) {
					Ball ball = ballArr.get(i); //이건 Ball 어레이
					ball.move();// Ball 어레이에서 생성된  ball객체보고 move 메소드 가져옴
//					ball.setPosX(ball.getPosX()+ball.getSpeedX());
////				ball.setPosY(ball.getPosY()+ball.getSpeedY());
					
					if (ball.getPosX() > getWidth() - ball.getSize() || ball.getPosX() < 0) {
						ball.setSpeedX(ball.getSpeedX() * -1);
					}
					if (ball.getPosY() > getHeight() - ball.getSize() || ball.getPosY() < 0) {
						ball.setSpeedY(ball.getSpeedY() * -1);
					}
				}
				repaint();

				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
}

Ball class

package model;

import java.awt.Color;

public class Ball {//객체지향적 설계 위해 ball클래스를 따로 만들어줌
	//Ball이 가진 정보 나열
	private int posX;
	private int posY;
	private int speedX;
	private int speedY;
	private int size;
	private Color color;
	
	//다른 클래스에서 정보 읽어올 수 있게 public 붙여줌	 (Generate source해주면 됨)
	public Ball(int posX, int posY, int speedX, int speedY, int size, Color color) {
		this.posX = posX;
		this.posY = posY;
		this.speedX = speedX;
		this.speedY = speedY;
		this.size = size;
		this.color = color;
	}
	//Ball의 움직임 나열
	public void move() {
		posX += speedX;
		posY += speedY;
	}
	public void setPosX(int posX) { //파라메터로 던져줄 정보는 posX
		this.posX = posX;			//set은 값 설정(파라메타 필요)하는 행위 void ㅇㅇ
	}								//get은 읽어오기만 하니까 voidX
	public void setPosY(int posY) {
		this.posY = posY;
	}
	public int getSpeedX() {
		return speedX;
	}
	public void setSpeedX(int speedX) {
		this.speedX = speedX;
	}
	public int getSpeedY() {
		return speedY;
	}
	public void setSpeedY(int speedY) {
		this.speedY = speedY;
	}
	public int getPosX() {
		return posX;
	}

	public int getPosY() {
		return posY;
	}

	public int getSize() {
		return size;
	}

	public Color getColor() {
		return color;
	}
	
	
}