Java Swing(Game1)

김호성👨🏽‍💻·2021년 10월 12일
1

Java

목록 보기
1/1
post-thumbnail
  • 박스의 객체를 쓰레드를 사용하여 계속하여 움직여줌
  • 박스, 사람의 객체를 만들어 크기 지정- 키 이벤트를 통하여 사람 움직임

Result

Code

	public GameScreen() throws InterruptedException {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(300,500);
		setTitle("박스피하기");
		setLocationRelativeTo(null);
		gamePanel = new JPanel();
		gamePanel.setLayout(null);
		player = new Man();
		score = new Score();
		gamePanel.add(player);
		gamePanel.add(score);
		add(gamePanel);
		addKeyListener(this);
		setVisible(true);
		
		while(nowplay)
		{
			Bomb bomb = new Bomb();
			Thread newthread = new Thread(bomb);
			gamePanel.add(bomb);
			newthread.start();			
			Thread.sleep(1000);
		}
		gameOver();
	}
	

기본적으로 Jframe을 이용하여 게임의 판을 만들고 nowplay(게임의 상태를 통해) 박스 객체를 쓰레드를 통해 시작시킴 이때 박스의 생성 시간은 Thread.sleep(1000); 1초로 지정

	//개임종료
	public static void gameOver()
	{
		JLabel over = new JLabel("Game Over");
		over.setSize(200, 40);
		over.setLocation(110,200);
		gamePanel.add(over);
		gamePanel.repaint();
	}

게임 종료시 Jlable을 통해 게임의 종료를 나타냄

class Bomb extends JLabel implements Runnable{
		int Image_w=18;
		int Image_h=18;
		Bomb()
		{
			super(new ImageIcon(".\\res\\images\\box.png"));
			int x = (int)(Math.random()*(gamePanel.getWidth()-20));
			setLocation(x,0);
			setSize(Image_w,Image_h);
		}
		public void run() {
			try {
				while(GameScreen.nowplay){
					Thread.sleep(100);
					Point now = getLocation();
					now.y+=10;
					if(now.y>=(gamePanel.getHeight()+10))
					{GameScreen.score.upScore(10);break;}
					setLocation(now);
					Point playerL=GameScreen.player.getLocation();
					Point bombL=getLocation();
					int bombLeft=bombL.x;
					int bombRight=bombL.x+Image_w;
					int bombTop=bombL.y;
					int bombBottom=bombL.y+Image_h;
					int playerLeft=playerL.x;
					int playerRight=playerL.x+GameScreen.player.Image_w-2;
					int playerTop=playerL.y;
					int playerBottom=playerL.y+GameScreen.player.Image_h-2;
					boolean collision = true;
					if(bombRight<playerLeft)
						collision=false;
					else if(bombLeft>playerRight)
						collision=false;
					else if(bombBottom<playerTop)
						collision=false;
					else if(bombTop>playerBottom)
						collision=false;
					if(collision==true){
						System.out.println("충돌");
						GameScreen.nowplay=false;
					}
				}
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		public void paintComponent(Graphics g)
		{
			super.paintComponent(g);
		}		
	}

해당 코드는 박스의 객체 생성 가로 새로 18로 지정한 이유는 아래와 같이 18픽셀로 되어 있기 때문입니다.
중요 포인트는 랜덤값을 이용하여 X(가로) 위치에 박스를 생성한뒤 플레이어 객체의 위치와 같아지기 전까지 박스의 Y(세로축을) 계속하여 더해줌으로써 박스를 아래로 이동시킴

	//사람 객체
	class Man extends JLabel
	{
		int Image_w=26;
		int Image_h=56;
		Man()
		{
			super(new ImageIcon(".\\res\\images\\man2.png"));
			setLocation(0,400);
			setSize(Image_w,Image_h);
		}
		public void moveLeft()
		{
			Point now = getLocation();			
			if(now.x>0)
				setLocation(now.x-5,now.y);
		}
		public void moveRight()
		{
			Point now = getLocation();
			if(now.x<(GameScreen.gamePanel.getWidth()-(Image_w)))
				setLocation(now.x+5,now.y);
		}
	}
    	//키 이벤트
	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		switch(arg0.getKeyCode()){
		case KeyEvent.VK_LEFT: //왼쪽 키
			player.moveLeft();
			break;
		case KeyEvent.VK_RIGHT: //오른쪽 방향키
			player.moveRight();
			break;	
		}
	}

사람 객체의 방향키를 통하여 5씩 이동시킴 키이벤트 오바라이딩을 통하여 이벤트 활성화

	//점수판
	class Score extends JLabel
	{
		Score()
		{
			super("000");
			setLocation(250,20);
			setSize(28,10);
		}
		public void upScore(int score)
		{
			int now = Integer.parseInt(getText());
			now+=score;
			setText(Integer.toString(now));
		}
	}

점수는 위의 박스 객체의 RUN() 메소드에서 해당 사람 객체를 지나치면 10 씩 더해줌

0개의 댓글