[TIL] 다차원 배열, 시각화를 위한 그래픽 플랫폼

1) 다차원 배열 vs 구조체 일차원 배열

1-1) 톱니형이란?

  • 이차원 배열은 일차원 배열에 차원 하나를 더 추가하는 방식이다.

  • 각각의 공간을 엮어내는 방식이다.

  • 임시 공간을 만들어내어 순서를 바꾸는 것이 가능하다.

  • int[][] lottos = new int[3][6]처럼 일차원 공간을 한번에 만들 수 있다.

  • int[][] lottos = new int[3][]처럼 일차원 공간은 나중에 만들 수도 있다.

  • 일차원 공간을 나중에 만들 때에는 각 공간의 크기를 다르게 할 수 있으며 이를 톱니형이라고 한다.

1-2) 다차원 배열과 구조체 일차원 배열

  • int[][] lottos= new int[3][6];과 같은 방식은 추후 복잡해질 가능성이 있다.
  • 그래서 번거롭더라도 Lotto[] lottos = new Lotto[3]; 과 같은 방식이 더 낫다.

2) 시각화를 위한 그래픽 플랫폼

2-1) Frame에 Canvas를 나중에 붙인 경우


package ex8.game.basic1;

import java.awt.Canvas;

public class Program {

	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
        frame.setBounds(300,10,500,300);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
        
        GameCanvas canvas = new GameCanvas();
		frame.add(canvas);
		canvas.setVisible(true);
	}
}

  • 위 코드에서는 그림을 그려도 제대로 나오지 않는다.

  • 왜냐하면 Canvas는 paint라는 함수를 갖는데 paint라는 함수에 들어가 있지 않은 로직은 무조건 지워진다.

  • paint가 활성화 될때마다 지워지므로 밖에서 그리는 것은 아무 의미가 없게된다.

  • 그래서 위의 코드를 아래와 같이 바꿔준다.

2-2) Frame에 Canvas를 먼저 붙인 경우


package ex8.game.basic1;

import java.awt.Canvas;

public class Program {

	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		GameCanvas canvas = new GameCanvas();
		
		frame.add(canvas);
		
		frame.setBounds(300,10,500,300);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		canvas.setVisible(true);
	}
}

  • 이 코드처럼 frame에 canvas를 붙이는 작업을 먼저 해준 후 그림을 그린다.

  • JFrame으로 frame을 생성해준다.

  • GameCanvas를 위해 GameCanvas.java를 만들어주고 canvas를 생성해준다.

  • frame.add(canvas);를 통해 캔버스를 프레임에 붙여준다.

  • frame.setBounds(x,y,width,height);로 프레임의 좌표와 크기를 지정해준다.

  • frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);을 통해 윈도우를 닫아주면 작업도 중지되도록 해준다.

2-3) GameCavnas 클래스


package ex8.game.basic1;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;


public class GameCanvas extends Canvas{
	
	Image img;
	
	int dx = 0;
	int dy = 0;
	
	public GameCanvas() {
		Toolkit tk = Toolkit.getDefaultToolkit();
		img = tk.getImage("res/img/img.jpg");
	}

  • AWT(Abstract Window Toolkit)는 Window 프로그래밍을 하기 위한 GUI의 도구이다.

  • Toolkit tk = Toolkit.getDefaultToolkit();은 시스템의 Default Toolkit 객체로 리턴한다.

  • img = tk.getImage("res/img/img.jpg");로 저장된 경로에서 이미지를 불러온다.



	@Override
	public boolean mouseDown(Event evt, int x, int y) {
		if(x>=0 && x<=200 && y>=0 && y<=200) {
			dx=150;
			dy=150;
			repaint();
		}
		return true;
	}

  • public boolean mouseDown(Event evt, int x, int y)는 지정한 x,y의 위치를 클릭 시, 그 아래 코드를 동작하게 한다.

  • repaint();을 통해 다시 그림을 그린다.

2-4) 다양한 Graphics g 메소드


	
	@Override
	public void paint(Graphics g) {
		
//	TODO Auto-generated method stub

	g.drawLine(10, 10, 100, 100);
        // (10,10)에서 (100,100)으로 이어지는 직선
        
        g.drawOval(100, 100, 150, 100);
        // (100,100)을 왼쪽 위의 끝으로 하는 너비 150, 높이 100의 원
        // 원의 안쪽을 채우고 싶으면 g.fillOval을 쓰면 된다.
		
	g.drawImage(img,0,0,this);
        //img를 (0,0)에 그린다.
        
	g.drawImage(img,0,0,300,300,this);
	//img를 (0,0)에 width 300, height 300으로 그린다.
        
	g.drawImage(img,		// img를
		200,200,400,400, 	// 시점 (200,200) 종점을 (400,400)에 그리는데
		200,0,400,200,		// 시점 (200,0),종점 (400,200) 지점을 그린다.
		this);
                
               
                
                
      	 g.drawImage(img,
		dx,dy,200,200+dy,
		200,200,400,400,
		this);
        //이와같이 변수를 이용할 수도 있다.
		
		
	//super.paint(g);
	
		
	}
}

  • Frame에 Canvas, Button, TestBox 등등...이 붙어있는 모양이다.

좋은 웹페이지 즐겨찾기