반응형
경일게임아카데미 프로그래밍반 28기 11일차 수업 (2021. 04. 22)
맵
맵은 STL의 트리구조로서 연관 컨테이너 종류 중 하나이다.
first와 second 인자 2개를 가지고 있다.
MapTest.h 파일
#pragma once
#include <iostream>
#include <map>
using namespace std;
// 다른 언어에서는 딕셔너리 라고 한다 있다.
class MapTest
{
private:
map<const char*, int> _mapTest;
map<const char*, int>::iterator _mi;
// 1만개 미만의 데이터는 벡터가 유리하다 (배열로 구성되어 있기 때문)
// 1만개 이상의 데이터는 리스트가 유리하다.
// 10만개 이상의 데이터는 맵이 유리하다.
// 100만개 이상의 데이터는 해쉬 맵이 유리하다.
// hash_map -> unordered_map 으로 사용을 권장하고 있다.
// map = 레드블랙 트리, hash_map은 (?)로 되어 있다.
public:
MapTest();
~MapTest();
};
MapTest.cpp파일
#include "210422 1. MapTest.h"
MapTest::MapTest()
{
// 선형구조로는 vector, list, deque
// 트리구조로는 set, map이 있다.
// 맵은 자동적으로 정렬하며, 레드블랙 트리로 구성되어 있다.
// 아울러 연관 컨테이너 종류 중 하나이다.
// 아울러 key, value로 구성되어 있고 key는 중복을 허용하지 않고, 오름차순으로 정렬된다.
// 연관컨테이너란? key, value 처럼 관련이 있는 데이터를 하나의 쌍으로 저장하는 컨테이너.
// 맵은 푸쉬백이 없다.
// insert로 넣게 되어 있다.
// 키와 값을 한쌍으로 데이터를 저장한다 (한쌍 : pair)
// pair : 두 객체를 하나의 객체로 취급해준다
// make_pair(데이터, 값) 데이터와 값을 pairing 한다.
// 보다 자세한 내용 : https://velog.io/@choiiis/C-pair
// 그럼 어디에 사용하나?
// 정렬이 필요할때 > 자동 정렬해주므로, 많은 자료를 저장하고 검색이 빨라야 할 떄,
// 빈번하게 삽입 / 삭제가 필요로 하지 않을때
_mapTest.insert(pair<const char*, int>("민준", 4));
_mapTest.insert(pair<const char*, int>("현진", 8));
_mapTest.insert(pair<const char*, int>("유림", 7));
_mi = _mapTest.find("현진"); // 맵 안에 0 민준, 1 현진, 2 유림
// 맵 이터레이터가 맵의 끝이 아니라면 =(만약에 키 값이 있으면)
if (_mi != _mapTest.end())
{
cout << _mi->first << "가 좋아하는 숫자는 " << _mi->second << " 입니다. " << endl;
// first 찾는 키값, second 데이터
}
else // 만약에 키 값이 없으면
{
cout << "그런 애는 없는데요.." << endl;
}
// 던전앤 파이터와 같은 게임을 구현할 때 (z order)구현이 어렵다면 map을 이용하여 구현할 수 있다.
// why? 자동으로 정렬되기 떄문에!
// z order에 대한 보다 자세한 내용 : https://mores.tistory.com/210
}
MapTest::~MapTest()
{
}
main 함수가 있는 cpp파일 (단순 호출만 진행한다)
#include <iostream>
#include <string>
#include "210422 1. MapTest.h"
int main()
{
MapTest mt;
}
win32 API
#include <Windows.h>
// 인스턴스 : 메모리 상에 할당되어 실행중인 프로그램, OS를 확인하기 위한 값
HINSTANCE _hInstance;
// 윈도우 핸들 : 대상끼리 구분하기 위해 사용한다.
HWND _hWnd;
// 윈도우 클래스 이름
LPCTSTR _lpszClass = TEXT("경일 28기 이시영 :-) ");
// 함수의 프로토 타입 선언
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// API (Application Programming Interface)
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int cmdShow)
// WinMain의 역활
// 1. 윈도우창 세팅 후 화면에 띄우고
// 2. 메시지 루프
// 인자값 설명
// hInstance - 인스턴스 핸들
// hPrevInstance - 이전에 실행된 인스턴드 핸들
// lpszCmdParam - 명령으로 입력된 프로그램 인수
// cmdShow - 프로그램이 시작될 형태
{
_hInstance = hInstance;
//메세지 구조체 : 운영체제에서 발행하는 메시지 정보를 저장하는 구조체
MSG message;
//윈도우 정보를 저장하기 위한 구조체
WNDCLASS wndClass;
wndClass.cbClsExtra = 0; // 클래스 여분 메모리
wndClass.cbWndExtra = 0; // 윈도우 여분 메모리
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 윈도우 작업영역에 칠할 배경
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); // 커서 지정
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 타이틀바 좌상단에 보여줄 아이콘과 윈도우가 최소화 되었을 때 보여줄 아이콘
wndClass.hInstance = hInstance; // 윈도우 클래스를 등록한 인스턴스 등록
wndClass.lpfnWndProc = (WNDPROC)WndProc; // 메시지를 처리하는 함수를 지정 (윈도우 프로시저)
wndClass.lpszClassName = _lpszClass; // 등록하고자 하는 윈도우 클래스 이름
wndClass.lpszMenuName = NULL; // 클래스로부터 만들어진 윈도우가 사용할 메뉴 지정
wndClass.style = CS_HREDRAW | CS_VREDRAW; // 윈도우 클래스의 스타일 지정
RegisterClass(&wndClass); // 윈도우 클래스 정보를 등록해준다
_hWnd = CreateWindow(
_lpszClass, // 윈도우 클래스 이름
_lpszClass, // 윈도우 타이틀 바의 이름
WS_OVERLAPPEDWINDOW, // 윈도우 스타일
50, // 윈도우 시작좌표 Left
50, // 윈도우 시작좌표 top
800, // 윈도우 가로크기
600, // 윈도우 세로크기
NULL, // 부모 윈도우
(HMENU)NULL, // 메뉴 핸들
hInstance, // 인스턴스 지정
NULL);
ShowWindow(_hWnd, cmdShow); // 윈도우를 사용자 화면에 띄워준다
// MSG = 운영체제에서 발생하는 메시지 정보를 저장히기 위한 구조체
while (GetMessage(&message, 0, 0, 0)) // GetMessage 대기상태
{
TranslateMessage(&message); // 키보드 입력메시지 처리를 담당
DispatchMessage(&message); // 윈도우 프로시저에 전달된 메시지를 실제 윈도우에 전달한다.
}
return message.wParam;
}
// 윈도우 프로시저 : 메시지를 운영체제 강제로 전달하여 호출한다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
// 인자값 설명
// hWnd - 윈도우가 발생한 메시지인지 구분
// iMessage - 메시지 구분 번호
// wParam - 마우스 버튼의 상태와 키보드 조합키의 상태를 전달한다.
// lParam - 마우스 클릭 좌표를 전달한다.
{
PAINTSTRUCT ps;
HDC hdc;
switch (iMessage)
{
case WM_PAINT:
{
// 멀티바이트, 와이드 바이트, 유니코드
// strlen = wcslen = _tcslen(문자열 길이)
// strcmp = wcscmp = _tcscmp(문자열 비교)
// strcpy = wcscpy = _tcscpy(문자열 복사)
// strchr = wcschr = _tcschr(문자 찾기)
// 등등..
hdc = BeginPaint(hWnd, &ps);
// 화면에 글자를 출력해보자
TextOut(hdc, 50, 100, "무야호~", strlen("무야호~"));
TextOut(hdc, 50, 150, "점심은 뭐먹을까?~", strlen("점심은 뭐먹을까?~"));
TextOut(hdc, 250, 100, "2D 준비됐어 영?", strlen("2D 준비됐어 영?"));
// RGB 색상 기본 참고
// 0, 0, 0 검정
// 255, 255, 255 하양
SetTextColor(hdc, RGB(255, 0, 0));
// 이 밑으로는 색칠되서 출력된다 :)
// 매번 이렇게 출력할래? 놉, 변수 출력!
const char* str = "실기 합격하고 싶다.";
TextOut(hdc, 250, 150, str, strlen(str));
// 선을 그어봅시다
MoveToEx(hdc, 50, 50, NULL); // 50, 50에 시작점을 둔다
LineTo(hdc, 100, 100); // 100, 100 선을 긋는다.
LineTo(hdc, 150, 100);
LineTo(hdc, 150, 300);
MoveToEx(hdc, 450, 50, NULL);
LineTo(hdc, 300, 250);
// 사각형 그리기 함수 == Rectangle();
Rectangle(hdc, 10, 10, 100, 100);
// 동그라미 그리기 함수 == Ellipse()
Ellipse(hdc, 10, 10, 100, 100);
EndPaint(hWnd, &ps);
}
break;
// 윈도우 창 부수는 화면
case WM_DESTROY:
{
// 윈도우 종료 함수
PostQuitMessage(0);
}
return 0;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
반응형
'학원 > 경일게임아카데미' 카테고리의 다른 글
17. 열두번째 수업 (0) | 2022.12.21 |
---|---|
16. 열한번째 수업과제 [이름 그리기 및 도막사라무 제작] (0) | 2022.12.19 |
14. 열번째 수업과제 [벡터를 이용한 상점과 인벤토리 기능 구현] (0) | 2022.12.15 |
13. 열번째 수업 (1) | 2022.12.14 |
12. 아홉번째 수업 (0) | 2022.12.12 |