Tab 컨트롤 예제

GameOVEN 2009.11.08 18:45


Button 과 StaticImage 를 이용해서 Tab Control 을 구현한 예제입니다.

TabCtrl:SetHandler() 함수를 이용하면 CharInfo 클래스처럼

상속을 이용하지 않아도, 이벤트로 호출되는 함수를 바꿀 수 있습니다.

저작자 표시
신고


간단한 턴기반의 오목 게임입니다.

게임 규칙이나, 그래픽은 단순하지만...
게임 구조나 기능적인 측면에서 완성도를 높이려고 노력했습니다.

턴기반의 게임을 개발할 때는 좋은 참고서가 될 것이라 믿습니다.

게임의 아이디어 및 그래픽을 제공해주시고,
소스 공개에도 흔쾌히 동의해 주신 백정훈(*jbaeg)님께 감사드립니다.


게임의 규칙

2인으로 오목을 두고, 3인으로 칠목을 두는 게임입니다.

오목의 규칙은 잘 아실 것이라 믿고,
칠목의 규칙은 다음과 같습니다.

칠목은 3명의 사람이 자신의 돌을 오목판에 두어,
가로, 세로, 대각선으로 연속 7개를 늘여놓으면 이기는 게임입니다.

단, 자신의 돌 뿐만 아니라 상대방 1명의 돌을 자신의 것으로
간주하고선 7개를 늘여놓을 수 있습니다.

O 모양 돌을 두는 사람은 X 모양 돌을 자신의 돌로 간주할 수 있습니다.
X 모양 돌을 두는 사람은 V 모양 돌을 자신의 돌로 간주할 수 있습니다.
V 모양 돌을 두는 사람은 O 모양 돌을 자신의 돌로 간주할 수 있습니다.


소스의 설명 

여기에 구현된 특징들을 나열하면 다음과 같습니다.

1. 서버에서 게임의 턴과 게임 진행 시간을 관리하고 있고,
2인이 오목을 두고 있는 상황에 입장하더라도 게임 진행 상황을 알 수있도록
하였습니다.

2. 완벽하게 테스트된 상황은 아니지만, 매일 매일 새롭게 초기화 되는 랭킹시스템도
구현되어 있습니다.

3. 아울러, 게임방이 여러개 생성되어서
동시에 랭킹이 갱신되는 경우에 랭킹 데이터가 날라가지 않도록
안전하게 저장되도록 구현되어 있습니다.

4. Clone() 이미지를 Pool 로 관리해서 재활용하도록 하여,
오랫동안 게임을 진행하더라도 성능에 문제가 없도록 처리하고 있습니다.

5. 서버와 클라이언트간의 큰 데이터는 문자열로 처리해서 주고 받도록
최적화되어 있습니다.

6. 게임오븐의 Design 을 사용하지 않고, 순수하게 API 만을 이용해서
게임 화면을 구성하도록 처리하고 있습니다.

7. 음악, 사운드 ON/OFF 설정을 개인 정보에 저장하여, 다른 방에 입장하더라도
게임 설정때문에 번거로운 현상을 없앴습니다.

8. 어뷰징을 방지하기 위해서 점수 계산을 합리화 했습니다.


전체적으로 프로그램 3일 + 그래픽 및 사운드 등의 마무리 작업에 4일정도 걸렸습니다.


저작자 표시
신고


Bresenham 선긋기 알고리즘을 LUA 로 간단히 구현해본 예제입니다.

테스트는 마우스로 시작할 위치에 오른쪽 클릭하고서 클릭버튼을 때지않고 드래그합니다.

그 다음에 마무리 위치에서 오른쪽 클릭 버튼을 뗍니다.

두 지점 사이에 선이 그려집니다.

최단거리로 직선으로 이동할 때나, 직선의 형태로 뭔가를 처리하고자 할 때 이용하고자 만들어본 예제입니다.

출처: http://en.wikipedia.org/wiki/Bresenham's_line_algorithm

저작자 표시
신고


100x100 크기의 이미지를 800x600 화면에 타일형태로 찍어서 무제한으로 스크롤하는 예제입니다.

각종 배경 애니메이션에 활용될 수 있는 스크롤 기법입니다.


F5 로 실행 한뒤에, 방향키로 스크롤 속도를 조절할 수 있습니다.

스크롤 속도가 변동되는 중간에도 부드럽게 스크롤 되도록 구현되어 있습니다.

저작자 표시
신고


튜토리얼 2-7A

기본 튜토리얼 2-7 예제는 네트워크 채팅을 설명하고 있습니다.

그런데 일반적인 채팅창을 구현할 때, 공통적인 인터페이스 요구사항이 있습니다.

게임을 하다가, 바로 ENTER 키를 입력하면 채팅창에서 입력할 수 있도록 하는 것입니다.

게임오븐에서도 이와 유사한 기능을 다음과 같이 구현할 수 있습니다.

function tutorial2_7ClientApp:OnUIMsg(main, msg)
 -- 키보드 엔터 누르면 이벤트로 알리기
 if msg.id == Evt_KeyboardDown.id then
  local v = msg:GetValue(Evt_KeyboardDown.key.Value)
  if v == UIConst.KeyEnter then
   local msg = Message(Evt_InputEnter)
   self:SendToScene(msg)
  end
 end
 ClientApp.OnUIMsg(self, main, msg)
end

OnUIMsg() 함수는 UI 메시지를 받았을 때 호출되는 함수로, 몇가지의 경우를 제외하고 대부분의 경우 호출됩니다.

특히 다른 Edit 에 활성화 되어 있는 경우에는 모든 키 입력을 그 Edit 에서 받아서 처리하기 때문에, OnUIMsg() 함수가 호출되지 않습니다.

그래도 대부분의 경우에는 위와 같은 구현으로, 원하는 기능이 충분히 구현될 것이라고 믿습니다.

이상입니다.


다른곳: http://cms.hangame.com/post2/812/2611858


저작자 표시
신고



NPC 말풍선, 툴팁 이미지 박스의 경우에는 가변적으로 크기가 변합니다.

이 예제는 이미지 3조각 또는 이미지 9조각을 짜맞춰서 크기가 변하면서도,

테두리를 꾸며주는 이미지 박스를 보여주는 예제입니다.

이미지 3조각과 9조각은 정해진 형틀에 따라서 제작되어야 합니다.


3조각

{left} {center} {right}


9조각

{1-left-top}    {2-center-top}    {3-right-top}

{4-left-middle} {5-center-middle} {6-right-middle}

{7-left-bottom} {8-center-bottom} {9-right-bottom}


9조각의 경우에는

1, 7 조각과 3, 9 조각은 가로크기를 동일하게 해야 합니다.

4, 5, 6의 경우에는 세로크기를 동일하게 해야 합니다.


실행한 뒤에 기본적으로 3조각 이미지 박스가 마우스의 현재 위치에 따라 이동합니다.

SPACE 키를 누르면 9조각 이미지 박스로 바뀝니다.

숫자패드의 +, - 키를 눌러서 이미지 크기를 조절할 수 있습니다.

저작자 표시
신고


Graphic:SetClipRect(), Graphic:EnableClip() 함수를 이용한 HP Bar 예제입니다.

전체 HP 퍼센티지에 따라서 Clipping 픽셀 크기를 조절하여 남은 HP를 표현합니다.

HP가 깍이는 경우에는 반투명 효과를 이용해서 HP 변화량을 처리할 수도 있습니다.

저작자 표시
신고


Tile(Sprite) Animation 예제

Null Image 를 이용한 간단한 형태의 애니메이션 예제입니다.

캐릭터 애니메이션과는 달리, 방향에 따른 이미지 상태 변화가 제거된 형태입니다.

이펙트 효과나 배경 변화에 사용하면 유용합니다.

저작자 표시
신고


NAT(Null Animation Technique) 를 이용한 타이머

Null Animation Technique 을 이용해서 만든, 객체 단위로 동작하는 타이머 클래스입니다.


Space 키를 누르면 0.5초 주기로 타이머가 작동하고,
다시 Space 키를 누르면 타이머가 멈춥니다.

P.S. 서버쪽에서는 이 타이머를 사용할 수 없습니다.

신고


NAT(Null Animation Technique) 을 이용한 캐릭터 애니메이션 #4

버전4에서는 Graphic:MoveTo() 를 이용하여 캐릭터를 직접 이동시키지 않고,
Box2D 물리 엔진을 이용해서 캐릭터 이동 및 충돌을 처리하도록 했습니다.

저작자 표시
신고

티스토리 툴바