VBA 기초 상식

VBA 기초 상식

 

1. ActiveCell.Offset(0, 0).Value

상대적 위치. 0, 0은 현재 커서가 위치한 곳의 값

ActiveCell.Offset(행, 열).Value 로 상대적 위치를 표시할 수 있다.

 

2. Cells(0, 0)

절대적 위치. (0, 0)은 A1, (1, 0)은 A2 …

※ Cells(0, 0).Value 를 쓰면 숫자값을 가져옴

Val()은 외부적 접근으로 괄호 속 값을 숫자로 바꾸지만

.Value는 내부적 접근으로 본래의 숫자를 발굴한다.

 

3. [A1], [A2] …

셀 A1, A2를 말한다

 

4. Range(“A1”).CurrentRegion.Rows.Count

A1과 인접한 셀들(내용이 채워진)을 제외하고 줄의 값을 구한다.

테이블에서 한 줄을 추가할 때 유용하다.

 

ex)

 

위 그림에서 A5부터(A4 다음 줄부터) 내용을 추가하고 싶다면 다음과 같이 쓴다.

Range(“A4”).CurrentRegion.Rows.Count + 3

3이라고 쓰는 이유는 위로부터 빈칸의 갯수이다. 만약 A1 셀이 비어있다면 4를 더한다.

 

※ Range(“A1”).CurrentRegion.Columns.Value

A1과 인접한 셀들(내용이 채워진)을 제외하고 열의 값을 구한다.

 

5. 폰트 바꾸기

Range(“A1”).Font.Name = “바탕체”
Range(“A1”).Font.Bold = True

컴활1급 실기 ‘엑셀 프로시저’가 도대체 뭐지? (2/2)

 

컴활1급 실기 ‘엑셀 프로시저’가 도대체 뭐지? (2) 

 

1. 저번 강좌 요약

저번 포스트에서 엑셀 프로시저에 대해 대강 배웠다. 엑셀 프로시저란 다음과 같다. 엑셀에 VBA라는 프로그래밍 언어가 연동되어 있는데, 이를 통해 짠 프로그램이 바로 엑셀 프로시저다. 엑셀 프로시저를 코딩하려면 Alt+F11키를 눌러서 VBA화면으로 들어가면 된다.

 

1번 문제는 버튼을 클릭하면 폼이 열리게 만들면 되는거였다. (1)VBA화면에서 (2)해당 시트를 더블클릭->코딩창이 뜬다 (3)좌측박스(개체)를 cmd버튼으로 (4)우측박스(행위)를 click으로 바꾼후 (5)해당 Sub안에 ‘폼이름.show’ 라고 코딩하면 되었다.

 

2. 문제 2번 풀고 어떻게 공부할지 생각하기

② 폼이 초기화(Initialize)되면 [C4:C20] 영역의 값이 콤보상자(cmb차종)의 목록에 나타나도록 설정하시오 

 

문제에 힌트가 들어있다. 폼의 초기화(Initialize)라는 거다.

 

즉, (1)VBA화면에서 (2)차종검색화면 폼을 더블클릭 (3)좌측박스 UserForm (4)우측박스 Intialize 로 선택하면 된다. 그럼 아래와 같이 Sub가 하나 생긴다. Sub라는 건 실행의 한 단위를 뜻한다.

Private Sub UserForm_Initialize()

 

End Sub

 

Private Sub와 End Sub 사이에 내용을 집어넣으면, UserForm(폼)이 초기화(Initialize)될 때

폼의 초기화란 폼이 열릴 때, 와 비슷한 말이다.

 

그리고 폼의 콤보박스를 눌러보자. 콤보박스란 화살표를 누르면 리스트가 쭉 떠서 고를 수 있게 되는 컨트롤을 말한다. 찾아서 클릭했는가? 그럼 속성창(좌측 하단)에 이름이 ‘Cmb차종’이라고 쓰인 걸 볼 수 있다. 이 콤보박스의 목록을 C4:C20 영역으로 설정해주면 된다는거다.

 

그 명령어는

Cmb차종.RowSource = “c4:c20”

이다.

 

즉,

Private Sub UserForm_Initialize()

Cmb차종.RowSource = “c4:c20”

End Sub

으로 써넣으면 2번 문제가 풀린다.

 

그럼 이와 똑같은 문제가 나오면 좋겠지만, 다른 문제가 나오면 어떡하냐고? 이걸 다 외워야하냐고?

다 외우면 좋겠지만, 실은 그냥 하다보면 알게 된다.

다른 문제가 나와도 대충 풀 수 있다.

 

한 번 코딩창에서 Cmb차종. 까지 써보고 멈춰보라.

 

보다시피 명령어를 안 외워도 선택할 수 있게 만들어져 있다.

그렇기에 본인은 콤보박스에 딸린 명령어들을 모르지만 얼마든 코딩할 수 있다.

 

우선 앞에 아이콘 모양을 보자.

초록색 상자 아이콘과 회색 손이 문서를 잡은 아이콘이 있다. 이를 초록 아이콘, 회색 아이콘이라고 부르자. 초록색은 명령이고, 회색은 속성이다.

 

(1) 초록 아이콘 : 명령

 

Additem의 초록 아이콘이 보이는가? additem이라는 명령이다. 초록색 아이콘은 오른쪽에 “블라블라” 를 써서 코딩하면 된다.

다시 말해서 초록 아이콘들은

cmb차종.xxx “블라블라” 식으로 써야한다.

또는 cmb차종.xxx “블라블라”, “블라블라” 또는 cmb차종.xxx “블라블라”, “블라블라”, “블라블라” … 등등.

 

additem이 뭔지 유추해볼까? 그건 말 그대로 아이템을 추가하는 명령일 가능성이 높다.

아마 콤보박스 리스트에 아이템 1개를 추가할 때 쓰는거지.

한번 additme까지 쳐보고 스페이스바를 한 번 눌러봐라.

놀랍게도 그다음에 뭘 써야하는지 알려준다. 이렇게 명령어 속에서 써야하는걸 인자라고 한다. 인자가 2개인 명령이고, 지금 보고 있듯이 VB가 자동으로 알려준다. []로 묶여있는 부분은 써도 그만 안 써도 그만이란거다. 특이하게 인자 2개가 다 []로 묶여있네.

 

첫번째 인자 [pvargitem]은 뭘까? pvarg가 뭔진 모르지만 그냥 item이름을 쓰면 되는거같다. “새로운 아이템”이라고 써보자. [pvargindex]는 뭘까? VB에서 index란 보통 숫자(순서)를 말한다. 아마 5를 쓰면 6번째 칸에 들어가지 않을까. []가 있으니 생략해도 무방하다.

 

cmb차종.additem

이라고만 쓰면 빈 칸이 하나 추가될거다.

cmb차종.additem “새로운 아이템”

이라고 쓰면 새로운 아이템이라는 칸이 하나 추가될거다.

cmb차종.additem “새로운 아이템”, 5

이라고 쓰면 6번째에 추가되겠지. (프로그래밍의 모든 숫자 시작은 0 이기 때문이다. 0,1,2,3,4,5)

 

직접 실행해본 건 아니지만 틀림없이 이럴 것이다. 볼 것도 없다.

 

다시 한 번 Cmb차종. 까지만 입력하고 리스트업이 뜨면 초록 아이콘을 좀 더 찾아보자.

clear, cut, copy.. 이런건 (1)비우고, (2)잘라내고 (3)복사하기 정도가 될거다. 유추할 수 있음을 여실히 알 수 있다.

 

회색 손이 문서를 집고 있는 아이콘이 보이는가? 이런 것들은 컨트롤의 속성이다. (1)컨트롤을 클릭하고 (2)좌측 하단의 속성창에서 얼마든 수정할 수 있는 것들이다.

 

 

(2) 회색 아이콘 : 속성

 

속성은 명령어가 아니라서 인자가 없다. 그냥 그 자체로 쓰인다.

예를 들어

msgbox cmb차종.backcolor

이렇게 쓰면 그냥 백칼라가 뭔지 메시지로 뜬다. 굳이 인자 없어도 동작한단 얘기다.

 

다만 오른쪽에 “= 블라블라”를 써넣어서 수정할 수 있다.

cmb차종.backcolor = “블라블라”

이렇게 쓰면 된다. backcolor니까 블라블라에는 색상이 들어가겠지?

 

예컨대 autosize, 이런건 안 봐도 글자 수에 따라 사이즈 조절을 해줄거다. 개체명.autosize=true로 쓰면 되겠지. backcolor는 배경색깔, bordercolor는 테두리색깔… 얼마든 유추할 수 있으며 많이 쓰이는 건 금방 기억하게 된다.

 

다만 우리가 배운 rowsource는 속성이니까 회색 아이콘일거다. rowsource가 왜 속성이냐고? 콤보박스의 기본 모양이 비어있는 건 이상하잖아. 색상, 테두리, 글자 같은 건 기본 모양에 해당하기 때문에 속성인거다. 그게 없으면 화면에 가시적으로 표시가 안되잖아.

콤보박스의 기본 로우 데이터들은 당연히 속성에 미리 입력할 수 있을거다. 지금 당장 (1)콤보박스를 클릭하고 (2)속성창에서 (3)rowsource를 찾아 거기에 아이템1, 아이템2, 아이템3 식으로 입력할 수 있다. 하지만 문제에서 요구하는데 폼이 초기화됐을 때니까

 

Private Sub UserForm_Initialize()

Cmb차종.RowSource = “c4:c20”

End Sub

 

이렇게 넣는 것뿐이다. 원래 속성칸에서 수정가능하다.

 

 

근데 그럼 회색과 초록을 구분해서 외워야하나요? 아니. 전~혀. 그냥 자연히 알게 될 뿐더러 굳이 구분할 필요없다. 편하게 가도 된다.

 

그냥 개체에 대한 이해만 있으면 된다. 볼까? Combo박스는 아마 이런식으로 될거다.

처음에 속성으로 테두리, 색상, 글자크기, 로우 데이터 정도를 정해두고, 나중에 개체명.additem이나 개체명.removeitem으로 리스트를 추가하거나 제거하면서 쓰면 되는거다.

 

Text박스는 어떨까.

역시 속성으로 테두리, 색상, 글자크기, 기본 글자(디폴트값)가 있을거고 나중에 개체명.xxxx 로 속성을 바꾸거나 명령을 할 수 있을거다. 속성이랑 명령은 역시 점찍거나 스페이스바 눌러서 리스트가 나오면 그 중에 적당히 선택하면 된다.

 

그러니까 어떤 속성이나 명령이 있을지 대충 모양에 따라서 각이 나오지 않나. 대충 어떤게 있을지를 아니까 적당히 골라쓸 수 있는거다. 유가릿?

 

3. 문제3번 풀고 어떻게 공부할지 생각하기

③ <차종검색화면> 폼의 차종(cmb차종) 콤보상자에서 검색할 차종을 선택하고 <검색> 버튼(cmb검색)을 클릭하면 워크시트의 [표1]에서 해당 데이터를 찾아 폼의 대여코드(text코드), 차종(text차종), 연료(text연료), 연비(text연비), 출시년도(text출시년도), 1일대여료(text대여료)컨트롤에 표시되도록 프로시저를 작성하시오.(ListIndex 사용). 

 

길어서 어려워보이는데 별 것도 아니다.

콤보상자에서 차종을 선택해서 검색을 누른다. 그러면 엑셀의 데이터가 폼에 옮겨진다는 얘기다. ListIndex를 사용하라고 했으니 안 쓰면 감점이다.

 

리스트인덱스라니, 아무리 봐도 콤보박스에 밖에 쓸데가 없다. 커맨드버튼이나 텍스트가 무슨 리스트가 있겠어?

그러니까 Cmb차종.ListIndex 로 쓰면 된다.

 

만약 당신이 첫번째 칸을 고르고 있다면 Cmb차종.ListIndex 는 0의 값을 가지고, 두번째 칸을 고르고 있다면 1의 값을 가질거다.

 

msgbox cmb차종.listindex 로 시험해봐라. 지금 몇 번째 칸을 고르고 있는지 나올거다.

혹은 cmb차종.listindex = cmb차종.listindex + 1 뭐 이딴식으로 쓰면 다음칸이 골라지겠지 뭐. 속성을 바꾸는거니까 말이다.

(참고로 귀찮아서 시험 안해본 관계로 안될 수도 있다는 점 유의바람. 하지만 리스트 어딘가에 당신이 생각하는 기능이 다 있다)

 

그럼 이제 코딩을 해볼까.

 

폼의 화면은 아래와 같다.

 

각 컨트롤들의 이름을 알아보자. (1)폼에서 각 컨트롤을 클릭하고 (2)속성창을 보면 된다. 이름은 보통 알기 쉽게 되어 있다.

여기서 차종, 검색결과 같은건 레이블(label)이라고 하는데 여기까지 이름 알 필요는 보통 없다.

 

내용은 이렇게 쓰면 된다.

 

Private Sub Cmd검색_Click() 

참조행 = Cmb차종.ListIndex + 4

Text코드 = Cells(참조행, 2)
Text차종 = Cells(참조행, 3)
Text연료 = Cells(참조행, 4)
Text연비 = Cells(참조행, 5)
Text출시년도 = Cells(참조행, 6)
Text대여료 = Cells(참조행, 7) 

End Sub

 

코딩창에서 좌측상자는 cmd검색, 우측상자는 click으로 하면 “cmd검색이라는 컨트롤을 클릭했을 경우”라는 조건이 된다. 그게 “Private Sub Cmd검색_Click()”과 같은 말이지 뭐.

 

그래서 각 텍스트박스에 셀값을 넣어보자. 간단하다. 텍스트개체명.text = cells(x값, y값) 이렇게 쓰면 된다. 그냥 텍스트개체명 = cells(x값, y값) 으로 써도 된다.

 

시트 그림을 다시 보여주겠다. 이제 코딩 내용이 이해가 될 것이다.

 

예컨대 당신이 모닝을 고르면, Listindex는 0이다. 그 경우 셀 (4,2) (4,3) (4,4) (4,5) (4,6) (4,7)을 폼에 옮겨와야 한다.

당신이 소나타를 고르면 Listindex는 1이다. 그 경우 셀 (5,2) (5,3) (5,4) (5,5) (5,6) (5,7)을 폼에 옮겨와야 한다.

그러니 뭐… Listindex가 n이면 (n+4,2) (n+4,3) … (n+4,7)이 될게 자명하다.

 

그러니 n+4를 변수에 넣는다. 다시 말해 Listindex + 4를 변수에 넣는거다.

그리고서 시트상의 셀 (해당변수,2) (해당변수,3) … (해당변수,7)을 폼에 옮겨오면 된다. 그렇다면 변수란 무엇인가? 변수란 어떤 내용을 저장하는 그릇같은거다. 다만 항상 변할 수 있기에 변수라고 한다.

이 쪽에 가면 내가 쓴 변수강좌가 있다. http://blog.naver.com/bb_/70168830526

 

4. 마치며..

엑셀 프로시저는 프로그램을 짜는거고, 몇 번 해보다 보면 별로 어렵지 않다. 원리를 기억하고 있으면 위기 상황에서도 차근히 방법을 고민할 수 있다. 게다가 문제에 힌트들이 있으니 놓치지 말 것.

참고로 컴활1급 실기는 컴퓨터로 채점하기 때문에, 결과만 나온다고 해서 점수가 나오는 게 아니다. 깔끔하게 코딩하는 습관을 들이도록 하자.

컴활1급 실기 ‘엑셀 프로시저’가 도대체 뭐지? (1/2)

컴활1급 실기 ‘엑셀 프로시저’가 도대체 뭐지? (1)

 

컴활을 독학하는 당신을 위해 준비했다. 컴활1급 실기에서 엑셀 프로시저라는 부분이 있는데, 사실상 이해하기보다 암기를 많이 해야하는 부분이다. 하지만 전체적인 구조를 모른채 쌩암기하는 것은 비효율적이므로 러프하게 설명하고자 한다.

 

1. 컴활 1급 실기에선 어떤 문제가 나오나

컴활1급 실기는 (1)기본 작업, (2)계산 작업, (3)분석 작업, (4)기타 작업 등으로 이루어진다. (1) 기본작업은 데이터에 관한거다. 외부 데이터베이스 가져오기, 고급필터, 조건부 서식 등을 쓰면 된다. (2) 계산 작업은 각종 수학함수로 수식을 쓰고 값을 산출하면 된다. (3) 분석 작업은 피벗테이블 작성과 매크로를 활용하면 된다. (4) 기타 작업이 가장 어려운 난이도를 자랑하는데, 크게 차트 작업과 엑셀 프로시저로 나뉜다. 본 포스트에서 다루고자 하는 게 바로 이 엑셀 프로시저다.

 

2. 엑셀 프로시저 예제

다음 문제는 본인이 인터넷 검색을 통해 얻은 문제이다.

 2. ‘기타작업-2’ 시트에서 다음과 같은 작업을 수행하고 저장하시오.(각 5점)

① <대여차종검색> 버튼을 클릭하면 <차종검색화면> 폼이 나타나도록 프로시저를 작성하시오.
② 폼이 초기화(Initialize)되면 [C4:C20] 영역의 값이 콤보상자(cmb차종)의 목록에 나타나도록 설정하시오
③ <차종검색화면> 폼의 차종(cmb차종) 콤보상자에서 검색할 차종을 선택하고 <검색> 버튼(cmb검색)을 클릭하면 워크시트의 [표1]에서 해당 데이터를 찾아 폼의 대여코드(text코드), 차종(text차종), 연료(text연료), 연비(text연비), 출시년도(text출시년도), 1일대여료(text대여료)컨트롤에 표시되도록 프로시저를 작성하시오.(ListIndex 사용).

 

 

 

 

그리고 이게 기타작업2 시트의 모습이다.

 

3. 문제가 시키는대로 따라가 보자

먼저 첫번째 문제다.

“① <대여차종검색> 버튼을 클릭하면 <차종검색화면> 폼이 나타나도록 프로시저를 작성하시오.”
여기서 폼이라는 건 창(Window)을 말한다. 인터넷 익스플로러, 윈도우 탐색기 같은 것들은 모두 폼을 갖고 있다. 예컨대 전체화면으로 실행되는 스타크래프트같은 건 폼이 없는거다. 그렇다면 프로시저란 무엇일까? 자세히 알건없고 프로시저는 프로그램이라 보면 된다.

 

즉 첫번째 문제는, 대여차종검색 버튼을 클릭하면 차종검색화면이라는 폼(창)이 나오도록 프로그램을 짜라는거다.

 

컴활1급은 문제를 줄 때 파일에 이미 폼을 포함시켜서 준다. 그렇지만 일단 우리는 원리를 이해하기 위해 빈 문서에서 폼을 만드는걸 배워보자.

 

먼저 새 문서를 연다.

프로그램(프로시저)을 짜려면 어떻게 해야하지? 엑셀에서 Alt+F11을 눌러보면 된다.

 

▼Alt+F11을 누르면 비주얼베이직 창이 나온다. 이를 VBA 화면이라고 한다.

 

Alt+F11을 누르면 나오는 비주얼베이직은 보통 VBA(비주얼베이직 어플리케이션)라고 부른다. 베이직이란 C나 자바같은 일종의 프로그래밍 언어인데, 자세히 알건 없다.

프로시저를 짤 때는 무조건 Alt+F11을 눌러 여기 들어오면 된다.

 

보통 컴활1급 실기에서 미리 폼의 모양을 만들어서 문제를 준다. 그러나 원리를 이해하기 위해 직접 폼을 만들어보겠다.

 

4. 폼 만들기

 

▼ 왼쪽에 탐색창에서 (1)마우스 우클릭-(2)삽입-(3)사용자 정의 폼 을 클릭하면 폼이 만들어진다.

 

▼폼이 만들어진 모습

 

그리고 화면 한 쪽에 떠있는 도구상자 창에서 컨트롤들을 끌어다가 배치하면 된다.

컨트롤이란 개체를 말한다. 컨트롤은 다음과 같은 것들이 있다. 커맨드버튼(회색 버튼), 텍스트박스(수정가능한 글자박스. 흔히 아이디/비번 입력하는 칸처럼 생김), 레이블(혹은 라벨. 수정불가능한 글자들), 체크박스(브이 체크가능), 옵션박스(동그라미 체크가능. 체크박스와 다른 점은 체크는 중복 선택가능, 옵션은 1개 선택가능)

 

▼근데 실전 문제에서 폼을 만들 필요는 없다. 폼 모양은 미리 만들어져서 주어진다.

 

다만 폼이 안주어질 경우, 좌측 상단부터 순서대로 만들면 된다.

레이블(차종), 콤보박스, 커맨드박스(검색), 커맨드박스(닫기).. 순으로 만들면 된다.

 

5. 버튼을 클릭하면 폼이 나오게 하기

▼ 지금 기타작업-2 시트에는 “대여차종검색”이라고 쓰여있는 커맨드버튼이 1개 놓여있다. 커맨드버튼이 뭐냐하면 회색으로 된 흔한 버튼을 말한다.

 

역시 Alt+F11을 이용해 VBA화면으로 가보자.

그리고 해당 시트에 들어가서 아래와 같이 해본다.

 

▼ (1)버튼이 들어있는 시트를 고른다. 여기선 기타작업-2 (2)cmd대여차종검색을 선택 (3)click을 선택

 

그러면 자동으로 private sub cmd대여차종검색_Click() / End sub 가 나온다.

 

이게 무슨 원리냐면 다음과 같다. 엑셀 파일의 내부는 시트, 폼, 모듈 등으로 이뤄져있다. 그래서 왼쪽 탐색창에서 시트, 폼, 모듈을 생성하거나 더블클릭해서 내용 수정하면 된다. 실제로 시트, 폼, 모듈을 막론하고 더블클릭하면 그냥 메모장처럼 덩그러니 빈 공간이 나오는데, 그 안에 VBA로 마음껏 코딩할 수 있다.

 

코딩하는 법은 다음과 같다. 위 그림의 2번이 왼쪽 박스, 3번이 오른쪽 박스다.

왼쪽 박스에서는 개체를 고를 수 있고, 오른쪽 박스에서는 행위를 고를 수 있다.

 

 

지금 왼쪽 박스에서는 (1)일반, (2)cmd대여차종검색, (3)worksheet를 고를 수 있다.

보통 폼에서 해보면 개체 목록에 컨트롤같은 게 잔뜩 있다. 텍스트박스, 레이블, 커맨드박스,콤보박스(클릭하면 펼쳐지는 복수의 선택지), 리스트박스(미리 펼쳐져있는 복수의 선택지) 같은 것들이다.

 

지금은 폼이 아니라 시트여서 개체가 별로 없다. 보통의 시트는 일반과 worksheet만 있는데, 현재 이 시트에는 커맨드버튼이 있으므로 특이하게 cmd대여차종이 있다. 커맨드버튼이 3개 있는 시트라면 개체는 더 많아진다. (일반, cmd1, cmd2, cmd3, worksheet)

 

그럼 좌박스:일반, 우박스:선언이란 뭘까? 일반은 그냥 개체와 상관없이 동작하기 때문에 선언 밖에 못쓴다. 선언이 뭐냐면 변수같은 걸 등록하는 것이다. 내가 지금부터 a라는 변수를 쓰겠습니다, 라고 프로그램에 선언하는거다. 그럼 변수가 뭐냐고? 그건 나중에.

 

그리고 오른쪽 박스에서는 행위를 고를 수 있다. click을 고르면 개체를 클릭할 때 실행한다는 거다.

 

만약 GotFocus를 고르면 그냥 tab키를 눌러서 포커스가 가기만 해도 내용이 실행된다. MouseMove를 고르면 버튼 위에서 마우스 움직임이 감지되기만 해도 내용이 실행된다.

 

아래는 이해를 돕기 위해 재미로 만들어본거다.

 

 

(1) 왼쪽에서 아무 시트나 고르고

 

(2) 좌박스 worksheet, 우박스 activate 고른다.

그러면 Worksheet_Activate라는 새로운 sub가 하나 생긴다. End sub와 사이에

  MsgBox “워크시트가 활성화되면 실행됨”

을 넣는다.

sub란건 실행의 한 단위라고 보면 된다. 몰라도 된다.

(3) 좌박스 worksheet, 우박스 change 고른다.

그러면 Worksheet_Change라는 새로운 sub가 또 생긴다. End sub와 사이에

  MsgBox “워크시트가 변경되면 실행됨”
을 넣는다.

(4) 시트를 수정하거나, 새로 열어보거나 하면 메시지 창이 뜬다.

 

왜냐하면 개체(워크시트)에 대한 행위(activate:활성화, change:변경)가 일어날 경우 msgbox가 뜨도록 코딩했기 때문이다.

 

원래 문제로 돌아가서, 커맨드 버튼을 누르면 폼이 뜨게 해보자.

폼이름.show가 바로 폼을 뜨게 하는 명령어다.

여기서 폼을 새로 생성했다면 보통 이름이 Userform1이므로 Userform1.Show 하면 버튼을 누를 경우 창이 뜰 것이다.

▼ 하지만 문제에서 제시된 폼 이름이 차종검색화면이므로 차종검색화면.show로 코딩한다.

 

그럴 일은 없겠지만 만약 폼 이름을 바꾸고 싶다면 아래와 같이 한다.

 

▼ (1)좌측상단 탐색창에서 UserForm1을 고르고 (2)그 아래(좌측하단) 속성창에서 이름 변경가능하다

 

이름은 차종검색화면으로 하고 엔터를 누른다.

 

이로써 문제1번에 대한 설명이 끝났다. 컴활 1급 실기의 문제는 각기 모두 다르지만, 유형별로 보면 비슷비슷하다는 걸 깨달을 것이다.

야매강좌 php10강 : 글쓰기와 DB연동

야매강좌 php10강 : 글쓰기와 DB연동 

 

오늘은 게시판에 글쓰기를 만들겁니다. DB연동도 배우고요. DB연동이란 뭘까요? 그냥 데이터베이스(DB)에 입력하거나 DB의 내용을 빼온다는 얘깁니다.

 

(1) 에러 함수 만들기

거두절미하고 코딩해보겠습니다. 일단 error라는 함수를 만들어봅시다.

 

<html><body>

<? //php 시작

function error($msg) //error라는 함수를 만든다. (괄호 안의 내용은 ‘인자’라고 한다. 현재 인자는 $msg 1개)
{

echo //원래는 출력 함수. php 안에서 자바스크립트 혹은 일반 html언어를 쓰려면 echo를 사용하면 된다

<script name=javascript> //자바 시작
window.alert(‘$msg’); //메시지를 띄운다
history.go(-1); //이전 페이지로
</script> //자바 끝
“;

exit; //끝
}

 

error(“에러 발생!”) //에러함수를 로드함

?> //php 끝

</body></html> 

 

소스 설명을 하면 다음과 같습니다. 먼저 error라는 함수를 만들었죠. 이 함수는 메시지를 띄우고, 이전 페이지로 돌아가는 함수입니다. (메세지와 이전 페이지로 이동은 자바스크립트로 처리했습니다)

 

위 소스에 의하면, error(“블라블라”)라고 쓰면 “블라블라”가 $msg 변수에 들어가죠. 그리고 alert(‘$msg’)에 의해서 “블라블라”가 에러 메시지로 뜨게 됩니다. 이게 인자를 사용하는 이유입니다.

 

인자는 1개 뿐만 아니라 여러 개 있는 함수를 만들 수 있어요. 덕분에 편하게 프로그래밍 가능하죠.

예를 들어 인자 3개의 함수를 만들어 봅시다.

function hamsoo($a, $b, $c)

{ $d = $a + $b + $c;

echo $d; }

 

요렇게 만들어두고 아래와 같이 써보세요.

hamsoo(1, 3, 5);

결국 값으로 9가 출력되게 됩니다. ($d = 1 + 3 + 5)

 

(2) 입력 페이지 만들기

 

입력 페이지를 만들어봅시다. 9강에서 했던 것과 비슷합니다.

일단 이름과 내용칸만 넣어보죠.

 

C:\APM_Setup\htdocs\10-1.php

 <html>
  <script language=”JavaScript”>

 

//체크인풋 함수. 이름이랑 내용이 입력되어 있다면 전송(submit)한다
 function check_input()
 {
  if(document.aaa.name.value == ”)
  { alert(‘이름을 입력하세요’);
   document.aaa.name.focus(); }
  else if(document.aaa.content.value == ”)
  { alert(‘내용을 입력하세요’);
   document.aaa.content.focus(); }
  else
  {
   document.aaa.submit();

  }

 }
 </script>

 

//이름 칸과 내용 칸을 둔다. 글 입력을 클릭하면 체크인풋 함수를 로드한다

 <body>
  <form name=’aaa’ method=’post’ action=’10-2.php’> //post방식으로 10-2.php로 보낸다
    이름 <input type=’text’ name=’name’ size=’10’>
    내용 <input type=’text’ name=’content’ size=’50’>

 <input type=’button’ value=’글 입력’ onclick=”javascript:check_input();”>
  </form>

 </body>
</html>

 

아래와 같이 나온다.

 

(3) 처리 페이지 만든다

 

10-2.php

 <html><body>
 
<?
function error($msg) //에러함수
{echo

<script name=javascript>
window.alert(‘$msg’);
history.go(-1);
</script>
“;
exit;}

 

 

//(1) DB에 연결한다.
mysql_connect(“localhost”, “root”, “apmsetup”) or die (mysql_error());

mysql_select_db(“oaphp”);

//mysql_connect(“서버”, “아이디”, “패스워드” 로 쓰면 된다. 연결 안될시 에러함수 로드
//mysql_select_db(“데이터베이스명”)으로 쓴다. 야매강좌 5강에서 oaphp라는 DB를 구축해뒀었다. http://blog.naver.com/bb_/70168838026

 

 

//(2) 전송받은 데이터를 변수로 저장
$name = $_POST[“name”];
$content = $_POST[“content”];

 

//(3) 초기값 설정. 시간, 아이피주소, 카운트(게시글 번호)를 설정한다. 자세히 알 건 없다
$daytime = time();
$ip = getenv(“REMOTE_ADDR”);
$count = 0;

 

//(4) 입력 검사. 알다시피 공백이 있는지 없는지 검사. 자세히 알 건 없다
if(!ereg(“[^[:space:]]”, $name))
{ error(“이름을 입력하세요”);
 exit; }

if(!ereg(“([^[:space:]])”, $content))
{ error(“내용을 입력하세요”);
 exit; }

 

//(5) DB에 데이터를 넣는다(=글 입력)
$sql = “insert into board (name, content) values (‘$name’,’$content’)”;

mysql_query($sql) or die(mysql_error());

//사용법은

//하나. insert into 테이블명 (필드명1, 필드명2,…) values (필드값1, 필드값2…) 을 변수에 넣는다

//둘. mysql_query($변수명)

 

//(6) 글 입력했다고 메시지 띄우고 마친다
echo

<script name=javascript>
location.href=’list.php$daytime’;

window.alert(‘글 입력했습니다’);
</script>
“;

?>

</body></html>

 

(4) 실행해본다

 

실행법은 간단합니다.

1. 우선 localhost/10-1.php 로 접속해서 이름과 내용을 적당히 쓰고 입력 버튼을 누릅니다

   나는 이름 : bbear, 내용 : hello world 라고 썼습니다

2. 글이 입력되었다고 메시지 뜰 것입니다

3. DB를 살펴봅니다

   윈도우 작업표시줄의 APMSETUP모니터 에서 마우스 우클릭 -> MySQL 관리 클릭 -> 아이디/비번 넣고 로그인(초기 아이디:root, 초기 비번: apmsetup) -> 좌측에서 oaphp 디비명을 클릭

 

 

위 그림과 같이 데이터가 들어있으면 성공입니다.

야매강좌 php9강 : POST전송과 입력검사

야매강좌 php9강 : POST전송과 입력검사 

 

POST전송에 대해서 계속 배워보겠습니다.

 

(1) 준비과정 

잊지 않으셨겠죠? APMSETUP Monitor 를 실행해서 Apache와 MySQL을 켜둡시다.

 

(2) 주석(주석문)이 뭘까?

참고삼아서 써두는 글을 주석이라고 합니다. 막상 프로그램이 돌아갈 때 아무 영향도 미치지 않는 글이죠.

앞으로 주석을 이용해서 설명을 해보고자 합니다.

// <- 이렇게 슬래쉬 2개 뒤에 글을 쓰면 주석문이 됩니다. 보통 초록색으로 표시합니다.

 

(3) 오늘 배울 것

7강에서는 한 쪽 php파일의 문자열을 포스트로 보내고, 다른 쪽 php 파일에서 받아보는 걸 했습니다.

이번에도 비슷합니다. 다만 입력검사를 해보겠습니다. 문자열에 공백이 있는지, 길이는 적절한지, 영문자 및 숫자로 쓰여졌는지 알아보는거죠.

입력검사는 두 가지로 합니다. 하나, 자바스크립트, 둘, php.

 

(4) Get1.php

Get1.php 파일을 코딩해봅시다. 코딩한다는 건 그냥 쓴다는 겁니다. 프로그래밍을 배우기 전까진 뭐 있어보이는 단어라 생각했겠지만 그 뿐이죠.

 

여기선 자바스크립트란 걸 배울겁니다. 자바스크립트도 프로그래밍 언어입니다. 주절주절 설명하자면 길지만 좀 유명한 언어라고만 알아둡시다.

 

 <html>
 <head>
  <title> 입력받기 </title>
 </head>

  <script language=”JavaScript”> //자바스크립트를 쓰겠다는 겁니다
 function check_input() //check_input이란 이름의 함수를 만듭니다 (함수 생성)
  {
  if(document.aaa.name.value == ”)  //만약 문서의 aaa.name값이 비어있다면,
  {
   alert(‘이름을 입력하세요’); //이름을 입력하라는 메시지박스를 띄우고
   document.aaa.name.focus();  //aaa.name에 포커스합니다. 포커스란 커서를 위치시킨다는 뜻이에요
  }
  else //그 외의 경우(=문서의 aaa.name값이 비어있지 않다면)
  {
   document.aaa.submit(); //문서의 aaa값을 전송합니다

  }

 }
 </script> //자바스크립트 끝

 

 <body>

  <form name=’aaa’ method=’post’ action=’result1.php’> //폼 이름은 aaa, 포스트 방식, 결과는 result1.php로!
 <input type=’text’ name=’name’ size=’20’> //name이란 이름의 입력 박스를 만듭니다

 <input type=’button’ value=’글 입력’ onclick=”javascript:check_input();”> //누를경우 check_input 함수 로드

  </form> //폼 끝

 </body>
</html>

 

 

[잠깐!] 함수를 만들고 부른다는 게 뭘까?(함수 생성과 로드)

언어마다 기존의 함수들을 갖고 있죠.

예를 들면 php 함수 중에선 echo. echo는 글자를 출력하는 함수죠.

자바스크립트 함수로는 위에서 본 alert가 있겠네요. 메시지 박스를 띄우는 함수입니다.

 

하지만 기존 함수 외에 우리도 함수를 만들 수 있습니다.

어떻게요?

</head>와 <body> 사이에 아래와 같이 쓰는거죠.

<script language=”JavaScript”>

function hamsoo()

{

alert(‘새로운 함수다!’);

alert(‘하하하!’);

}

</script>

 

 

그리고 body 안에 이런식으로 쓰는 겁니다.

<input type=’button’ value=’클릭’ onclick=”javascript:hamsoo();”>

실행해서 버튼을 클릭하면 메시지가 뜨겠죠? “새로운 함수다! 하하하!” 하고 말이죠. 이게 바로 함수를 만들어서 불러온겁니다. 별거 아니죠.

자주 쓰일 법한 것들을 함수로 만들어 놓으면 편합니다.

 

(5) result1.php

 <html>
 <head>
  <title> 결과보기 </title>
 </head>

 <body>

 

<? //php 언어를 쓰겠다는 뜻이죠. 참고로 자바스크립트를 쓰는건 <script language=”JavaScript”>였어요
  $name = $_POST[“name”];
//전송된 name값을 변수 $name에 넣습니다

  if(!ereg(“([^[:space:]])”, $name)) //ereg는 비교함수인데요.  $name이 공백인지 아닌지 비교하는 겁니다

  {
  echo “공백이 있으면 안됩니다”;
  exit;
  }

  if(!ereg(“(^[0-9a-zA-Z]{6,8}$)”, $name)) //0-9, a-z, A-Z의 영어 혹은 숫자, 6~8글자인지 비교합니다
  {
  echo “이름은 6~8자의 영문자 또는 숫자를 입력하세요”;
  exit;
  }
  echo “이름 = $name”; //위 조건문을 다 피하면 비로소 이름이 표시됩니다
?> //php사용 끝

 </body>
</html>

 

[잠깐!] ereg란?

ereg는 비교함수입니다. ereg(패턴, 문자열) 의 형식으로 쓰고, 문자열에서 패턴을 찾아봅니다.

즉 ereg(“([^[:space:]])”, $name)) 는 변수 $name에 공백이 있나 없나 보는겁니다.

([^[:space:]])라는게 좀 어려워보이긴 한데 자세히 설명할건 없고 공백이 하나라도 있으면 false값을 나타냅니다.

다만 ereg앞에 느낌표(!)가 붙어있네요. 느낌표는 반대의 의미를 갖습니다. 즉 공백이 하나라도 있을 경우 false가 아니라 true값이 나오게 되죠. 공백이 있으면 -> true -> if 조건 성립 -> if 내용 실행이 되는거죠.

 

복잡하다고요? 제 생각에도 그렇습니다.

그러니까 그냥 아래 소스를 어딘가에 보관해두면 됩니다.

if(!ereg(“([^[:space:]])”, $변수))

{

//공백있을 경우 실행할 것

}

공백이 있는지 확인할 때 붙여넣기해서 써버리면 되겠네요. 야매좋다는 게 뭡니까.

 

다음 if(!ereg(“(^[0-9a-zA-Z]{6,8}$)”, $name))도 마찬가지입니다.

영문자 혹은 숫자는 [0-9a-zA-Z]가 표현하고, {6,8}은 6자에서 8자라는 의미입니다.

많이 알면 다칩니다.

 

[잠깐!] exit란?

exit는 그 자리에서 문서를 빠져나갑니다. 그 줄에서 멈춘다는 얘깁니다.

만약 exit가 없다면 그 아래 줄을 전부 실행할 게 분명합니다.

 

(6) 실행해본다

실행해봅니다. get1.php와 result1.php 모두 C:\APM_Setup\htdocs 에 저장해두셨겠죠.

아시겠지만 해당 폴더에서 실행하면 안됩니다.

반드시 http://localhost/get1.php 으로 실행하시기 바랍니다.

야매강좌 php8강 : IF문

야매강좌 php8강 : IF문

 

오늘은 if문[이프문]에 대해서 배워보겠습니다. if문은 프로그래밍을 한다면 다 알아야하는겁니다.

 

(1) IF문은 중요해

만약 어떤 사람이 제게 “프로그래밍을 처음 배우는데 어떤 언어를 배울까요”라고 물어본다고 합시다.

저는 C(또는 VC++)와 자바를 배우라고 하겠습니다. 물론 저는 C도 못하고 자바도 못합니다.

심지어 저는 php도 못하죠. 하지만 강의를 하고 있네요.

전 야매니까요.

 

어쨋든 계속 말을 이어가자면, “프로그래밍을 처음 배우는데 어떤 개념을 배울까요”라고 물어본다고 합시다.

저는 변수와 if문을 배우라고 하겠습니다. 그만큼 중요하단 뜻이죠.

 

(2) IF문은 어떻게 생겨먹었나

if문을 어떻게 쓰는지는 언어마다 다릅니다. Basic, C, 자바 모두 다르게 생겼죠.

그러니까 자세한 문법같은 건 상관치 않고 가르치겠습니다. 역시 야매강좌..

 

아무튼 if문은 ‘조건분기’라고 보면됩니다. 아래를 봅시다. 

if(조건)

{

내용

}

 

이런식으로 쓰는 겁니다.

조건을 만족하면, 내용을 실행하게 됩니다. 조건을 만족못하면 내용을 실행 안합니다.

 

예를 들어 이런거죠.

if(x == 0)

{

printf(“x는 0입니다”);

}

 

 

이 경우에, x가 0일 경우 “x는 0입니다”를 출력하게 됩니다.

printf는 C언어에서 쓰이는 건데 대충 출력함수라고 보면 됩니다.

 

그럼 출력했을까요 안했을까요?

출력했겠죠. 모든 변수의 초기값은 0이니까요.

 

이건 어떨까요. else[엘스]라는게 있습니다.

 

x == 2;

if(x == 1)

{

printf(“x는 1입니다”);

}

else

{

printf(“x는 1이 아니네요”);

}

 

맨 첫 줄에 x는 2라고 했으니, (x == 2;)

if문에서 조건을 만족하지 못하게 됩니다. 그러면 else 안의 내용을 실행하게 되죠. “x는 1이 아니네요”가 출력되게 됩니다.

 

정리하면, 

if(조건)

{

조건을 만족하면 실행할 것

}

else

{

조건을 불만족하면 실행할 것

}

 

요런 식으로 되는거죠.

 

그리고 elseif [엘스이프]라는 놈도 있습니다.

if(조건1)

{

조건1을 만족하면 실행할 것

}

elseif(조건2)

{

조건2를 만족하면 실행할 것

}

elseif(조건3)

{

조건3을 만족하면 실행할 것

}

else

{

조건을 다 만족 못하면 이걸 실행

}

 

이런식으로 쓰는 거죠.

이 구조를 잘 이해하셔야 합니다. 이건 모든 프로그래밍의 핵심이죠. if가 없다면 프로그래밍은 항상 일방향적이었을 겁니다.

 

이런걸 봅시다.

 

x = 5;

if(x > 1)

{

printf(“x는 1보다 큽니다”);

}

elseif(x > 2)

{

printf(“x는 2보다 큽니다”);

}

 

이러면 뭐가 출력될까요?

“x는 1보다 큽니다”가 출력됩니다. if의 조건을 만족해버렸기 때문에(x > 1)

첫번째 내용만 실행해버리고 elseif의 조건은 체크조차 하지 않습니다.

 

“x는 2보다 큽니다”는 영영 볼 수 없는거죠.

 

만약 여기까지 이해가 안되셨다면 찬찬히 돌아보시죠. 반드시 이해하고 갑시다.

 

됐나요?

 

이거 하나는 기억합시다. if문에서 else와 elseif는 있어도 그만, 없어도 그만이라는 점.

if문은 그러니까 이런식으로 쓸 수 있습니다.

 

(1) if 혼자

(2) if-elseif

(3) if-elseif-elseif

(4) if-elseif-elseif-elseif … (elseif가 몇 개든 상관없다. 엄청 많으면 문제 생기겠다만 요새 컴퓨터 사양을 생각하면 몇 백~몇 천개도 상관없을 듯)

(5) if-else (if의 조건을 미충족하면 else의 내용을 실행하는거다. 이 말이 이해가 안되면 다시 정독!)

 

(6) if-elseif-else (if 조건을 체크하고, 불만족시엔 elseif 조건을 체크하고, 또 불만족시엔 else의 내용을 실행한다)

(7) if-elseif-elseif-else

(7) if-elseif-elseif-elseif-…-elseif-else (if와 else 사이 elseif는 몇 개든 상관없다)

 

안되는 건 다음과 같죠.

(1) if-else-else (이딴건 안된다. if 한 번에 else를 두 번 쓰는건 안됨)

(2) if-if-else (이것도 안됨. if를 두 번 쓰는게 아니라 if-elseif 로 쓰자)

 

if에 대해 잘 아셨나요?

이프, 엘스이프, 엘스!

 

p.s 조건 검사는 요런식으로 합니다

같다 ==

다르다 !=  (베이직 언어에서는 <>)

a가 b보다 크다 a > b

이 정도?

데이터셋 비교하는 엑셀매크로

데이터셋 비교하는 엑셀매크로

 

제목을 뭐라 붙여야 할지 모르겠는데… 

말 그대로 데이터를 비교하는 매크로다.

 

예컨대 가로 세로 nxm의 데이터셋(표)이 2개 있을 때

그 내용이 전부 일치하는지 검사할 수 있는 매크로다.

 

예제그림.jpg

 

예제그림에서 보듯이 왼쪽의 표와 오른쪽의 표는 얼핏 보기엔 똑같다.

그러나 왼쪽에는 홍길동, 오른쪽에는 임꺽정이 써있는 것처럼 불일치가 있을 수 있는데 그걸 경고메시지를 활용해 잡아낸다.

데이터셋이 많으면 많을수록 눈으로 잡아내기 어렵기 때문.

 

회사에서 ERP 수당입력을 하는데, 덕분에 나의 오류는 zero에 수렴한다.

한계점이 있다면 사후에(입력 다하고서) 오류를 잡아낸다는 것.

 

사전에(입력할 때부터) 오류가 없으면 좋겠지만 몇 백개 이상 입력하다보면 오류가 없을 수가 없다.

 

누가 이 회사 ERP를 코딩했는지 몰라도 애초에 입력(input)을 엑셀 시트로 할 수 있으면 좀 좋은가?

출력(output)은 엑셀파일로 되는데 입력은 안되게 해놨다니 아쉽다.

 

p.s.

사령부에서 행정병할 때 비슷한 걸 만들었던 적이 있다. 지금 회사에서 다시 만들었고.

그만큼 어디서나 쓰일 법한 유용한 매크로라서 범용가능하게 만들었다.

T모형 엑셀시뮬레이션

T모형 엑셀시뮬레이션 

 

이번학기 유통론을 들으며 만든 것.

그래프를 그리다가 갑자기 이렇게 만들어보면 재밌겠다! 해서 만든 것.

굳이 안 만드는게 더 편하고 시간도 짧게 걸리지만 재밌었으니까..

 

한 장의 기획서.jpg

 

 

교양수업 듣다가 아이디어가 떠올라서 바로 스케치.

 

결과물.jpg

 

만들 때 짜증났던 점은 VBA가 컨트롤 배열을 지원하지 않는다는거.

덕분에 아주 노가다로 코딩했다.

 

후기를 말하자면, 이런 것까지 잘 만들어놓고 막상 최종 보고서에서

그래프 잘못그려서 개망신 당했다는거=_=

바보다 바보.

야매강좌 php7강 : Post 전송

야매강좌 php7강 : Post 전송 

 

이번에는 포스트 방식으로 전송하는 법을 배워봅시다.

 

get.php

 <html>
 <head>
  <title> 포스트 전송 </title>
 </head>

 <body>
  포스트 전송
  <form name=’get’ method=’post’ action=’result.php’>
  입력창 <input type=’text’ name=’label’>
  <input type=’submit’ value=’전송’>
  </form>
 </body>
</html>

 

 

이런식으로 됩니다.

여태까지 과정을 잘 따라왔다면 이해하는 데 어렵지 않을거에요.

전송을 누르면 label이라는 입력칸의 내용이 result.php로 넘어가는거죠.

 

result.php

 <html>
 <head>
  <title> 결과 </title>
 </head>

 <body>
  <?
  $label = $_POST[“label”];
  echo “입력한 값은 $label 입니다”;
  ?>
 </body>
</html>

 

 

$label 에 포스트 방식으로 전송받은 label값을 받고

echo로 출력해주는 겁니다.

 

야매강좌 php6강 : 표로 디자인하기

야매강좌 php6강 : 표로 디자인하기 

 

표를 이용해서 사이트를 게시판스럽게 만들어봅시다.

기본적으로 html 소스로 표만드는 법을 배우면 되겠죠.

 

(1) 소스를 베끼세요

 <center>
  게시판.

  <table width=’600′ border=1>
  <tr>
  <td>내용</td>
  </tr>
  </table>

</center>

 

이게 기본적인 표 만들기입니다.

가로길이(width) 600 에, 테두리(border)가 1인 표이죠.

아래 그림처럼 됩니다.

 

(2) 여기서 소스를 조금 변경해보겠습니다. 칸을 추가

  <table width=’600′ border=1>
  <tr>
  <td>내용1</td>

  <td>내용2</td>
  </tr>
  </table>

 

이러면 아래와 같이 됩니다.

(3) 소스를 또 바꿔보죠. 칸을 하나 더 추가!

  <table width=’600′ border=1>
  <tr>
  <td>내용1</td>

  <td>내용2</td>

  <td>내용3</td>
  </tr>
  </table>

 

이러면 아래와 같이 됩니다.

눈치가 빠르신 분들은 알겠지만,

<tr>로 줄을 만들고,

<td>로 칸을 만드는 겁니다.

 

(4) 줄을 추가

  <table width=’600′ border=1>
  <tr>
  <td>내용1</td>

  <td>내용2</td>

  <td>내용3</td>
  </tr>

  <tr>

  <td>둘째줄</td>

  </tr>
  </table>

 

아래와 같이 됩니다.

 

아시겠죠?

표 만들기는 자주 해 될 것이기 때문에, 조금 시간을 들여 설명했습니다.

근데 어차피 나모웹에디터같은 걸 쓰기 때문에 html을 깊게 공부할 필욘 없습니다.

기본만 알아두면 되죠.

하긴 php같은것도 기존의 소스를 변경해서 쓰는게 빠를겁니다. 기본을 배워두고, 소스 보는 법을 익혀두는겁니다.

 

(5) 본격적으로 시작

다음과 같이 만들어봅니다.

현재 모양은 별로 예쁘지 않지만, 소스는 다음과 같습니다.

 <center>
  게시판.

  <table width=’600′ border=1>

  <tr>
  <td>이름</td>
  <td><input></td>
  </tr>

 

  <tr>
  <td>비밀번호</td>
  <td><input></td>
  </tr>

 

  <tr>
  <td>E메일</td>
  <td><input></td>
  </tr>

 

  <tr>
  <td>사이트</td>
  <td><input></td>
  </tr>

 

  <tr>
  <td>제목</td>
  <td><input></td>
  </tr>

 

  <tr>
  <td>내용</td>
  <td><input></td>
  </tr>

 

  <tr>
  <td colspan=’2′><input type=’button’ value=’글쓰기’></td>
  </tr>

  </table>

 

* td colspan=’2’는 두 칸을 차지하라는 겁니다.

 

(6) 좀 더 그럴싸하게 디자인하기

그럴듯하게 만듭시다.

 

소스는 다음과 같습니다.

 <html>
 <head>
  <title> New Document </title>
 </head>

 <body>
  <center>
  ~게시판~

 

<form name=’FORMNAME’ method=’post’ action=’inputexe.php3′>

  <table width=’600′ border=1>
  <tr>
  <td width=’20%’>이름</td>
  <td width=’80%’><input type=’text’ name=’name’ size=’20’></td>
  </tr>

 

  <tr>
  <td width=’20%’>비밀번호</td>
  <td width=’80%’><input type=’text’ name=’passwd’ size=’20’></td>
  </tr>

 

  <tr>
  <td width=’20%’>E메일</td>
  <td width=’80%’><input type=’text’ name=’passwd’ size=’50’></td>
  </tr>

 

  <tr>
  <td width=’20%’>웹페이지</td>
  <td width=’80%’><input type=’text’ name=’passwd’ size=’50’></td>
  </tr>

 

  <tr>
  <td width=’20%’>제목</td>
  <td width=’80%’><input type=’text’ name=’passwd’ size=’50’></td>
  </tr>

 

  <tr>
  <td width=’20%’>내용</td>
  <td width=’80%’><textarea name’content’ rows=10′ cols=’50’></textarea></td>
  </tr>

 

  <tr>
  <td colspan=’2′ align=’center’><input type=’button’ value=’글쓰기’ onClick=”javascript:check_input();”></td>
  </tr>
  </table>
</form>
 

  </center>
 </body>
</html>

 

 

이런겁니다.

이 소스에서 배울 수 있는건 다음과 같습니다.

 

1) 칸의 길이를 조절할 수 있습니다. <td width=’20%’> 하면 전체의 20% 너비가 됩니다.

 

2) input 태그는 속성이 여러개입니다.

   (1) type : 입력할 방식지정합니다.

   ex) text(텍스트), password(패스워드), checkbox(체크박스), radio(라디오버튼), submit(폼데이터전송), reset(취소), hidden(숨김), image(이미지출력)

   (2) name : 전송할 변수 지정합니다.

   (3) value : 전송되는 값을 지정합니다.

   (4) size : 입력양식의 보이는 길이를 지정합니다.

   (5) maxlength : 입력할 수 있는 최대 문자수

 

3) form 태그의 속성은 다음과 같은것들이 있죠.

   (1) name : 이름지정

   (2) method : ‘get’이나 ‘post’를 지정. get은 데이터가 헤더에 붙어 가기때문에 짧은것만 전송됩니다. 길다면 ‘post’로 하면 데이터가 내용에 붙어가죠.

   (3) action : CGI 프로그램이 있는 URL을 지정합니다. CGI란 데이터전송체계 정도로 아시면됩니다.

   (4) target : 결과값을 보여줄 창의 이름을 지정합니다.

 

4) textarea 태그

   (1) name : CGI로 전달될 변수

   (2) cols : 너비 지정. 글자수라고 보면 됩니다.

   (3) rows : 높이 지정. 세로줄 수라고 보면 됩니다.

 

다음강에서 뵙겠습니다.

야매강좌 php5강 : MySQL 구축

야매강좌 php5강 : MySQL 구축 

 

MySQL이란 뭘까요? 그건 데이터베이스의 일종입니다. PHP가 지원하는 DB는 10가지가 넘지만 그냥 MySQL을 써봅시다.

 

그냥 배우면 재미없으니까 우리 게시판 하나 만들어봅시다.

우선 APMSETUP Monitor 를 실행합니다.

 

 

작업표시줄 우측에 APM 모니터 아이콘위에서 마우스 우클릭, 그러면 MySQL관리 라는 메뉴가 있습니다.

클릭합니다.

 

아이디와 비밀번호는 기본적으로

아이디 : root

비밀번호 : apmsetup

입니다. 나중에 비번 바꾸세요.

(비밀번호를 바꿔둘 필요는 있습니다. APM이 가동되어있다는 것 = 지금 홈페이지가 돌아가고 있다는 뜻입니다. 이 순간 누군가 당신의 ip를 입력하면 당신이 만들어둔 index.php로 접속하게 되죠. 이 상태라면 기본아이디와 기본비번을 아는 누군가가 내 홈페이지를 제어할 수 있다는 뜻입니다. 하지만 뭐, 그렇게 컴퓨터 잘하는 사람들이 왜 당신 DB를 건드리겠습니까ㅋㅋㅋ 일단 그냥 합시다)

 

로그인하면 아래와 같이 나옵니다.

 

아래와 같은 상태에서,

DB를 새로 하나 만들어보겠습니다.

이름은 oaphp라고 쓰고 만들기를 클릭.

 

 

이제 oaphp라는 DB가 생긴겁니다. 쉽죠?

여기에 board라는 테이블을 만들겠습니다.

이름은 board, 필드는 10개입니다.

대충 10칸의 방(필드)이 있는 집(테이블)이라고 보면 되죠.

 

board, 10을 입력하고 실행을 클릭.

 

 

재밌는 화면이 나오네요.

 

 

당신은 그러니까 이제, 각 필드의 이름과 속성을 지정하면 됩니다.

게시판에 쓰일 것들이죠. no, name, passwd, email 뭐 이런겁니다.

시작해보죠.

 

필드
no
name
passwd
email
url
title
content
count
ip
daytime

종류

int
char
char
char
char
char
text
smallint
char
int

길이/값

11
10
15
60
60
60

6
15
11

보기

unsigned

 

 

 

 

 

unsigned

 

unsigned

인덱스

primary

 

 

 

 

 

 

 

 

 

 A_I

체크

 

 

 

 

 

 

 

 

 

 

이렇게 입력합시다.

나머지 표시 안해둔건 그냥 공란으로 두면 됩니다.

그리고 저장버튼 클릭!

 

 

이렇게 됩니다. 준비완료!

야매강좌 php4강 : txt파일로 카운터를 만들자

 

 

4강 : txt파일로 카운터를 만들자 

 

카운터라는거 아십니까? 투데이같은거 표시하는거죠. “본사이트 일일방문자수는 n명” 따위가 카운터입니다. DB(데이터베이스, 줄여서 디비)를 이용하면 좋겠지만 아직 초보단계니까 txt파일을 이용해봅시다.

 

(1) C:\APM_Setup\htdocs 에 counter.txt 라는 파일을 만들어둡니다.

내용은 0 하나만 써두시고요. 초기값이죠.

 

(2) 오늘 배울 소스는 다음과 같습니다.

<html>
 <head>
  <title> New Document </title>
 </head>

 <body>
  <?php
$data = file(“counter.txt”);
$count = trim($data[0]);
$inc_count = $count + 1;

$fp = fopen(“counter.txt”, “w”); #
fwrite($fp, $inc_count);
fclose($fp);

echo “카운터 : $count”;

  ?>
 </body>
</html>

 

저는 이 파일이름을 noname2.php 로 저장했습니다.

http://localhost/noname2.php 로 확인해보니 잘 됩니다. 새로고침하니까 카운터가 올라가네요.

 

잘되네요.jpg

 

3) 프로그래밍을 배우는 법은 항상 똑같습니다!

지금 제가 위에 쓴 소스를 베껴서(복사-붙여넣기) 되는지 안되는지 우선 확인하세요!

 

실행에 성공했다면 혼자 스스로 한 줄씩 들여다보는겁니다.

한 줄씩 보며 원리를 파악하는게 최고입니다.

 

물론 고통스럽죠, 원리 파악이라는게. 근데 무언가를 배운다는건 다 그래요.

 

4) 일단 상식하나 배우고 갑니다.

 

상식 하나 : 변수

$(달러)는 변수를 나타냅니다. $뒤에 이름을 붙이면 그게 변수죠.

$data, $man, $energy…

 

사용은 아래와 같이 하면 되겠죠.

$a = 1+1;

“1+1을 변수a에 집어넣어라”라는 뜻이니까, a값은 2가 되겠네요.

 

변수를 모른다면 저번 3강을 참조하시면 됩니다. C, PHP, 자바를 막론하고 필수상식이죠.

 

5) $data = file(“counter.txt”);

이게 무슨 뜻일까요.

data라는 변수에 counter.txt라는 파일을 집어넣는거네요.

 

상식 둘 : 함수

위의 file과 같은걸 ‘함수’라고 합니다. 여러분도 함수를 하나 알고있죠. echo.

echo는 기본적인 출력함수입니다, C에는 비슷한걸로 printf란 함수가 있어요.

그냥 “뭔가 하게해주는 걸” 함수라고합니다. 너무 대충 설명했나?

file은 텍스트파일 따위를 가져오는 함수 정도가 되겠네요.

 

 

근데 텍스트파일은 여러 줄이니까

대충 배열이라는 걸로해서 들어가겠네요. 힘들겠지만 참고 상식하나만 더 들읍시다.

 

상식 셋 : 배열

배열이라는게 있습니다.

$mat 라는 변수가 있다고 합시다. 근데 이게 여러개 필요한 경우가 있어요.

 

그럼 $mat[0], $mat[1], $mat[2]… 이런식으로 변수를 만들어둘 수 있죠.

이런걸 배열이라 합니다.

이건 1차 배열이죠.

 

$mat[0,0], $mat[0,1] … 이런식으로 가면 2차 배열.

3차 배열도 만들 수 있고요. $mat[4,2,3] 이런거요.

 

 

다시 텍스트파일 얘기로 돌아가서,

txt파일의 첫줄은 $data[0]에, 두번째줄은 $data[1]에, 세번째줄은 $data[2]에… 순차적으로 들어갈겁니다.

file함수를 썼기 때문에.

다만, 지금 저희가 만든 txt파일에는 0 이라는 한 줄 밖에 없으니까

$data[0]에만 값이 들어갔겠네요.

 

정리하면,

file 함수

텍스트파일을 변수에 넣어준다. 여러줄이니까, 첫줄부터 행렬식으로 넣어준다.

즉, $a = file(“텍스트파일.txt”); 은 텍스트를 한줄씩 a변수에 넣어준다. a[0], a[1],… a[n]까지

 

 

6) $count = trim($data[0]);

이건 count라는 변수에 data[0]을 넣는거네요.

즉, 카운트변수에 첫줄이 들어갑니다(“카운트라는 변수가 카운트.txt 첫줄을 기억합니다”와 같은말)

그럼 trim이란 뭘까요?

 

trim 함수

앞뒤 공백이나 개행문자를 없애준다. a의 값이 ”   하하   ” 라고 하면 trim($a); 하면 “하하”로 값이 바뀐다.

지금 여기서 tirm을 쓰는 이유는 뒤의 개행문자를 없애기 위함이다.

개행문자란 엔터키같은 숨겨진 문자를 말한다. 텍스트파일은 엔터키를 기억하고 있다.

예컨대 ‘0’이 아니라 ‘0\n’ 이렇게 기억하고 있다.

그래서 trim을 써주면 뒤의 \n이 떨어져나가게 된다.

 

chop 함수

비슷한건데, 뒤쪽만 없애주는거다.

chop($a); 이런식으로 쓰면된다.

 

 

7) $inc_count = $count + 1;

설명 필요없죠.

인크_카운트 변수는 지금 카운트 변수에 1을 더하게됩니다.

그럼 처음에 들어가면 1, 두번째로 들어가면 2, 세번째로 들어가면 3의 값을 갖겠죠.

 

(이게 이해가 안간다면 차근히 원소스를 보시기 바랍니다. 이해되어야만 해요!

이해 안간다면 ‘변수’를 모르거나 심각한 문제입니다. 절대로 알고 넘어가십시오)

 

8) $fp = fopen(“counter.txt”, “w”); #

중요한 부분이죠.

fopen 함수

파일을 여는 함수죠. “w”는 열때 모드를 지정합니다.

예컨대

“r” : 읽기모드(read)

“w” : 쓰기모드(write)

“a” : 추가하기(append)

이런거죠.

쓰기모드로 열어놨으니 counter.txt를 변경가능하다는거죠. 오호~

 

9) fwrite($fp, $inc_count);

fwrite 함수

파일을 새로 쓰는거죠.

“$fp에다가 $inc_count를 쓴다”라는 의미정도.

 

$fp는 아까 우리가 쓰기모드로 불러온 counter.txt죠.

 

10) fclose($fp);

flose 함수

fopen을 했으니 fclose를 해야죠.

 

절대법칙, 연 것은 닫아준다.

나중에 게임프로그래밍 할때 이런걸 잘 못하면

게임이 꺼져도 메모리가 새게되죠(메모리 누수=낭비)

 

 

11) echo “카운터 : $count”;

카운트 변수를 출력합니다. echo함수는 알고 계시죠?

 

——————————————————————————————————–

이상으로 강좌를 마치며.

 

오늘 함수를 참 많이 배웠는데요. 그냥, “아 이게 이러한 원리구나”

“대충 이런 함수가 있구나”정도만 알면됩니다.

 

나중에 뭔가를 만들고 싶을 때 어렴풋한 기억으로 검색하고,

이런 예제보면서 자기 프로젝트에 적용시키면 되는겁니다.

 

앞뒤 공백 짜르는 함수가 있다는거(trim), 텍스트 파일을 불러내서 고칠 수 있다는거(fopen으로 열고, fwrite로 새로 쓰며, fclose로 닫는다), 화면에 글자를 출력할 수 있다는거(echo) 정도 아시면 되겠네요.

 

수고하셨습니다.

야매강좌 php3강 : 변수란 무엇인가, 쉽게 알자

3강 : 변수란 무엇인가, 쉽게 알자

 

역시 기초 중의 기초죠. 변수란 무엇인가.

변수는 “그릇”이나 “통”같은 겁니다. 원래 변수란 “변하는 수”라는 뜻인데 그런건 잊어버립시다. 그릇입니다.

 

그릇에 밥을 넣으면 밥그릇이 되고, 국을 넣으면 국그릇이 되죠.

 

여기 a라는 변수가 있다고 합시다. 건드리지 않은 변수의 값은 보통 0입니다.

지금 a는 0이죠.

그런데,

 

a = 1+1;

 

이제 a의 값은 어떻게 되었을까요? 유추해보세요.

답은 2입니다.

1에 1을 더한 값이 a가 되었죠.

 

여기서 한 번더.

 

a = a+3;

 

이제 a의 값은 어떻게 되었을까요?

a의 값은 5입니다. 왜 그런거죠?

 

여기서 등호(=)는 “같다”라는 뜻이기보다 왼쪽을 향한 화살표”←”의 뜻을 가집니다.

 

a ← a+3;

 

나 다름없다는거죠.

“새로운a값은 = 기존a에 3을 더한것”으로 해석가능합니다.

 

그래서 현재 a의 값 2에 3을 더했으니 답은 5죠.

여기까지 이해안되시는 분은 차근히 다시 읽어보시고 넘어갑시다.

 

이제 a는 5입니다.

그럼 이건 어때요?

 

b = b+a;

 

이렇게되면 b값은 얼마인가요?

b값은 5죠. 0+5은 5.

 

마지막으로 이런걸 풀어보죠.

 

a = 6;

b = 2;

c = “사과”;

 

d = a+b;

e = a+c;

 

이러면 d는 뭐고 e는 뭘까요?

답은, d는 8입니다.

e는 숫자변수와 문자변수를 합했으니 오류가 나버립니다.

 

다만 a와 c를 문자변수로 바꿔서 처리할 수 있는데요.

이 경우 +는 &의 의미를 지니게 되죠. 뭔 소리냐고요?

 

c = “사과”;

a = “6”;

 

e = a+c;

 

만약 이런식이 된다면 e의 값은 “6사과”가 될겁니다.

이상으로 변수 강의를 마칩니다.

야매강좌 php2강 : 헬로우 월드

2강 : 헬로우 월드 

 

안녕하세요. 2강이네요. 시작 전에, 아파치랑 MySQL을 켭시다. (Apache Access log 와 MySQL Console(root) 을 실행하면 되죠) 이제 이 2가지는 언급하지 않아도 기본적으로 켜두는걸로 합시다.

아니면 APMSETUP Monitor 를 실행해서 아파치와 MySQL 두 가지를 Start 상태로 해둬도 됩니다.

 

헬로우 월드라고 들어보셨나요? 모든 프로그래밍의 첫걸음으로 헬로우 월드라는 걸 화면에 띄우죠. 해봅시다.

먼저 http://localhost/ 로 들어가 봅시다.

 

 

내용을 정리하면 이렇습니다.

 

-C:/APM_Setup/htdocs 디렉터리에 홈페이지를 작성해서 넣으시기 바랍니다.

-지금 화면이 계속 보인다면 C:/APM_Setup/htdocs/index.php 파일을 삭제해 주시기 바랍니다.

 

PHP 설정파일 [설치디렉터리]\APM_Setup\php.ini
MySQL 설정파일 [설치디렉터리]\APM_Setup\Server\MySQL5\data\my.ini
MySQL Data 파일 위치 [설치디렉터리]\APM_Setup\Server\MySQL5\data
Apache 설정파일 [설치디렉터리]\APM_Setup\Server\Apache\conf\httpd.conf 
Apache 로그 위치 [설치디렉터리]\APM_Setup\Server\Apache\logs 
PHP Info http://127.0.0.1/?page=phpinfo
phpMyAdmin http://127.0.0.1/myadmin/

 

이게 다 무슨 소릴까요?ㅋㅋㅋㅋㅋ 복잡하니 나중에 이해합시다.

다른건 됐고 C:드라이브의 APM_Setup\htdocs\index.php가 저 파일이라는 것만 아시면됩니다.

index.php를 새로 작성하면 새로운 사이트를 만날 수 있겠군요.

 

에디트플러스를 켭시다.(혹은 메모장)

 

새 문서를 만들고, 아래와 같이 써서 htdocs폴더 안에 index.php 로 저장합시다.

 

<html>
<head>

<title>New Index</title>

</head>
<body>
<?php
echo “Hello World”;
?>
</body>
</html>

 

그럼 이제 http://localhost/ 는 아래와 같이 나옵니다.

 

 

‘Hello World’ 가 나오게 되는거죠.

일반적으로 php언어는 html언어와 같이 쓰이게 됩니다. 위 코드도 마찬가지고요.

둘 다 몰라도 됩니다. 알아가면 되죠, 뭐.

 

일단 html은, <html>로 엽니다. 그리고 </html>로 닫죠. 모든 소스를 이 안에 두는겁니다.

그리고 그 안에 머리, 몸통을 갖고 있습니다.

예컨대 이런겁니다.

 

기본 : <html></html>

머리가 생기면 : <html><head></head></html>

머리, 몸이 생기면 : <html><head></head><body></body></html>

 

여기서 열고 닫는다가 중요한데요. 몸통의 경우도 <body>로 열고 </body>로 닫는 모습이 보이죠.

단, 닫고 싶지 않다면 한 줄에 끝내버리면 됩니다.

“<head>

<title>New Index</title>

</head>”를

“<head><title>네이버 블로그</title>” 이런식으로 바꾸면 되죠.

 

그리고 body안에는 본격적인 코드가 들어가는데, 지금 기초적인 php 소스가 들어가 있습니다.

바로 echo함수죠.

 

php는 이렇게 엽니다 : <?php

그리고 이렇게 닫죠 : ?>

이 때 php언어가 쓰이게되는게 바로 echo라는 겁니다.

echo “Hello World”; 라고 써두면 이게 화면에 뜨게되는겁니다. 헬로우 월드말고 다르게 바꿔봐도 좋겠네요.

 

3강에서 계속됩니다.

 

야매강좌 php1강 : 소개.

야매강좌 php1강 : 소개.

 

안녕하세요. PHP란 뭘까요? 그건 사이트를 제작시켜주는 언어입니다. 컴퓨터에서 흔히 언어(랭귀지)라는 말을 많이 쓰죠. C언어, 베이직언어, 그런 것처럼 PHP는 웹프로그래밍 언어입니다.

언어아시죠? 영어, 불어, 중국어. 공통적으로 1)배우면 편리한데 2)배우기 어렵다 는 특징이 있겠습니다.

 

그래서 제가 PHP를 가르쳐드리겠습니다.

그러기 위해선 세팅이 필요합니다. 원래 프로그래밍은 세팅이 제일 피곤한 법이죠.

 

1. APM SETUP7을 설치한다.

http://blog.naver.com/bb_/70168800949 를 참고하시기 바랍니다. 혹은 구글에서 검색해서 받으시덩가

 

2. EditPlus를 설치한다.

http://blog.naver.com/bb_/70168799658 를 참고하시기 바랍니다. 혹은 검색해서 받으시덩가

 

이상으로 1강 마칩니다.

아케이드(슈퍼마리오류) 충돌검사

아케이드(슈퍼마리오류) 충돌검사 

 

일반적인 슈팅게임에서는 상자와 상자가 충돌했는가만 검사하면 되지만

아케이드 장르에서는 주인공이 상자의 윗면과 충돌했는가, 아랫면과 충돌했는가 등에 따라 행동이 달라진다.

 

1. 상자(네모) 2개 설정

박스1의 좌표 X1, Y1

박스1의 가로길이 W1, 박스1의 세로길이 H1

박스2는 X2, Y2, W2, H2

 

2. 일반적인 박스 2개 충돌

X1 – W2 < X2

X2 < X1 + W1
Y1 – H2 < Y2
Y2 < Y1 + H1

위 네가지 조건이 만족하면 충돌이다.

 

3. 아케이드에서 박스충돌

Function CkCrash(X1, Y1, W1, H1, X2, Y2, W2, H2) ‘충돌검사(Check Crash)

Crash = False

If X1 – W2 < X2 Then
If X2 < X1 + W1 Then
If Y1 – H2 < Y2 Then
If Y2 < Y1 + H1 Then

‘충돌했다
Crash = True
    ‘x차이값 산출
    If X1 + W1 – X2 < X2 + W2 – X1 Then
    CrashX = X1 + W1 – X2
    CrashMX = 2 ‘왼면
    Else
    CrashX = X2 + W2 – X1
    CrashMX = 1 ‘오른면
    End If
   
    ‘y차이값 산출
    If Y1 + H1 – Y2 < Y2 + H2 – Y1 Then
    CrashY = Y1 + H1 – Y2
    CrashMY = 4 ‘윗면
    Else
    CrashY = Y2 + H2 – Y1
    CrashMY = 3 ‘아랫면
    End If
   
    ‘어느면 충돌인지 산출
    If CrashX < CrashY Then
    CrashM = CrashMX
   
    Else ‘CrashX > CrashY 또는 CrashX = CrashY
    CrashM = CrashMY
    End If
   
    Exit Function
   
End If
End If
End If
End If

Crash = False
CrashM = “”
End Function 

Crash의 값이 True면 충돌한 것이며,

CrashM의 값이 1이면 오른면 충돌, 2면 왼면 충돌, 3이면 아랫면 충돌, 4면 윗면 충돌이 된다.

 

4. 아케이드에서 박스 충돌(상자 2개가 동일한 정사각형일때)

HW에 한 변의 길이를 넣는다.

(예를 들어 40×40 정사각형이라면 HW=40을 미리 넣어둔다)

 

‘충돌체크(같은크기)
Function CkCrash2(X1, Y1, X2, Y2) ‘충돌검사(Check Crash)

Crash = False

If X1 – HW < X2 Then
If X2 < X1 + HW Then
If Y1 – HW < Y2 Then
If Y2 < Y1 + HW Then

‘충돌했다
Crash = True
    ‘x차이값 산출
    If X1 + HW – X2 < X2 + HW – X1 Then
    CrashX = X1 + HW – X2
    CrashMX = 2
    Else
    CrashX = X2 + HW – X1
    CrashMX = 1
    End If
   
    ‘y차이값 산출
    If Y1 + HW – Y2 < Y2 + HW – Y1 Then
    CrashY = Y1 + HW – Y2
    CrashMY = 4
    Else
    CrashY = Y2 + HW – Y1
    CrashMY = 3
    End If
   
    ‘어느면 충돌인지 산출
    If CrashX < CrashY Then
    CrashM = CrashMX
   
    Else ‘CrashX > CrashY 또는 CrashX = CrashY
    CrashM = CrashMY
    End If
   
    Exit Function
   
End If
End If
End If
End If

 

근본적으로 3번과 같은 소스이다.

초보VB코더의 참고사이트

초보VB코더의 참고사이트

 

1. http://hyurichel.tistory.com/

VB내용은 아니지만 전체적으로 초보 프로그래머가 참고하기 좋은 곳.

 

2. http://forum.gamedevid.org/index.php?topic=8702

VB6로 만들어진 3D게임들. 한 외국인 네티즌의 자작 3D게임들이다.

모든 소스를 공개한 이 용사에게 박수를 보낸다.

 

3. http://directx4vb.vbgamer.com/

VB로 다이렉트X를 공부할 때 유용한 곳.

C언어 기초 (C언어 벼락치기)

C언어 기초 (C언어 벼락치기)

/* */ 여러줄 주석
// 한줄주석

◇디버그 – 프로시저단위 실행(F10)

◇ #include <stdio.h> 헤더파일을 포함 스트디오-에이치

◇ int main(void) 메인함수 시작. 인트메인보이드
  {   출력타입int / 함수이름main / (입력타입void)
  }   void는 입력이 없다는 의미다.

◇ return 0;  //외부로 0값 반환

◇ printf(“문장”); 문장을 출력함
   printf(“문장”\n); \n = 줄바꿈
   print(“%d”, x); 변수값 출력

◇ int x;  변수 선언

◇ int x,y,sum;  변수 여러개 선언

◇ int x = 100, y = 200; 변수 선언과 초기화
  ※변수 선언은 위쪽에 해둔다(아니면 오류발생)

◇자료형 (32비트=4바이트!)
정수형변수  short(16비트:3만2천), int(32비트:21억), long(32비트)
실수형 (부동소수점형) float(32비트), double(64비트), long double(64비트)
문자형   char

unsigned int x;  부호없는 int형(마이너스값 없다).
   같은 32비트지만 21억이 42억으로 늘어난다

◇ 10 % 3  나머지 구하기(프로%)

※거듭제곱 연산자는 없다. 곱하기를 두 번해야함 a * a
  거듭제곱 : <math.h> pow(2.0, 3.0) 2의 3제곱
  제곱근(루트) : <math.h> sqrt(값) 값의 제곱근

◇ scanf(“%d”, &x); 변수값 입력받기
  ※&x는 x의 변수주소를 뜻한다. 택배를 받을 때 주소가 필요한 것과 같다.

  ※ scanf(“%c”, &x); 로 2번 받으면 다음 것이 동작하지 않음.
     이유는 엔터키에 의해 버퍼에 줄바꿈문자인 \n이 남았기 때문.
     %d는 괜찮지만 %c는 모든 문자를 다 받기 때문.
     이럴때는
     scanf(” %c”, &c);  //공백 문자는 입력받지 말라는 의미
     또는 사이에
     fflush(stdin); //버퍼 지우기

◇형식지정자  %d 10진 정수 printf(%d, 10);
   %f 실수  printf(%f, 3.14);
   %c 문자  printf(%c, ‘a’);
   %s 문자열  printf(%s, “hello”);

   %lf double형의 실수
   %08X 8자리의 16진수로 출력하라는 형식지정자
    printf(%08X, 3);

   %10.3f float에서 전체 10자리 중 소수는 3자리
   %e 1.2345e10 과 같이 지수부분 표현 
※형식지정자와 변수의 타입은 같아야 한다
※피연산자가 전부 정수면 정수연산(소수점 이하 버림,내림연산)
  피연산자가 하나가 실수면 실수연산

◇형변환
(1)자동 : 연산시 높은 자료형으로 통일됨
(2)명시적 형변환
 (int) (x + y)

◇관계 연산자(크기비교)
x == y
x != y 다르다
x > y
x < y
x >= y 크거나 같다
x <= y 작거나 같다

&& and
|| or
!(조건) Nor (1외의 모든값을 0으로)

※  !-3 1 음수도 참이 된다. 0이 아니면 참
    !100 1
    !0 0
 
 1 && 0 0
 1 || 0 1 하나라도 참이므로 참
 !1 0

(2 < x) && (x < 5)

◇조건 연산자
a = (x > y) ? x : y;

※절대값 계산
a = (x > 0) ? x : -x;

◇비트 연산자
& 비트and
| 비트or  하나라도 1이면 1
^ 비트XOR  두값이 다르면 1(같으면 0)
<< 좌로 이동
>> 우로 이동
~ 비트Not  물결은 반대로. 0->1, 1->0
◇실수비교하기
(fabs(x-y)) < 0.0001
※ fabs() 실수의 절대값구하는 함수

◇변수 선언

float x = 0.0;

x = 100u;  unsigned int
x = 100l;  long
x = 100ul;  unsigned long

x = 3.141592;  부동소수점의 경우 자동 double로 저장됨
x = 3.141592F;  4바이트 부동소수점에서 float형 상수 만들기

◇16진수
0x0
0x1 0x2 0x3 0x4 0x5
1 2 3 4 5

0x6 0x7 0x8 0x9 0xa
6 7 8 9 10

0xb 0xc 0xd 0xe 0xf 0x10
11 12 13 14 15 16

◇기호상수
※(1)디파인
#define EXCHANGE_RATE 1120
※통상 대문자로 함. 디파인은 세미콜론 붙이지않는다(맨위 변수선언부에 씀)

※(2)콘스트
const int EXCHANGE_RATE = 1120;
※후에 값을 변경가능, 변수선언처럼 세미콜론 붙인다(인트메인보이드 안에 쓸수있음)

◇고정소수점
◇부동소수점 : 부동은 “떠다니는” 소수점. 움직이지 않는다는게 아님! 32비트(float)에서도 값을 나타내기위해 부호(1비트) 가수 부분(23비트)과 지수부분(8비트)으로 나눠 표현

123.45  = 1.2345e2
12345.0  = 1.2345e4
0.000023  = 2.3e-5
2000000000  = 2.0e9
※부동소수점 연산엔 오차가 발생. 오차줄이려면 float보다 double을.

◇아스키코드로 변수선언
(1) char code = 65;
(2) code = ‘A’;

◇아스키코드로 계산하기
char code = ‘A’;
printf(“%d %d %d”, code, code+1, code+2); //65,66,67 출력
printf(“%c %c %c”, code, code+1, code+2); //A,B,C 출력
※따라서

◇경고음(비프음 내기)
(1) char beep = 7; printf(“%c”, beep);
(2) char beep = ‘\a’; printf(“%c”, beep);

◇이스케이프 시퀀스
\0 널문자
\a 비프음이 남
\b 백스페이스
\t 수평탭(다음 탭위치로 감)
\n 줄바꿈
\v 수직탭
\f 폼피드(프린터에서 다음 페이지로 넘길때 등)
\r 캐리지 리턴. 커서를 현재 라인의 시작위치로
\” 큰따옴표 자체
\’ 작은따옴표 자체
\\ 역슬래시 자체

◇sizeof(변수)  변수크기를 바이트로 표현

◇반올림하기
(1) round_x = (int) (x + 0.5); //원리는 0.5를 더한후 정수로 형변환
(2) round_x = (int) (x < 0 ? x – 0.5 : x + 0.5); //음수도 포함할경우

◇증감 연산자   ※대입시
a = x++; x값 대입 후 증가
b = ++x; x값 증가 후 대입

y = x = 3; 우측부터 수행

◇조건문

(1)
if (조건)
 결과;

x가 0이 아닐때 if(x != 0) ★ if(i)  i가 0이 아닐때
x가 0일때 if(x == 0) ★ if(!i) i가 0일때

(2)
if(조건)
 결과;
else if(조건)
 결과;
else
 결과;

◇다중분기문 switch

switch(number)
{
case 0:
 문장;
 break;
case 1:
 문장;
 break;
case 2:
 문장;
 break;
default:  예외를 생각한 default. 생략해도 무방하다.
 문장;
 break;
}

※break가 없으면 그 다음줄로 넘어간다

※case 뒤는 반드시 정수상수

※5개 이상일시 써보자

◇goto문

goto gameover;
   .
   .
   .
gameover:  //레이블을 붙인다
 printf(“오류발생”);

◇반복문 while 조건식이 참이면 반복실행
while (조건식)
 문장;

while(i) i가 0이 아닐때

◇반복문 do..while

do
{
 반복문장;
}
while(조건식)

※실행후 검사, 그러므로 적어도 1번은 실행된다!

◇for문(초기식; 조건식; 증감식)

for(i=0; i<10; i++)
반복문장;

반복할게 없다면 null문장도 된다.
for(i=0; i<10; i++)
; //널 문장

※ sum += i //sum에 i가 더해진다.
※ 초기식에서 2개 이상 초기화가능 for(i=0, sum=0; i<100; i++)
※ 초기식은 기타문장도 가능  for(printf(“반복시작”), i=0; i<100; i++)

◇반복문 나가기
break;

◇반복문 재시작
continue;
뒤의 과정을 생략하고 조건식으로 돌아감

◇키입력 : _kbhit() 키를 누르면 1을 반환
if(_kbhit())

◇1의 자리수구하기 : n % 10
  10의 자리수구하기 : n을 10으로 나누고 n%10
  100의 자리수구하기 : n을 100으로 나누고 n%10

◇함수만들기
void func_tion()
{
 문장;
}

※함수호출
func_tion(); //함수이름만 적으면 됨

※함수원형
만약 함수를
int calc_sum(int n)
{
문장;
}
으로 만들어뒀다면

main(void)전 맨 위에
int calc_sum(int); 라고 원형을 밝혀둬야 정확히 컴파일한다.
   함수원형 뒤에는 세미콜론을 붙인다
 함수정의를 하기 싫다면, 함수정의가 호출보다 먼저 위치하면 되지만,
 간단한 프로그램에서나 먹히는 방법이고 항상 함수원형을 사용하자.

◇헤더파일(.h)
텍스트 에디터로 파일을 편집하고 확장자만 .h로 해주면 된다.

◇라이브러리 함수◇
◇난수
stdlib.h rand()  0부터 RAND_MAX까지(32767)
  rand()%45 0~44
  1+rand()%45 1~45
※시드값(난수의 씨앗)
#include <time.h>
scrand( (unsigned)time(NULL) );     //scrand는 시드를 설정하는 함수. 현재시간으로 정하기

◇절대값
abs(int x)
fabs(double x)

◇수학
조합(순서를 고려하지 않는것) : c(n,r) = n! / (n-1)!r!
팩토리얼 : n! = n*(n-1)*(n-2)*…*1

원넓이 : 파이r제곱

 

꿈일뿐이야(Just Dream) 소스파일

꿈일뿐이야(Just Dream) 소스파일

 

저번에 만들었던 게임 ‘꿈일뿐이야’의 소스파일 공개입니다.

VC++ 소스는 아니고, 흥크립트B로 만들어진 소스와 그림파일입니다.

3일동안 만들어서 질이 그다지 좋진 않습니다.

 

간단하게 설명해두겠습니다.

 

똥똥배님이 VC++로 만든 ‘흥크립트’라는 노벨 제작용 도구가 있는데,

이걸 제가 살짝 수정해서 만든게 ‘흥크립트B’입니다(B는 Bear의 B)

설명서는 안에 Html파일로 다 포함되어있으므로, 흥크립트B의 예제라고 생각하시고

수정해도 게임이 됩니다.

 

마음대로 쓰세요.

 

* 플레이하려면 여기로 : http://blog.naver.com/bb_/70145922296

자작게임, 꿈일뿐이야(Just dream)

자작게임, 꿈일뿐이야(Just Dream)

 



 

별거 아닌 미천한 게임입니다.

 

각설하고 게임설명하겠습니다.

 

제목 : 꿈일뿐이야(Just Dream)

제작 : 흑곰(2012)

조작 : 방향키, ENTER(결정키), ESC(저장화면 불러오기) 

장르 : 연애게임을 가장한 노벨게임을 가장한 퀴즈게임

플레이타임 : 최소 15분

 

나름 재밌습니다.

 

+ 진엔딩 보는법

1) 엔딩에서 세류의 진짜 전화번호를 얻는다.

2) 세류와의 대화에서

 이름:세류 – 머리:붉은색 – 외모:똑같다 순으로 선택하면 에너지 1이 된다.

 그 뒤로는 전부 정답을 맞춘다.

3) 전화거는 곳에서 세류에게 전화한다.

Visual Studio 2005 Express Edition 다운

Visual Studio 2005 Express Edition 다운 

 

페이지

http://www.microsoft.com/korea/msdn/vstudio/express/support/install/

 

Visual C++ 2005 Express Edition

http://go.microsoft.com/fwlink/?linkid=57034

 

무료로 배포되는 Express 버젼. 가난한 학생 개발자들에게 희망을 심어주는군.

비주얼 스튜디오는 2012, 2010, 2008 등 상위 버젼이 많아서

마이크로소프트 사이트에서도 2005 버젼을 찾기 힘들다. 아마 몇 년 안가서 이 링크도 짤리겠지?

 

2005에서 작성한 파일을 상위 버젼으로 컴파일하려면 에러가 많이나서 이걸 받을 수 밖에 없다.

VB6 2D Acade Game Sample (비베6 아케이드 게임샘플)

VB6 2D Acade Game Sample (비베6 아케이드 게임샘플) 

 

지난번에 올렸던 VB DirectX8 2D Game Sample (비베 다이렉트8 샘플)을 변형하여 만든것.

그러니까 지금 올리는 소스가 이해가 안된다면, 저번에 올렸던 것을 참고하여 이해한후

이번 것을 보면 된다.

 

그리고 지난번에도 글로 썼지만 사실 소스를 다 이해할 필요가 없다.

자기가 원하는 부분만 적당히 고쳐서 쓰면 된다.

 

이 소스에서는 무엇을 포함하는가 하면..

 

1. 800 x 600 해상도 2D 구현

현재 창모드인데 소스를 고치면 전체화면으로도 만들 수 있다.

 

 

 

2. 40 x 40 의 타일들과, 주인공(40 x 40)의 충돌처리 계산

충돌처리 계산이 되어있어서 방향키로 주인공을 움직이고

Z키로 점프할 수 있게 되어있다.

 

3. 맵 에디터 동봉

맵 에디터가 들어있어서 txt파일인 맵파일을 불러와서 간단한 지형을 만들고,

이동가능과 불가능 지형을 표시할 수 있다.

 

 

말 그대로 아케이드 게임 샘플이라서 딱히 기능은 없고

주인공 이동과 맵 스크롤 정도가 구현되어있다.

 

부끄러운 일이지만 시험기간을 바쳐 만든 것이니 잘 써주시기를…

 

2012 / 6 / 29

 

(무단 수정, 복사, 배포 등 일체 자유)

VB DirectX8 2D Game Sample (비베 다이렉트8 샘플)

 

< VB DirectX8 2D Games Sample >

< 비주얼베이직 다이렉트8을 이용한 2D 게임 만들기>

 

이 글은 비주얼베이직 초보들을 위한 것이다.

 

비베로 윈도우 프로그램 코딩은 대충 하겠는데 게임 만드는 법을 모르겠다고?

그런 당신을 위해 다이렉트X8이 준비되어있다.

 

첨부된 소스를 받아서 VB 6.0으로 불러와서 실행시켜 보자.

 

 

다이렉트X8은 다이렉트X7와 사용의 구조가 다르다.

오히려 다이렉트X9와 가깝다.

 

나타나는 모습은 비슷하지만 다이렉트X8부터는 3D가 기본이 되면서,

3D상에 평면을 그리고 그 평면 위에 그림을 찍어내는 방식을 쓴다.

 

<이 소스를 이해하는 법>

우선 다이렉트X8에 대해 기초가 없는 사람들을 위하여

소스를 붙여보겠다.

 

1. Form1의 Form_load() 부분 소스

 Private Sub Form_Load()

‘미리 그림관련 변수들 넣어둔다.
‘기본 값 사용
VctScl.X = 1  ‘1배
VctScl.Y = 1  ‘1배
VctRot.X = 0  ‘스프라이트 중심이어야 함
VctRot.Y = 0  ‘스프라이트 중심이어야 함
RotAng = 0    ‘0도 회전 = 회전 없음

‘——————————————–

FULLSCREEN = False

Form1.Show

‘DirectX 초기화
InitDirectX3D_Screen hwnd
InitDirectXSound hwnd
InitDirextXMusic hwnd

‘게임 시작전 준비할것들.
‘이미지 불러오기, 사운드 불러오기
LoadImageFiles
LoadSoundFiles

‘기타 초기화
Call PlayMusic(App.Path & “\Music99.MID”) ‘음악켠다

‘Main Loop
Static Start As Long
Start = GetTickCount()

 

Do While True

        If GetTickCount – Start > 25 Then  ‘1초에 40번
       
        KeyState
        Render
        DoEvents
       
        Start = GetTickCount
       
        End If

Loop
End Sub

 

(1) FULLSCREEN = False

이 부분을 True로 하면 화면은 전체화면으로 실행된다.

설정상 800 * 600 해상도로 되어있는데, 나중에 소스를 고치면 수정가능하다. ex 800,600 -> 640, 480

 

(2) Do While

다이렉트X8로 만든 게임들은 Do문이 끊임없이 돌아가게 되는데,

따라서 화면상의 그림이 지속적으로 끊김없이 뜨는 것이다.

 

아마 게임을 만들려고, Form상에 그래픽박스를 그려다가 좌표를 옮기면 뚝뚝 끊어지는 현상과는

전혀 차원이 다를 것이다.

 

중요한것은 여기서 Render 부분 안쪽만 고쳐주면 게임이 수정된다.

 

 

 

2. Form1의 Render() 부분 소스

 Private Sub Render()

FullScreenClear RGB(255, 0, 0) ‘배경 파란색으로 비우고,

D3DDev.BeginScene

SpriteObject.Begin  ‘그림 시작

‘———-”———-”———-”———-”———-”———-‘
‘배경 출력
Call Drawing(0, 0, DDSTiles, 0, 0, 800, 600, False)

‘배경위의 반투명 출력
Call Drawing(50, 50, DDSTiles, 0, 0, 400, 300, True)

‘작은 사람1 출력
Call Drawing(0, 0, DDSSprite, 0, 0, 50, 50, False)

‘캐릭터2 출력(500번)
For i = 1 To 500
Call Drawing(xxx + i, yyy + i, DDSSprite, 50, 50, 50, 50, False)
Next i

‘———-”———-”———-”———-”———-”———-‘

SpriteObject.End ‘그림 끝

D3DDev.EndScene

DrawAll  ‘화면 그림

 

여기서 다른 부분은 아직 볼 필요가없고, 점섬 밑에 부분을 보자.

배경 출력, 배경위의 반투명 출력… 등으로 주석이 달려있다.

각 줄마다 Drawing 함수가 있는데, 그림을 출력하려고 만들어둔 것이다.

 

사용법은,

Call Drawing(출력할 x좌표, 출력할 y좌표, 스프라이트 변수명, 그림의 x좌표, 그림의 y좌표, 그림의 폭, 그림의 높이)

이다.

 

소스의 각 숫자들을 조금씩 바꿔서 실행해보며 이해해보자.

 

 

 

3. 이해하는 순서

소스는 총 4개로 나뉘어있는데

폼 Form1 소스, 모듈 Draw 소스, 모듈 Music 소스, 모듈 Sound 소스이다.

 

우선적으로 Form1 소스를 이해하도록 하며, 그중에서도 Render 부분 소스를 이해하도록 하자.

숫자를 몇개 바꾸거나, 일정부분을 주석처리하면서 실행해보면 쉽게 배울 수 있다.

Music, Sound 부분은 필요하다면 기억한다. Music는 Midi파일을 재생하는데 필요하고,

Sound는 Wav파일 재생에 필요하다.

필요없다면 이 모듈 두개는 삭제한다음 실행할 때 오류나는 부분만 지워내도 좋다.

 

다음으로 Draw부분을 이해해보자. 이해하기 힘들것이다.

왜냐하면 이 부분은 나도 이해가 안간다.

 

소스를 전부 이해할 필요는 절대 없다. 부분적으로 쓸 부분만 찾아서 쓰면 되는 것이다.

Draw 모듈 중에서도 Public Sub LoadImageFiles(), Public Sub ScreenShutdown(),

스프라이트 선언부 만 이해해도 좋다.

 

간단히 설명해서, 새로운 그림파일을 게임에 삽입하고 싶은가? 아래대로 해보라.

 

(1) ‘스프라이트 선언부’ 에 아래처럼 추가한다. 그냥 그림을 기억하는데 필요한 변수라고 이해하자.

Public DDS1 As Direct3DTexture8

 

(2) ‘Public Sub LoadImageFiles()’ 에 아래처럼 추가한다. 그리고 폴더안에 새그림.bmp를 넣는다.

Set DDS1 = LoadTexture(App.Path & “\새그림.bmp”)



 

(3) ‘Public Sub ScreenShutdown()’ 에 아래처럼 추가한다. 종료할때 메모리를 정리해줄 것이다.

Set DDS1 = Nothing

 

Draw 모듈에서 손 볼 것은 끝났다. From1로 가자.

 

(4) Form1의 ‘Private Sub Render()’ 의 점선 사이에 아래와 같이 넣는다.

Call Drawing(30, 30, DDS1, 40, 40, 50, 50, False)

 

이 함수의 뜻은, 화면의 30,30 좌표에 그림을 찍으라는 것이다.

DDS1(새그림.bmp)의 그림이 40,40부터 가로 50, 세로 50 만큼 잘려서 입력될 것이다.

 

Drawing 함수는 내가 임의로 만든 변수인데,

만약 별로인것 같다면 Drawing 함수의 안쪽을 이해한 후 지우고 자체적으로 활용해도 좋다.

 

 

4. 이소스로 당신이 할 수 있는것

1. DX8을 이용해 화면에 맵과 캐릭터를 찍어낸다.

 

2. 반투명 출력을 한다. (그 외 알파블랜드 기능들은 추가가 안되어있다. 혹시 이 소스 기반으로 추가해주실 분있으면 공유해요)

 

3. 음악재생, 사운드 재생을 한다.

 

4. 이해 못해도 좋다. 써라! 아마추어 게임을 만들자!

 

이런 소스가 별거 아니라고 생각할 수가 있는데,

날이 갈수록 VB 소스를 얻기 어려워지고, 돌아다니는 소스들도 고수용이 많다.

 

이 마당에 막상 소스를 얻어도 너무 부분적인 소스여서 막상 실행이 안된다거나

이해하기 어렵도록 복잡하거나 방대하다.

 

비주얼 베이직 초보들은 모두 힘내시길.

 

(소스 수정, 소스 무단배포, 소스 활용 자유)

* 사실 이 소스는 내가 만든게 아니라, 여러 사람들의 유용한 소스들을 짜깁기한 것이다.

실제 프로그래밍 할때도 뭐든지 자신이 만들려고 할게 아니라,

복사할 수 있는건 하는게 효율적이다.

 

* 본 소스에 는 아래와 같은 내용이 들어있습니다. (명령어나 함수로 검색하는 이들을 위해)

‘<폼 Form1.frm>

Private Declare Function GetTickCount Lib “kernel32” () As Long ‘1ms 시계 (1/1000초)
Private Declare Function GetKeyState Lib “user32” (ByVal nvirkey As Long) As Integer

Dim xxx, yyy

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Shutdown
End Sub

Public Sub Shutdown()
‘모든 오브젝트 정리 후 종료
ScreenShutdown
SoundShutdown
MusicShutdown
End
End Sub

Private Sub Form_Load()

‘미리 그림관련 변수들 넣어둔다.
‘기본 값 사용
VctScl.X = 1  ‘1배
VctScl.Y = 1  ‘1배
VctRot.X = 0  ‘스프라이트 중심이어야 함
VctRot.Y = 0  ‘스프라이트 중심이어야 함
RotAng = 0    ‘0도 회전 = 회전 없음

‘——————————————–

FULLSCREEN = False

Form1.Show

‘DirectX 초기화
InitDirectX3D_Screen hwnd
InitDirectXSound hwnd
InitDirextXMusic hwnd

‘게임 시작전 준비할것들.
‘이미지 불러오기, 사운드 불러오기
LoadImageFiles
LoadSoundFiles

‘기타 초기화
Call PlayMusic(App.Path & “\Music99.MID”) ‘음악켠다

‘Main Loop
Static Start As Long
Start = GetTickCount()

 

Do While True

        If GetTickCount – Start > 25 Then  ‘1초에 40번
       
        KeyState
        Render
        DoEvents
       
        Start = GetTickCount
       
        End If

Loop
End Sub

Private Sub Render()

FullScreenClear RGB(255, 0, 0) ‘배경 파란색으로 비우고,

D3DDev.BeginScene

SpriteObject.Begin  ‘그림 시작

‘———-”———-”———-”———-”———-”———-‘
‘배경 출력
Call Drawing(0, 0, DDSTiles, 0, 0, 800, 600, False)

‘배경위의 반투명 출력
Call Drawing(50, 50, DDSTiles, 0, 0, 400, 300, True)

‘작은 사람1 출력
Call Drawing(0, 0, DDSSprite, 0, 0, 50, 50, False)

‘캐릭터2 출력(500번)
For i = 1 To 500
Call Drawing(xxx + i, yyy + i, DDSSprite, 50, 50, 50, 50, False)
Next i

‘———-”———-”———-”———-”———-”———-‘

SpriteObject.End ‘그림 끝

D3DDev.EndScene

DrawAll  ‘화면 그림
End Sub

‘키입력
Private Sub KeyState()

If GetKeyState(vbKeyRight) < 0 Then
xxx = xxx + 10
End If

If GetKeyState(vbKeyLeft) < 0 Then
xxx = xxx – 10
End If

If GetKeyState(vbKeyUp) < 0 Then
yyy = yyy – 10
End If

If GetKeyState(vbKeyDown) < 0 Then
yyy = yyy + 10
Call PlaySound(SoundList(0), False, False) ‘사운드 켠다
End If

If GetKeyState(vbKeyEscape) < 0 Then
bEnd = True
End If
End Sub

‘<모듈 Draw.bas>

‘DirectX 화면 출력

Option Explicit
Option Base 0  ‘배열 0부터 시작

‘화면 크기
Public Const SCREENWIDTH As Long = 800
Public Const SCREENHEIGHT As Long = 600
Public FULLSCREEN As Boolean

Private DX As New DirectX8
Private D3DX As New D3DX8
Private D3D As Direct3D8
Private Dispmode As D3DDISPLAYMODE
Public D3DDev As Direct3DDevice8
Public SpriteObject As D3DXSprite

‘표면 선언들
Private BackBuffer As Direct3DSurface8 ‘2중버퍼
‘Public DDSTiles2 As Direct3DSurface8 ‘버퍼를 제외한, 나머지 표면 선언은 개인적으로 안쓰기로함
‘참고 : 화면에 표면 그리는법 (개인적으로 느려서 안쓰기로함) ‘Call ImageCopy(DDSTiles, RC, x, y)

‘스프라이트 선언부———-
Public DDSTiles As Direct3DTexture8
Public DDSSprite As Direct3DTexture8
‘——————————

‘그림관련 변수들
Public VctScl As D3DVECTOR2      ‘크기 확대(보통 사용하지 않음)
Public VctRot As D3DVECTOR2      ‘회전 중심(보통 사용하지 않음)
Public RotAng As Single          ‘회전 각도(보통 사용하지 않음)
Public VctPnt As D3DVECTOR2      ‘그릴 위치

‘사각형
Public RC  As Rects
Public Type Rects
    Left As Long
    Top As Long
    Width As Long
    Height As Long
End Type

Public Sub LoadImageFiles()
‘스프라이트 불러오기
Set DDSTiles = LoadTexture(App.Path & “\Background.bmp”)
Set DDSSprite = LoadTexture(App.Path & “\Char.bmp”)

‘표면 불러오기 (개인적으로 안쓰기로함)
‘Set DDSTiles2 = LoadSurface(App.Path & “\Background.bmp”, 640, 480)
End Sub

Public Sub ScreenShutdown()
‘프로그램 종료 전에 1회 실행
‘표면 및 스프라이트 삭제
Set DDSSprite = Nothing
Set DDSTiles = Nothing
‘오브젝트 삭제
Set D3DDev = Nothing
Set D3D = Nothing
Set DX = Nothing
End Sub

Public Sub FullScreenClear(lColor As Long)
‘화면 전체를 한 색상으로 칠함
‘lColor = RGB(Blue, Green, Red)
‘lColor = &HRRGGBB
D3DDev.Clear 0, ByVal 0, D3DCLEAR_TARGET, lColor, 1, 0
End Sub

Public Sub DrawAll()
‘화면에 BackBuffer의 그림을 표시함
D3DDev.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

‘Drawing함수 쓰는법
‘(화면상 출력할 X좌표, 화면상 출력할 Y좌표, 가져올 스프라이트, 잘라낼 영역 X, 잘라낼 영역 Y, 잘라낼 영역 폭, 잘라낼 영역 높이)
Function Drawing(ByVal S_X As Long, ByVal S_Y As Long, SourceTexture As Direct3DTexture8, ByVal S_Left As Long, ByVal S_Top As Long, ByVal S_Width As Long, ByVal S_Height As Long, ByVal ALPHAv As Boolean)
Static SrcRct As DxVBLibA.RECT
SrcRct.Left = S_Left
SrcRct.Right = S_Left + S_Width
SrcRct.Top = S_Top
SrcRct.bottom = S_Top + S_Height
VctPnt.X = S_X
VctPnt.Y = S_Y

If ALPHAv = True Then
Call SpriteObject.Draw(SourceTexture, SrcRct, VctScl, VctRot, RotAng, VctPnt, D3DColorARGB(160, 255, 255, 255))
Else
Call SpriteObject.Draw(SourceTexture, SrcRct, VctScl, VctRot, RotAng, VctPnt, D3DColorARGB(255, 255, 255, 255))
End If
End Function

Public Sub MakeEmptySurface(ByRef SurfName As Direct3DSurface8, ByRef lWidth As Long, lHeight As Long)
‘빈 도화지만 만드는 곳(스크롤 버퍼 만들 때 이용)
Set SurfName = D3DDev.CreateImageSurface(lWidth, lHeight, Dispmode.Format)
If SurfName Is Nothing Then End
End Sub
Public Function LoadSurface(ByVal filename As String, ByVal Width As Long, ByVal Height As Long) As Direct3DSurface8
‘그림을 지정한 크기로 늘려서 읽어 옴
Dim surf As Direct3DSurface8  ‘임시 사용
Set LoadSurface = Nothing
Set surf = D3DDev.CreateImageSurface(Width, Height, Dispmode.Format)
If surf Is Nothing Then
    MsgBox “표면 만들기 중 에러!”
    Exit Function
End If
‘실제로 BMP 파일 읽는 곳
D3DX.LoadSurfaceFromFile surf, ByVal 0, ByVal 0, filename, ByVal 0, D3DX_DEFAULT, 0, ByVal 0
If surf Is Nothing Then
    MsgBox filename & “읽는 중에 에러”
    Exit Function
End If
Set LoadSurface = surf
End Function
Public Function LoadTexture(ByVal filename As String) As Direct3DTexture8
‘스프라이트 읽기
Dim tex As Direct3DTexture8 ‘임시 사용
Set LoadTexture = Nothing
‘실제로 그림을 읽어오는 함수
Set tex = D3DX.CreateTextureFromFileEx(D3DDev, filename, _
D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_UNKNOWN, _
D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, _
&HFF00FF, ByVal 0, ByVal 0)
‘&HFF00FF = 분홍색(바꿀 수 있음)
‘실제로 그림을 읽어오는 함수
If tex Is Nothing Then
    MsgBox filename & “읽는 중 에러”, vbOKOnly, “Error”
    Exit Function
End If
Set LoadTexture = tex
End Function

Public Sub InitDirectX3D_Screen(ByVal hwnd As Long)
‘프로그램 시작할 때 1회 실행
Set D3D = DX.Direct3DCreate()
If D3D Is Nothing Then
    MsgBox “DirextX3D 만들기 중 에러!”
    End
End If
‘화면 표시 장치 파라미터 설정
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Dispmode
Dim d3dpp As D3DPRESENT_PARAMETERS  ‘Object 설정용 변수들
d3dpp.BackBufferFormat = Dispmode.Format
d3dpp.hDeviceWindow = hwnd          ‘form1의 번호
d3dpp.BackBufferCount = 1           ‘2중버퍼 1개
d3dpp.BackBufferWidth = SCREENWIDTH      ‘화면 폭
d3dpp.BackBufferHeight = SCREENHEIGHT    ‘화면 키
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
d3dpp.Windowed = 1                      ‘창 상태(개발용)
If FULLSCREEN = True Then d3dpp.Windowed = 0   ‘전체 화면(배포용)
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE
d3dpp.AutoDepthStencilFormat = D3DFMT_D32
‘화면 표시 장치 만들기
Set D3DDev = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
If D3DDev Is Nothing Then
    MsgBox “DirextX3D Device 만들기 중 에러!”
    End
End If

‘2중버퍼(=투명레이어) 생성
Set BackBuffer = D3DDev.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
‘스프라이트 그리는 객체 생성
Set SpriteObject = D3DX.CreateSprite(D3DDev)
End Sub

VB DirectX7 2D Game Sample 속도향상 버젼 (비베 다이렉트7 샘플)

< VB DirectX7 2D Game Sample (비베 다이렉트7 샘플) >

 

저번에 올린 다이렉트7을 활용한 비베 2D 게임 기초이긴한데,

속도를 향상시킨 버젼이다.

 

오직 전체화면으로 돌아가긴 하지만 스프라이트를 다량 넣어도 빠르게 돌아간다.

 

비베는 알겠는데 DirectX7을 전혀 모르겠다구?

그럼 Render 부분만 조금씩 고쳐가면서 실행해보면 충분히 배울 수 있다.

이해가 되고 응용할 수 있다면 슈팅 게임정도는 이걸로 쉽게 만들 것이다.

 

참고로 Render 부분을 아래에 적어두겠다.(속도 향상)

Private Sub Render()
On Error Resume Next

‘출력 목적 좌표와 원본 그림 좌표를 기억할 변수
Dim RC As RECT
Dim iX As Integer, iY As Integer

iX = X
iY = Y

‘배경 그림 사이즈
RC.Left = 0: RC.Top = 0: RC.Right = 800: RC.Bottom = 600

‘백화면에 배경그림을 출력
Call DDSBack.BltFast(0, 0, DDSBGround, RC, DDBLTFAST_WAIT)

‘화면 밖에 나갔을때 처리
If iX < 0 Then RC.Left = iX * -1: iX = 0
If iX > 800 – 80 Then RC.Right = 800 – iX
If iY < 0 Then RC.Top = iY * -1: iY = 0
If iY > 600 – 80 Then RC.Bottom = 600 – iY

‘맵을 출력합니다
RC.Left = 0: RC.Top = 0: RC.Right = 40: RC.Bottom = 40
For i = 0 To 18
For j = 0 To 13
Call DDSBack.BltFast(20 + i * 40, 20 + j * 40, DDSMChip, RC, DDBLTFAST_SRCCOLORKEY)
Next j
Next i

‘백화면에 사람그림을 출력
RC.Left = 0: RC.Top = 0: RC.Right = 80: RC.Bottom = 80
Call DDSBack.BltFast(iX, iY, DDSSprite, RC, DDBLTFAST_SRCCOLORKEY)

Call DDSBack.DrawText(0, 0, iX & ” ” & iY, 0)

‘———————

‘백화면 -> 백화면2
RC.Left = 0: RC.Right = 800: RC.Top = 0: RC.Bottom = 600
Call DDSBack2.BltFast(0, 0, DDSBack, RC, 0)

Call DDSPrimary.restore ‘Alt+Tab을 대비하여 복구

‘백화면2->주화면 (백화면2에 있는걸 주화면으로 전송)
Call DDSPrimary.Flip(DDSBack2, DDFLIP_NOVSYNC)

End Sub

 

기존의 방식이 “버퍼(Back) -> 주화면” 이었다면,

Back2라는 표면상에 모든걸 그린후 “표면(Back2)->버퍼(Back)->주화면” 으로 바꿨다.

해보면 알겠지만 100개 이상 스프라이트를 적용했을때 이쪽 속도가 몇배 빠르다.

일반 표면인 Back2와 버퍼 Back은 이름만 비슷할 뿐 그 속성이 전혀 다르기 때문이다.

비베 네트워크 프로그래밍 윈속(VB Network Programming Winsock) 관련 코딩한것

<비베 네트워크 프로그래밍 윈속(VB Network Programming Winsock) 관련 코딩한것>

 

고수들은 웃겠지만 지나가주시기 바란다. 혹시나 나보다 초보가 있을까봐 올렸다.

초보일수록 초보끼리 도와야하고, 나도 이런 게시글에 덕본적 많으니까.

 

 

이거 정석은 아니다. 일단 내가 정석이 뭔지를 모르기에, 혼자 생각해서 짜본 것이다.

내 자작게임 선비전에 쓰였던 방식을 좀 수정한 것인데 원리 몇가지를 여기 적어두겠다.

 

1. 한계점 : 속도문제, 실시간 온라인 게임은 못 만든다

2. 유용성 : 턴제 게임, 채팅프로그램 완성에 유용

 

 

 

1. 구조

 

서버 1명이 있고, 클라이언트는 7명까지 접속한다.

서버 측 인터넷 연결이 끊기거나 프로그램을 끄면, 네트워크 연결도 끝이다.

 

서버가 끊기면 다른 클라이언트가 서버를 바통터치! 하는 방식도 있지만 어려우니까 생략한다.

 

 

2. 데이터 전송

 

데이터 처리는 생각하지 말고 데이터 전송만 생각하자.

두가지로 나뉜다.

 

– 서버는 클라이언트 전체에게 데이터를 뿌린다.(물론 연결되어있는 클라이언트만)

– 클라이언트는 서버에게 데이터를 보낸다.

 

 

3. 데이터 처리 (어려우면 안 읽어도됨)

데이터 처리까지 생각해보자. 어려운 말 같은데 엄청쉽다.

예를 들어서 온라인게임이라 쳐보자. 서버가 대화창을 열어 “안녕하세요”라고 치고 Enter를 누른다.

그렇다면?

 

* 서버가 데이터를 보내는 과정

1. 서버내 데이터 처리

2. 서버 -> 클라이언트로 데이터 전송

3. 클라이언트는 전송받은것 처리

 

예를 적용해서 쓰면 이렇다,

1. 서버측 게임화면에 “서버님의 말 : 안녕하세요”가 뜸

2. 서버가 클라이언트에게 서버가 안녕하세요 썼다고 보냄 (ex : ‘/MSG, 서버, 안녕하세요’를 전송)

3. 클라이언트 게임화면에서 “서버님의 말 : 안녕하세요”가 뜸

 

그럼 클라이언트가 데이터를 보내면 어떨까?

 

* 클라이언트가 데이터를 (서버에게) 보내는 과정

1. 클라이언트 -> 서버로 데이터 전송

2. 서버는 전송받은것 처리

3. 서버 -> 모든 클라이언트에게 데이터 전송

4. 클라이언트는 전송받은것 처리

 

여기서 클라이언트는 서버가 값을 돌려줄 때까지 데이터 처리를 못한다.

데이터 처리는 화면에 뭐 띄우거나 이런걸 말한다.

그러면 예를 들어 연결이 끊기면 대화창 열어서 말을 해도 화면에 안나온다.

 

 

4. 본 소스에 대한 설명

본 소스에서는 위의 2번, 3번의 내용을 토대로 코딩하였다.

 

기존의 인터넷에서 돌아다니는 비베 윈속공부 소스들은 그 원리를 배우기에는 좋게 되어있지만

실제 응용하기는 번거롭게 되어있는데, 이 점에 주목하여 바로 실전에 쓸 수 있게 만들었다.

 

우선,

 

(1) 본 코드에서 @@@@@@@@@@@@@@@@@@@@… 골뱅이가 반복되는 주석의

아래부분은 이해하지 못해도 좋다.

코딩실력이 부족한 관계로 더럽게 적어놔서 아마 이해를 못할것이다.

깔끔하게 적고 싶었으나…

 

(2) 타이머 두 개가 있어서, 1개는 전송 타이머, 1개는 처리 타이머이다.

사용자가 보내는 데이터는 버퍼(100개 변수공간)에 저장되고, 전송 타이머가 일정시간마다

데이터를 보내서 손실이 없도록 하였다.

처리 타이머도 마찬가지인데 상대로부터 받은 데이터 역시 100개 겟버퍼에 저장되고,

일정시간마다 처리된다.

 

(3) 데이터 전송하는 법

Call SendString(“보내고 싶은말”) 이런식으로 쓰면 된다.

그러면 상대방에게 “[보내고 싶은말]” 이렇게 데이터가 전송되고 만약 50자 이상으로 긴 경우에는

“[보내고” “싶은말]” 이런식으로 가서 합쳐진다. (너무 길면 안된다.. 3분할은 지원안함)

 

주의점으로 “[“, “]” 는 보내지 못하게 막는게 좋다.

 

(4) 데이터 처리하는 법 (DealData 함수)

현재는 채팅프로그램 형태라서 아래와 같이 되어있다.

Function DealData(DString)

Text1.Text = Text1.Text & DString

End Function

 

이것을 수정하는 예로 간단한 게임을 만든다고하면,

서버나 클라이언트에서 SendString(“/이동,주인공,3,21”) 이렇게 보내고,

 

DealData(DString) 부분에

If Left(DString, 3) = “/이동” Then
‘주인공 이동처리
End If
처럼 수정하면 된다.

 

(5) 한계점 : 속도 및 실시간처리 문제

정확한 실험은 안해봤는데 살짝의 시간차 문제가 있을것이다.

 

BitBlt나 윈도우 DirectX 프로그래밍 하에서 실시간게임보다는 턴제 게임을 추천한다.

(지금도 혹시 실시간 가능하려나?) 속도문제는 개선이 필요할듯.

개선되시면 공유해요 우리.

 

 

6. 게임 제작

 

이제 이 소스를 응용해서 네트워크 게임을 만드시면 된다.

 

골뱅이 아래부분은 건드리지말고, 윗부분만 수정해서 만들면 되는데,

서버/클라이언트 따로 생각하지말고 그냥 SendString 하면 알아서 방안의 인원들에게 전송되고,

처리부분도 공통적으로 작성하면 된다.

 

이게 별거 아니라고 생각하겠지만…

개인적으로 선비전은 이거보다 못한 상태에서 만들어서 지금도 버그가 발생한다.

그리고 나같은 프로그래밍 바보들은 이런거 하나 구축하는데도 꽤나 시간이 걸린다는걸 안다.

 

아무도 안쓰면 다음에 나 혼자 써야겠다… 에휴~

 

(공유/수정/무단배포 가능)

비베 네트워크 보드게임 : 선비전 (Source)

망한 게임 선비전. 남부끄러워서 안올리려 했건만 올리는 이유는 다음과 같다.

 

내가 과거에 코딩했던 저작물들을 군대가기 전에 싸그리 지웠었는데,

지금와서 땅을 치고 후회하고 있다.

나같이 기초도 없고 프로그래밍도 모르는 바보는 예전에 만든게 그야말로 보물이다.

여기저기서 훔쳐온 것들 합친 것이고, 두고두고 참고할 수 있기 때문이다.

‘나중에 필요하면 어디선가 구할 수 있겠지’ 했지만 구할 수 없다.

 

본 소스 안에는 Bitblt 사용과 함께, 네트워크 전송(Winsock)에 관련한 코딩결과가 들어있다.

이래뵈도 8인까지 네트워크 플레이를 할 수 있게 되어있고, 실시간 네트워크 게임은 아니더라도

턴제 네트워크 게임 제작에는 도움이 될만한 소스이다.

 

그러나 이런 복잡하고 불친절하게 길이만 긴 코드를 읽어봤자 소용도 없을 것이기에,

(솔직히 내가 지금 읽어도 자신이 없다)

네트워크 전송 부분만 따로 떼어 강의 게시글을 올리도록 하겠다.

 

참고로 게임은 쓰레기이다, 진짜. 재미를 기대하지마라(분명히 말했다)

 

<제작과정>

<2월 4월>

 

<2월 11월>

 

<2월 18월>

 

 

<2월 20일>

 

<3월 최종>

VB DirectX7 2D Game Sample (비베 다이렉트7 샘플)

비주얼베이직으로 게임을 만들고 싶은데

만드는 법을 모르는 사람들을 위해서.

 

본 자료는 비주얼베이직(VB)에서 다이렉트X7을 활용하여 게임을 만들 수 있게

도와주는 초보자용 기초자료이다.

 

1. 첨부파일을 다운받아서 VB6로 열고

2. 본 게시물을 잘 읽어보면, 초보도 충분히 가능하다

 

< VB DirectX7 2D Game Sample (비베 다이렉트7 샘플) >

 

이 예제는 나도 어디에서 배운 것을 재구성해본 것이다.

최근에 다이렉트 최신버젼이 많이 나오면서 다이렉트X 7 을 쓰는 사람은 잘 없겠으나,

아는 사람은 알겠지만 다이렉트X 8 이상부터는 3D 기반이라서 이해하기가 힘들 수 있다.

 

따라서 2D 게임을 쉽게 만들어보고 싶다면,

비주얼 베이직으로 다이렉트 7부터 차근히 만들어보는 것도 나쁘지 않다.

 

이해를 돕기 위해 모듈없이 폼 하나 안에 전부 넣어 구성하였고,

비주얼 베이직 기초가 된 사람이라면 이를 적절히 수정해서 1945 류의 슈팅게임 정도는 만들 수 있을 것이다.

(변수 선언하는 법, 변수 값 바꾸는 법, For문, If문, Do-loop문 정도만 알아도)

 

물론 다이렉트X 7 를 거의 이해 못해도 가능하다.

 

1. 비주얼베이직 실행 – 프로젝트 – 참조 – DirectX 7 for Visual Baisc Type Library를 체크

2. Form1의 코딩창을 열고 아래 소스 전문을 복사 – 붙여넣기

——————————————————————————–

*소스 전문(All Source)

 

Option Explicit
Private Declare Function GetKeyState Lib “user32” (ByVal nvirkey As Long) As Integer

Private DX As New DirectX7 ‘다이렉트X
Private DDraw As DirectDraw7 ‘다이렉트 드로우
Private DDSPrimary As DirectDrawSurface7 ‘주화면
Private DDSBack As DirectDrawSurface7 ‘배고하면
Private DDSSprite As DirectDrawSurface7 ‘스프라이트 그림변수
Private DDSBGround As DirectDrawSurface7 ‘스프라이트 그림변수

Private bEnd As Boolean ‘게임루핑
Private X As Integer, Y As Integer

Private Sub form_click()
bEnd = True
End Sub

‘다이렉트 드로우 초기화
Private Sub InitDDraw()
Dim DDSD As DDSURFACEDESC2
Dim Caps As DDSCAPS2
Dim ColorKey As DDCOLORKEY

Set DDraw = DX.DirectDrawCreate(“”)  ‘초기화

‘독점모드 설정
Call DDraw.SetCooperativeLevel(Me.hWnd, DDSCL_EXCLUSIVE Or DDSCL_FULLSCREEN)

‘해상도
Call DDraw.SetDisplayMode(800, 600, 16, 0, DDSDM_DEFAULT)

‘주화면 환경변수 삽입
DDSD.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
DDSD.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
DDSD.lBackBufferCount = 1

‘주화면 생성
Set DDSPrimary = DDraw.CreateSurface(DDSD)

‘백화면 환경변수 삽입
Caps.lCaps = DDSCAPS_BACKBUFFER

‘백화면 생성
Set DDSBack = DDSPrimary.GetAttachedSurface(Caps)

Set DDSBGround = CreateOffScreenFromBMP(App.Path & “\air.bmp”, 800, 600)
Set DDSSprite = CreateOffScreenFromBMP(App.Path & “\plain.bmp”, 800, 600)

ColorKey.high = 0
ColorKey.low = 0

Call DDSSprite.SetColorKey(DDCKEY_SRCBLT, ColorKey)

End Sub

Private Function CreateOffScreenFromBMP(szFileName As String, iwidth As Integer, iheight As Integer) As DirectDrawSurface7
Dim DDSTemp As DirectDrawSurface7
Dim DDSD As DDSURFACEDESC2

‘스프라이트 화면 환경변수 설정
DDSD.lFlags = DDSD_WIDTH Or DDSD_HEIGHT Or DDSD_CAPS
DDSD.lWidth = iwidth
DDSD.lHeight = iheight
DDSD.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY

‘스프라이트 화면 생성
Set DDSTemp = DDraw.CreateSurfaceFromFile(szFileName, DDSD)

Set CreateOffScreenFromBMP = DDSTemp

End Function

Private Sub Render()
On Error Resume Next

‘출력 목적 좌표와 원본 그림 좌표를 기억할 변수
Dim rcDest As RECT, rcSrc As RECT
Dim iX As Integer, iY As Integer

iX = X
iY = Y

‘배경 그림 사이즈
rcSrc.Left = 0: rcSrc.Top = 0: rcSrc.Right = 800: rcSrc.Bottom = 600

‘백화면에 그림을 출력
Call DDSBack.BltFast(0, 0, DDSBGround, rcSrc, DDBLTFAST_WAIT)

‘스프라이트 출력될 좌표를 설정
rcDest.Left = iX: rcDest.Top = iY: rcDest.Right = iX + 80: rcDest.Bottom = iY + 80

‘원본 그림중 출력할 그림의 좌표
rcSrc.Left = 0: rcSrc.Top = 0: rcSrc.Right = 80: rcSrc.Bottom = 80

‘화면 밖에 나갔을때 처리
If iX < 0 Then rcSrc.Left = iX * -1: iX = 0
If iX > 800 – 80 Then rcSrc.Right = 800 – iX
If iY < 0 Then rcSrc.Top = iY * -1: iY = 0
If iY > 600 – 80 Then rcSrc.Bottom = 600 – iY

‘백화면에 그림을 출력
Call DDSBack.BltFast(iX, iY, DDSSprite, rcSrc, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY)

Call DDSPrimary.restore ‘Alt+Tab을 대비하여 복구

‘백화면에 있는걸 주화면으로 전송
Call DDSPrimary.Flip(DDSBack, DDFLIP_WAIT)

End Sub

Private Sub Form_Load()
Me.Show

‘DirectX 초기화
Call InitDDraw

X = 0
Y = 0
bEnd = False

‘bEnd가 True가 될때까지 루핑
‘bEnd는 마우스를 클릭했을 때와 ESC를 눌렀을 경우 TRUE가 됨
Do Until bEnd = True

KeyState
Render
DoEvents
Loop

Unload Me

End Sub

‘키입력
Private Sub KeyState()
If GetKeyState(vbKeyRight) < 0 Then
X = X + 3
End If

If GetKeyState(vbKeyLeft) < 0 Then
X = X – 3
End If

If GetKeyState(vbKeyUp) < 0 Then
Y = Y – 3
End If

If GetKeyState(vbKeyDown) < 0 Then
Y = Y + 3
End If

If GetKeyState(vbKeyEscape) < 0 Then
bEnd = True
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set DDSSprite = Nothing
Set DDSBack = Nothing
Set DDSPrimary = Nothing
Set DDraw = Nothing
Set DX = Nothing

End Sub

흑곰의 유익한 블로그 2호점 오픈안내

 

 

안녕하세요. 흑곰의 유익한 블로그 2호점입니다.

흑곰의 유익한 블로그 1호점(본점) : http://blog.naver.com/bb_
흑곰의 유익한 블로그 2호점 : http://it-archives.com/

방문해주셔서 감사합니다.

※ 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음.