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