누구나 게임을 한다.

no comments


게임을 해서 더 좋은 세상을 만들 수 있습니다.” 라는 제목으로 TED에서 말했던 제인 맥고니걸이 쓴 책입니다. 책에서 저자는 좋은 게임으로 어떻게 현실을 바로 잡는지 14가지 방법을 소개 했습니다. 그저 개발만 생각했던 나에게 게임에 대한 시각을 넓혀주는 책이었습니다.

초대형 게임은 협업의 미래다. 간단히 말하자면 우리 시대의 복잡 다단한 문제를 해결하는 데 가장 믿고 의지할 만한 수단이다. 그 덕분에 역사상 어느 때보다 많은 사람이 진정 의미 있는 일을 하고 전 세계 변화에 직접 참여할 기회를 누리고 있다. – 에필로그에서

게임이 세상을 바꿀 수 있다고 저도 동의합니다.

FIFA FOOTBALL

no comments


PSV의 정식 출시가 2월 11일이었으니 22일 피파의 발매는 빠른편이다. 위닝이 아직 소식이 없는 것을 보면..
런칭도 우려와는 달리 그게 에이핑크 팬심이었던간에 성황이었고 국내 게임시장 상황 대비 비타 정식 출시이후 라인업이 나쁘지 않은 것도 괜찮다고 본다.

동영상 공개때 콘솔급이라는 엄청난 기대를 받고 출시된 비타용 피파.

09부터 피파로 완전히 돌아섰는데 2가지 이유는 라이센스와 식상함이었다. 축구를 제일 좋아하는 유저라면 누구나 실제 축구를 하는 것 같은 플레이를 원할 것이다. 개인적으로 피파12는 100퍼센트는 아닐지라도 상당히 놀랍고 만족스러운 게임성을 갖춘 게임이었다. 특징이라면 임펙트 엔진과 수비의 변화이다. 임펙트 엔진은 아직 무리한 연출이 존재하지만 첫번째 도전으로는 합격점을 주고 싶다. 수비의 변화는 정말 높이 평가하고 싶은데 단순히 수비버튼만 누르고 있으면 수비수가 알아서 공격수에 몸싸움을 일으키고 공을 빼았는 행위를 하는 단순함에서 벗어나 공격수 근처에 까지만 이동되고 그 후 유저가 직접 이동하여 위치 선정이나 몸싸움을 해야하는 것이다. 단순한 수비는 전작들에서 난이도를 낮추는 주범이었는데 피파12에서 수비변화로 인해 난이도가 대폭 상승했다. AI와 대결에서도 수비시 선수를 놓치면 실점으로 이어지므로 긴장을 하게 된다. 싱글플레이위주 유저라면 이는 반가운 변화인데 스포츠게임에서는 어느정도 익숙해지면 유저간의 대결이 아니면 AI와의 대결에서 좀처럼 경기내 긴장감을 찾기 힘들기 때문이다. 실제와 게임사이에 어느정도 선을 지켜야하겠지만 이 같은 수비 게임성 변화는 개인적으로 정말 만족스럽다.

비타판 피파는 이같은 변화가 있는 피파12 이전의 게임성을 가지고 있다. 피파11과 피파12의 중간 게임성이라고 말하고 있지만 피파11에 더 근접하다고 말하고 싶고 라이센스는 피파12기준인 피파11이라고 말하고 싶다. 포터블기기에서 축구게임으로 이 정도 그래픽과 게임성은 첫 작품이고 피파11 자체도 나쁜 게임성이 아니었으므로 만족한다. 다만 프레임이 떨어지는 느낌은 초반에 느끼는 단점임은 분명하나 익숙해지면 괜찮은 부분이다. 축구게임에서 시리즈가 바뀌면 적응하면서 익숙해지듯이.

정식 넘버링으로 나올 다음 비타판 피파를 기대한다.

자바스크립트 ==, === 연산자

no comments

자바스크립트를 간간히 보면서 생소한 비교연산자인 ‘===’를 간략히 정리해 보았습니다.

== 연산자
동등 연산자이고 두 오퍼랜드가 같다면 불리언 true를 리턴한다. 자바스크립트는 비교를 수행하기 위해서 다른 데이터 타입을 같은 타입으로 변환을 시도한다. 변수 a를 2 b는 4로 가정하면 아래 예제는 모두 true를 리턴한다.

a==2
a=="2"
2=="2"

=== 연산자
이것은 엄격한 동등 연산자(일치 연산자)이다. 두 오퍼랜드가 데이터 타입과 값이 모두 같을 때만 true를 리턴한다. 다음 예제는 모두 true를 리턴한다.

a === 2
b === 4

MW3

no comments


Call of Duty : MW3를 클리어했습니다. 노멀난이도로 5시간 44분이 걸렸네요.
전작들처럼 플레이타임이 길지 않습니다. 하지만 시리즈를 겪으면서 오히려 이 정도 볼륨에 익숙해진건지 더 길었으면 왠지 반복되는 것에 질렸을 것 같습니다. 헬기를 타고 뉴욕에 들어갈때는 ‘역시 내가 진짜 모던워페어’를 하고 있구나 라는 느낌이 듭니다. 그 만큼 이제 FPS 연출에선 극에 달한 것 같습니다.
개인적으로 이번 작에서 인상깊었던 장면은 러시아 대통령 전용기에서 있었던 터뷸런스 씬이었습니다. PC에서 좋은 그래픽으로 다시 한번 해보고 싶은 생각이 드네요.

온라인을 즐겨야할텐데 발매한지 좀 된만큼 굇수들이 많을텐데 고민을 해봐야겠습니다.

단위 테스트 (GoogleTest)

no comments

- 효능
다양한 테스트를 자동화할 수 있다.
회귀 테스트에 의해 코드가 망가지지 않은 것을 보증할 수 있다.
설계의 개선으로 이어진다.

- 지침
테스트 정책을 정해 두자.
테스트하기 쉬운 부분은 어디인가?
테스트하기 어려운 부분은 어떻게 할 것인가?

GoogleTest
http://code.google.com/p/googletest/
구글 테스트를 적용해보면서 이것 저것 테스트해보아야겠다.
wiki페이지를 보면 자세한 설명과 샘플이 있는데 참고해야겠다.

간단히 실행해본 인벤토리 클래스 테스트코드.

#include "stdafx.h"
#include "gtest\gtest.h"

#include "Item.h"
#include "Inventory.h"

class InventoryTest : public ::testing::Test
{
protected:
	virtual void SetUp() {
		inven.AddItem(9431, "armorEx");
		inven.AddItem(131, "katanaEx");
	}

	//virtual void TearDown() { }

	// 여기에 테스트할 클래스를 선언
	CInventory inven;
};

TEST_F(InventoryTest, IsEmpty) {
	 EXPECT_EQ(0, inven.GetSize());
}

TEST_F(InventoryTest, FindItem) {
	 inven.AddItem(12131, "armor");
	 inven.AddItem(122131, "katana");
	 inven.AddItem(2512131, "potion");

	 CItem* pItem = inven.GetItem(122131);
	 int nRet = strcmp("katana", pItem->GetName().c_str());
	 EXPECT_EQ(0, nRet);
}

TEST_F(InventoryTest, DeleteItem) {
	inven.DelItem(12131);
	CItem* pItem = inven.GetItem(12131);
	EXPECT_EQ(NULL, pItem);
}

int _tmain(int argc, _TCHAR* argv[])
{
	::testing::InitGoogleTest(&argc, argv);
	return RUN_ALL_TESTS();
}

결과는 다음과 같다.
테스트코드의 SetUp()함수에서 초기값으로 넣은 값때문에 IsEmpty 테스트는 실패한다.

자바스크립트 온라인에서의 간단한 실행

no comments

http://writecodeonline.com/javascript/
간단하게 자바스크립트 코드를 넣어 실행해볼 수 있는 사이트

http://jsfiddle.net
자바스크립트뿐 아니라 HTML, CSS까지 편집하여 결과를 볼 수 있는 사이트

http://www.jslint.com/
JavaScript Code Quality Tool
선언되었지만 정의되지 않은 변수나 변수 유효범위등을 알려준다.

자바스크립트 변수의 유효 범위

no comments

전역 유효 범위에서 코드를 작성한다면 var문을 생략해도 문제가 되지 않지만, 지역 변수를 선언하려면 언제나 반드시 var문을 써야한다. C,C++,자바와는 달리 자바 스크립트에서는 블록 단위의 유효 범위라는 것이 존재하지 않는다. 함수 안에서 정의된 변수는 그것이 정의된 위치에 관계없이 항상 함수전체에 걸쳐 유효하다.

function test(o)
{
   var i = 0;                        // i는 함수 전체에 걸쳐 정의된다.
   if (typeof o == "object") {
       var j = 0;                    // j는 이 블록뿐 아니라 함수 전체에 걸쳐 정의된다.
       for (var k=0; k < 10; k++) {  // k는 루프뿐만 아니라 함수 전체에서 정의된다.
           document.write(k);
       }
       document.write(" ");
       document.write(k);            // k는 여전히 정의되어 있다. 10이 출력된다.
    }
    document.write(" ");
    document.write(j);               // j는 정의되어 있지만, 초기화되지 않았을 가능성이 있다.
}

위 결과는 0123456789 10 0이 나온다.

다음 코드를 실행해보면 확실히 알 수 있다.

var scope = "global";
function f() {
    alert(scope);        // "global"이 아닌 "undefined"를 표시한다.
    var scope = "local"; // 변수는 이곳에서 초기화되었지만 함수 전체에 걸쳐 정의되어 있다.
    alert(scope);        // "local"을 표시한다.
}
f();

자바스크립트의 유효 범위 규칙때문에 첫번째 alert에서 undefined가 출력된다.
어떤 함수에서건 모든 변수의 선언을 함수의 시작부에서 두는 것이 좋은 프로그래밍 습관임임을 알 수 있다.

Firefox 2.0이후나 Java의 JavaScript 엔진인 Rhino 1.7.R1이후에서 사용할 수 있는 JavaScript1.7부터는 블록 유효범위를 사용할 수 있는 let 키워드가 추가되어 있다.
JavaScript 1.7의 새 기능을 사용하려면, 코드에 JavaScript1.7을 사용하겠다고 명시해주어야 한다. (script type="application/javascript;version="1.7")

function varTest() {
    var x = 31;
    if (true) {
      var x = 71;  // same variable!
      alert(x);  // 71
    }
    alert(x);  // 71
  }

  function letTest() {
    let x = 31;
    if (true) {
      let x = 71;  // different variable
      alert(x);  // 71
    }
    alert(x);  // 31
  }

위 코드의 결과는 파이어폭스에서만 확인 가능했다.

WinMain에서 cmd로 GoogleTest 출력

no comments
int WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   int argc = 0;
   ::testing::InitGoogleTest(&argc, &lpCmdLine);
   int hCRT;
   FILE *hf;
   hCrt = _open_osfhandle((long) GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
   *stdout = *hf;
   setvbuf(stdout, NULL, _IONBF, 0);
   RUN_ALL_TESTS();
   return MessageBox(NULL, "GoogleTest Complete", "GoogleTest", MB_OK);
}

WinApi나 MFC 프로젝트에서 output으로 GoogleTest를 출력하기 싫어서 cmd에 출력한 예제.

보통은 return RUN_ALL_TESTS(); 으로 하겠으나 cmd창을 잠시 잡기 위한 임시방변으로 MessageBox로 처리함.

FIFA12 Career Mode Diary #1

no comments

전북현대 K리그 준우승과 플레이오프 우승한 뒤 유럽진출을 위해 폴란드리그 포즈난과 계약.
첫 스쿼드는 위 사진과 같다.
잉글랜드나 이탈리아 등지에서도 요청이 왔었으나 3부, 2부리그여서 유럽대회- 물론 유로파 -를 진출할 수 있는 폴란드리그로 선택.

골키퍼와 풀백정도 영입하면 좋겠지만 자금이 없다. 골키퍼만 영입해야하지 않을까 싶다.
일정을 보니 유로파 예선도 있는 것 같은데 유럽대회는 포기하고 리그만 집중해야할 것 같다…

blog..

no comments

기존 컨텐츠는 블로그형태로 변환하여 관리되고 개인 블로그로 변경됩니다.