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(200100);
        
        //게임판 초기화
        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(00,  // 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
    {
        
    }
    

cs


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

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