너무나도 기초적인 그래픽 관련 질문...
글쓴이: spark1000 / 작성시간: 화, 2012/10/23 - 9:03오전
너무나도 기초적인 것인데요,
그, 소스를 보면, 그냥
if
elif 등만 나오는데,
만약, 슈퍼마리오 게임을 만든다고 한다면,
Space를 누르면, 마리오가 점프 한다.
이런 것은,
어떻게, 그 마리오라는 그림과
명령어를 연결하나요?
즉, 컴퓨터가, 제가 친 명령어, 'jump'를 알아먹었을 때,
컴퓨터한테, 또 말하길, 마리오를 'jump' 이렇게 말해야 하잖아요.
그런데, 컴퓨터한테, 말하려면,
검은 모자를 쓰고, 청 멜빵바지를 입게 그려진 수염이 있는 사람이 마리오임. 그 개체를 'jump' 하시오.
이렇게 명령하나요?
어떻게 컴퓨터가, 특정한 그림 개체를 알아먹을 수가 있나요?
어떤 flash file 자체에, 마리오 딱 한명만 들어있어서, 그 flash file을 지칭하면,
컴퓨터가 그 flash file을 이야기 하는 줄 알고, 그 안의 마리오만 인 줄 알고, 마리오만 점프하게 하는 것인가요?
그러면, 배경과 그 flash file이 절묘하게 다중적으로 겹쳐 있는 구조인가요?
그럼에도 불구하고, 캐릭터가, 배경과 함께, 하나의 그림처럼,
전혀, 그 캐릭터만 잘라 붙인 것 같은 느낌도 없고, 캐릭터가 동작을 해도, 전혀 잘라서 붙인 것 같지가 않은데 말이죠...
컴퓨터에게, 특정 캐릭터, 특정 그림에 대하여 명령할 때, 컴퓨터가 그림을 어떻게 알아먹을 수 있게 하나요?
Forums:
일단 완전 초보를 위한 프로그래밍 책을 하나 사보시는 게 좋겠습니다
괜찮은 책을 하나 사셔서 첨부터 끝까지 정독하시면서 나오는 문제를 다 풀어보시면, 이 글에 대한 답변은 물론이고 지금까지 하셨던 수많은 질문에 대한 답변도 같이 알게 되실 겁니다.
예를 들어서... 유치원생이 미분 적분을
예를 들어서...
유치원생이 미분 적분을 물어본다고 가정을 해보세요.
물론 이 유치원생은 덧셈 뺄셈도 잘 못합니다.
그러면, 어떻게 답을 해야 할까요? 저라면 덧셈, 뺄셈, 곱셈, 나눗셈을
먼저 배우라고 라고 답을 해주겠습니다.
지금 질문하신 분은 프로그래밍의 기초가 전혀 없기 때문에 답을 하기 곤란한 상황입니다. 기초적인 공부를 먼저 선행하여야 답이 가능합니다.
======== 서명 =======
주거지는 www.indidev.net 입니다.
애니메이션이 '움직인다'라고 하지만, 실제로는 서로
애니메이션이 '움직인다'라고 하지만, 실제로는 서로 다른 위치에 있는 그림을 연속적으로 보여주는 것 뿐이라는 건 알고 계실 겁니다.
컴퓨터 그래픽도 똑같습니다. 점프동작을 나타내고 싶으면 마리오가 연속적으로 점프하는 모습을 연속적으로 출력해주는 겁니다.
대충 의사코드로 마리오를 점프시키는 과정을 나타내면
if (점프키 눌림) {
마리오_위치_계산();
마리오_애니메이션_출력();
}
이렇게 됩니다. 간단하죠? 당연히 점프는 연속적인 애니메이션이므로 화면 업데이트도 여러번 일어날 겁니다.
이건 게임뿐만이 아니라 예를 들어 지금 보고 계신 모니터에서 창하나를 마우스로 클릭하고 드래그해도 똑같은 현상이 일어납니다.
창이 오른쪽으로 1픽셀 움직였다고 하면, 모니터에 출력될 내용을 다 지우고 다시 바탕화면을 그리고 작업표시줄을 그리고 오른쪽으로 1픽셀옮긴 창을 그립니다.
아니, 당장에 창위에서 마우스 커서를 움직이는 동안에도 마찬가지입니다. 커서가 조금이라도 움직이면, 커서아래영역은 전부 다 다시그리고 옮긴 자리에 커서를 그리는 겁니다.
더 효율적으로 개선하기 위해서 일부분만 다시그린다거나 여러번 그리는 부분은 미리 복사해놓는다던가 하는 노력은 합니다만, 기본 원리는 같습니다.
그럼 위치 계산을 위해서는 마리오의 위치를 알아야 할 텐데 마리오가 어딨는지는 어떻게 아는가하면, 그건 미리 메모리상의 어디에 마리오에 대한 정보를 넣어두겠다고 약속하는 겁니다. 보통 운영체제한테 필요한 메모리 크기를 알려주면 운영체제가 그 메모리를 할당해서 어디에 넣어놨다고 가르쳐 줍니다.
위치를 계산해야 할 일이 있으면 미리 약속된 장소에 가서 마리오의 위치값을 가져오면 되는겁니다.
위엣분들 말씀이 하나도 틀린게 없습니다만, 이렇게
위엣분들 말씀이 하나도 틀린게 없습니다만, 이렇게 생각해 볼 수도 있어요. 물론 같은 얘기를 반복하는 것입니다.
1. 사람의 키보드 입력을 기다린다.
2. 키보드 입력이 있다.
3. space키인가? yes -> 4번으로 가시오
4. jump명령어를 호출한다.
5. 1번으로 복귀.
이제, 4번은 다시 다음과 같은 과정으로 수행됩니다.
4.1. jump명령어가 호출되었다.
4.2. jump명령어는 어디에 기록되어 있는가? -> 0x394124번지임.
4.3. jump명령어를 찾아가서 내용을 읽어본다.
4.4. jump명령어의 내용은 "mario객체를 1픽셀 위로 올리는 것을 10번 반복하고, 1픽셀 내리는 것을 10번 반복한다" 이다.
4.5. jump명령어를 수행한다.
4.6. jump명령어를 호출한 곳으로 다시 되돌아간다.
그럼, 4.4.에서 mario객체를 1픽셀 올리는 것은 다음과 같이 수행됩니다.
4.4.1. mario객체의 현재 위치는? (203, 402)
4.4.2. mario객체에 1픽셀 올라간 위치는? (203, 403)
4.4.3. mario객체의 1픽셀 올라간 위치에 그림을 그린다.
4.4.4. 이 명령어를 호출한 곳으로 다시 되돌아 간다.
4.4.3.에서 그림을 그리는 과정은 다음과 같습니다.
4.4.3.1. mario객체의 비트맵을 불러온다.
4.4.3.2. 화면 전체의 비트맵을 불러온다.
4.4.3.3. 화면 전체의 비트맵에 mario객체의 비트맵을 위치에 맞게 덧씌운다.
4.4.3.4. mario객체가 덧씌워진 화면 전체를 모니터에 출력한다.
4.4.3.5. 이 명령을 호출한 곳으로 다시 되돌아 간다.
4.4.3.4.과정에서 화면전체를 모니터에 출력하는 과정은 설명 안하겠습니다.
질문에서, "어떻게 마리오가 마리오인줄 아나요?"라고 하셨는데, 프로그래밍 언어에 따라 다릅니다. 어떤 언어는 jump(mario)라고 하면 마리오가 뭔지 알고, 적당히 알아서 점프 시켜주는 언어도 있고, 어떤 언어는 jump를 완전히 구현해야 하는 경우도 있습니다. 다른 사람에 의해 미리 구현된 jump를 가져다 쓸 수도 있죠.
어려운 프로그램을 만들거나 이해하려고 하지 마시고, 일단 hello, world!부터 출력시켜 보세요. 그 다음에 덧셈 뺄셈을 출력하는 프로그램을 완성해 보세요.
피할 수 있을때 즐겨라! http://melotopia.net/b
감사합니다
Snowall 님 감사합니다
잘 이해가 안되지만, 어쨌든 복사를 해두고, 잘 머릿속에 입력해야겠습니다
댓글 달기