IT/문제
[구현]똥 피하기
Beautifulkim
2018. 5. 18. 17:05
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | package mymain; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; // awt -> 확장 -> swing // Frame JFrame public class MyMain_Dung extends JFrame { JPanel gamePan; ExplosionManager explosionManager = new ExplosionManager(); DDongManager dDongManager = new DDongManager(explosionManager); public MyMain_Dung() { super("똥피하기"); //위치 this.setLocation(200, 100); //게임판 초기화 init_gamepan(); //타이머 초기화 init_timer(); //마우스 이벤트 초기화 init_mouse_event(); //DDong dDong = new DDong(); DDong.java에서 똥 가로 값 나오는지 확인하기위함 //크기변경 불가 setResizable(false); pack(); //보여줘라 this.setVisible(true); //종료코드 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //마우스 이벤트 초기화 private void init_mouse_event() { // TODO Auto-generated method stub MouseAdapter adapter = new MouseAdapter() { //마우스 눌렀을 때 @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub //여기서 터트려라 explosionManager.make_explosion(e.getX(), e.getY()); } }; gamePan.addMouseListener(adapter); } //타이머 초기화 private void init_timer() { // TODO 자동 생성된 메소드 스텁 // 익명클래스로 재정의 // 버튼, 타이머, 메뉴가 엑션리스터 사용할 예정 ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 자동 생성된 메소드 스텁 // //좌표이동 출력대상 변경작업 Process(); //다시그려라 : repaint();가 Invalid(무효화)영역을 갱신해라 //Rectangle rect = new Rectangle(0,0,100,100);//0,0부터 100px, 100px만 그림 //gamePan.repaint(rect); rect 영역만 다시그려라 gamePan.repaint();//결과적으로 호출하는것(gamePan paintComponent()간접호출) } }; //임포트 잘못사용하면 타이머를 각각 맞춰서 해줘야함 //10 : 0.001간격으로 listener 호출 Timer timer = new Timer(10, listener); timer.start(); } //좌표이동 출력대상 변경작업 protected void Process() { // TODO 자동 생성된 메소드 스텁 //똥생성 dDongManager.make_ddong(); //똥이동 dDongManager.move(); //폭발이미지 인덱스 증가 explosionManager.move(); } //게임판 초기화 메소드 private void init_gamepan() { // TODO 자동 생성된 메소드 스텁 //게임판에 그려야하기 때문에 익명클래스로 재정의 gamePan = new JPanel() { //게임판에 똥을 그려야하기 때문에 재정의 @Override protected void paintComponent(Graphics g) { // TODO 자동 생성된 메소드 스텁 //화면지우기(흰색화면나옴) //판을 지우기 위해 g.clearRect(0, 0, // x,y MyConst.GamePan.GAMEPAN_W, //width MyConst.GamePan.GAMEPAN_H); //height //똥그리기 dDongManager.draw(g); //폭발그리기 explosionManager.draw(g); } }; //Dimension : 폭과 높이 관리하는 것 gamePan.setPreferredSize( new Dimension ( MyConst.GamePan.GAMEPAN_W, MyConst.GamePan.GAMEPAN_H ) ); this.add(gamePan); } public static void main(String[] args) { new MyMain_Dung(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package mymain; //MyConst.GamePan.GAMEPAN_W 으로 사용 //static은 객체생성 안하고 사용 가능 public class MyConst { //상수 카테고리화 시킴(분류하기 위해 아래처럼 정의) public static class GamePan { public static final int GAMEPAN_W = 400; public static final int GAMEPAN_H = 600; } public static class Key { } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package mymain; import java.awt.Image; import javax.swing.ImageIcon; //MyImages.img_ddong; 이런식으로 호출 public class MyImages { public static Image img_ddong; public static Image img_me; public static Image [] img_exp = new Image[27]; static { img_ddong = new ImageIcon("ddong2.png").getImage(); // img_ddong = new ImageIcon("money.png").getImage(); img_me = new ImageIcon("bate.gif").getImage(); for(int i =0; i<img_exp.length; i++)// i=0 ~ 26 { String filename = String.format("image_exp/exp_%02d.png", i+1); img_exp[i] = new ImageIcon(filename).getImage(); } } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package mymain; import java.awt.Graphics; import java.awt.Rectangle; //똥 아이템(위치, 크기, 행위(움직임), 그리기) public abstract class Item { //위치 + 크기 public Rectangle pos = new Rectangle(); //행위속성 public abstract boolean move(); //Graphics g 그릴라면 필요함 public abstract void draw(Graphics g); } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package mymain; import java.awt.Graphics; //똥 자신 한 개를 표현 public class DDong extends Item { public DDong() { // TODO Auto-generated constructor stub //똥이미지를 MyImages.java에서 가져와서 네모(rectangle)의 가로 값에 저장
//똥이미지를 MyImages.java에서 가져와서 네모(rectangle)의 세로 값에 저장 pos.width = MyImages.img_ddong.getWidth(null); pos.height = MyImages.img_ddong.getHeight(null); //System.out.println(pos.width); } public int speed;//이동속도 //똥이 움직이는 메소드 @Override public boolean move() { // TODO Auto-generated method stub //이동한 결과 //pos.t = pos.y + speed; pos.y += speed; //게임판 높이보다 똥의 높이가 작냐? 즉 화면 안에 있냐? return (pos.y <= MyConst.GamePan.GAMEPAN_H); } //똥을 그리는 메서드(자기 자신이 자신을 그림) @Override public void draw(Graphics g) { // TODO Auto-generated method stub g.drawImage(MyImages.img_ddong,pos.x,pos.y,null); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | package mymain; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; import java.util.Random; // 똥 관리(움직임 및 그리기 화면에서 없어지기) public class DDongManager { //final을 삭제할경우 변수처리가 가능함... //20번에 한번씩 만듬 public static final int DDONG_MAKE_INTERVAL=20; /* 똥을 생성헀다가 똥을 없애야하니까 자동으로 생성 및 삭제를 하기위한 ArrayList를 사용 */ public List<DDong> ddong_list = new ArrayList<DDong>(); Random rand = new Random(); int ddong_make_interval = DDONG_MAKE_INTERVAL; ExplosionManager explosionManager; public DDongManager(ExplosionManager explosionManager) { // TODO Auto-generated constructor stub explosionManager = explosionManager; } // 똥만드는 메소드(난이도 있음 이 메소드) public void make_ddong() { //초당 5개 생성 if(ddong_make_interval == DDONG_MAKE_INTERVAL) { DDong dDong = new DDong(); //똥생성 dDong.pos.y = -dDong.pos.height;// 똥이미지 크기에 -를 붙임 //dDong.pos.width/2는 화면에서 안보이는 경우를 대비해 반은 보여주게 설정 dDong.pos.x = rand.nextInt(MyConst.GamePan.GAMEPAN_W) - dDong.pos.width/2;//0 ~ 399 dDong.speed = rand.nextInt(3) + 3; // 3~5 //생성된 DDong를 리스트에 추가 ddong_list.add(dDong); } ddong_make_interval--; if(ddong_make_interval<0) ddong_make_interval = DDONG_MAKE_INTERVAL; } // 똥 움직이기(똥 사이즈만큼 가지고 있음 배열이) public void move() { for (int i = 0; i < ddong_list.size(); i++) { DDong dDong = ddong_list.get(i); //개선루푸돌려도 상관없음 //화면 밖으로 벗어난 경우 if(dDong.move()==false) { ddong_list.remove(i); } } } // 똥 그리기 public void draw(Graphics g) { for (int i = 0; i < ddong_list.size(); i++) { DDong dDong = ddong_list.get(i); dDong.draw(g); } } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package mymain; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; public class ExplosionManager { public List<Explosion> explosion_list = new ArrayList<Explosion>(); public void make_explosion(int x,int y) { Explosion exp = new Explosion(); // 폭발위치 중앙에서 그려지겠끔 좌표 보정함 exp.pos.x = x - MyImages.img_exp[0].getWidth(null)/2; exp.pos.y = y - MyImages.img_exp[0].getHeight(null)/2; explosion_list.add(exp); } public void move() { for(int i=0;i<explosion_list.size();i++) { Explosion exp = explosion_list.get(i); if(exp.move()==false) {//이미지 첨자범위 벗어났으면 explosion_list.remove(i); } } } public void draw(Graphics g) { for(Explosion exp: explosion_list) { exp.draw(g); } } } /* 똥이 어떻게 만들어지고 어떻게 움직이고 먼저 파악 */ | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package mymain; import java.awt.Graphics; //아이템 public class Explosion extends Item { public static int INDEX_INTERVAL=2; int index;//이미지 첨자관련 자료형 int index_interval=INDEX_INTERVAL; @Override public boolean move() { // TODO Auto-generated method stub if(index_interval==2) { index++; } index_interval--; if(index_interval<0) index_interval=INDEX_INTERVAL; // 이동된 인덱스가 이미지 첨자범위내에 있냐? return (index < MyImages.img_exp.length); } @Override public void draw(Graphics g) { // TODO Auto-generated method stub g.drawImage(MyImages.img_exp[index], pos.x, pos.y, null); } } | cs |