[WinApi] 파일 입출력 기본, 커비 개발 일지

라멘커비·2024년 2월 26일
0

WinApi

목록 보기
19/32

파일 입출력 기본

환경 변수

환경변수 => 비쥬얼 스튜디오로 치면 참조경로나 라이브러리 경로.
system("git"); 만 실행시켜도 git이 실행되는 이유는 환경변수로 git.exe 파일의 위치가 등록되어 있기 때문이다.

경로

상대 경로는 원경로를 통해서 완성된다. 원경로는 무조건 OS가 처음에 우리에게 부여해 준다. 우리 프로그램도 원경로를 확인할 수 있다.

엔진에 Resource파일 있을 때까지 경로 올라가는 MoveToSearchChild()함수 추가

AllDirectory로 현재 경로에서 존재하는 모든 디렉터리 확인 가능.

쌤이 생각하는 프로그래머의 3대 기본기(?)
1. 디버깅
2. 문자열
3. 파일입출력

파일 입출력

파일이란 하드디스크에 있는 바이트 덩어리들이다.
파일 입출력이란 하드디스크에 있는 바이트 덩어리를 조작하거나 만들거나 수정하는 기능들이다.
Ram에는 우리가 코드를 치면 바로 바이트가 조작된다. (int a = 10;만 만들어도 가능)

근데 하드디스크는 주변기기이다. 코딩으로 키보드 등의 기능을 사용할 때와 마찬가지로 OS가 제공해줘야 한다. 그대신 파일 입출력은 windows 이전부터 필요했던 기능이기 때문에 C와 C++에서는 인터페이스가 윈도우 탄생 전부터 통일되어 있었다.

C++ 스타일은 Istream과 Ostream 이라고 하는 클래스를 사용한다.
여기서는 C 스타일 사용.

fopen_s, fclose

#include <iostream>

int main()
{
	char Arr[100] = "ddddsfsdfwefwefwe";

	FILE* Ptr;

	fopen_s(&Ptr, "aaaa.txt", "wt"); // 파일을 만들고 수정할 수 있음.

	// 이 사이에서 뭔가를 하면 파일에 적용됨.
	fwrite(Arr, 100, 1, Ptr);

	fclose(Ptr);
}

w : 쓰겠다
r : 읽겠다
t : 텍스트
b : 바이너리로
fopen_s : 파일을 열거나 만드는 함수. 따로 수정하지 않는다면 없으면 만드는 함수.
fclose : 열었던 파일 닫아줌

  • fclose 하기 전까지 파일의 접근 권한을 갖고 있기 때문에 다른 프로그램에서 접근할 수 없다. 꼭 fclose를 실행시켜서 OS에게 권한을 반환해야 한다.

void포인터

오로지 주소값만 가진다.
자료형이 존재하지 않으므로 기본적인 주소 이동 연산이 안 된다.

// 100번지
int Value = 10;

int* Ptr = &Value;
Ptr += 1;
// 100번지 + sizeof(int) * 1 => 104번지 됨.

fwrite

fwrite(&bValue, 4, 1, Ptr);`
void const* _Buffer => 내가 저장하려고 하는 주소
size_t _ElementSize => 그 주소부터 몇 바이트를 저장할 것인지. 자료의 크기
size_t _ElementCount => 그걸 몇 번 저장할 건지
FILE* _Stream => 파일의 핸들

fread

		  //↓ Arr크기
fread(Arr, 100, 100, 1, Ptr);

벡터나 맵을 파일에 저장하는 건 복잡한 과정 거쳐야 함

?

직렬화

클래스에서 프로그램의 시작과 종료시마다 변화되는 의미없는 값들은 버리고 필요한 값들만 정확하게 저장하는 방식을 직렬화라고 한다.
직렬화 클래스를 만들어서 넣어주는 도구를 프로그래머들이 많이 사용하는데 시리얼라이저라고 한다.

시리얼라이즈 => 직렬
시리얼라이저 => 직렬화를 해주는 도구 => 클래스

클래스를 기록할 때 바이트패딩까지 기록할 필요가 없다. 클래스의 의미있는 데이터들의 크기로만 꽉 채우는 것이다.


커비 포트폴리오 개발 일지

걷기 처음 속도 느린거 수정

오늘 흡입만들자

몬스터에서 흡입 충돌체랑 몬스터가 충돌하는지 확인 -> 충돌할 땐 몬스터가 커비쪽으로 당겨짐
-> 커비 몸통에 몬스터가 닿으면 커비가 몬스터 먹어야 함 (근데 흡입으로 닿은 게 아니면 바로 없어지지 않고 데미지입어야함..)

  • 몇 초동안 흡입에 뭐 안 들어오면 흡입 그냥 끝남.(얘는 나중에하자)

  • 지금 커비쪽으로 당기는거까지 완료

  • 흡입 상태를 Eating 상태라고 정했고, Eating 상태로 이동, 뛰는 거 가능.

  • 내일은 Eating상태의 나머지 이동(Jump만 남았나?) 이미지 정리하고 + 쌤 피드백 받은 거 하고 + 변신타입 받는 거 해보장. 아 몬스터 여러마리 소환도 안 됨 Flamer BeginPlay에서 너무 위치조정 디테일하게 해버렸음 어캐 해결하노ㅋㅋ

  • 저번 목요일과 달라진 점 : 맵 전환, 흡입 가능.

흡입 다 하고나서 점프 수정좀.

AddJumpVector함수를 만들든가 해서 확올려주고 멈췄다 확떨어질 수 있게 가속운동으로 만들어야 할듯. 애니메이션도 뭔가 맘에 안 드는데. 하 일단 냅둬.

profile
일단 시작해보자

0개의 댓글