XNA로 RPG 게임을 하나 만들것 같습니다.

창세기전을 모방해서 - _ -감칠맛나게 하나 ㅋㅋ
사용자 삽입 이미지












어쩌면 제 인생에 터닝 포인트라고 할수 있는 MSP3기를 모집합니다.
http://www.microsoft.com/Korea/msdn/events/2009/academic/msp.aspx

많이들 지원하세요 ^^


이제 처음 시작시 랜덤하게 배열시키도록하겠습니다.

아무렇게나 배열하게되면 안 풀리는 퍼즐이 될수도 있기때문에
MoveBlock을 반복문으로 돌려서 배열하도록 하겠습니다.




private void setrandom() { for (int i = 0; i < 20; i++) { int ran = rand.Next(4); if (ran == 0) { MoveBlock(1, 0); } else if (ran == 1) { MoveBlock(-1, 0); } else if (ran == 2) { MoveBlock(0, 1); } else if (ran== 3) { MoveBlock(0, -1); } } }

    protected override void Initialize() 에 들어갈 함수입니다.
간단하게 20번 정도 랜덤으로 돌리게 해두었습니다.
총 0~4의 값을 랜덤으로 받아서 한칸씩 이동시키고 있습니다.

다음으로는 차례로 퍼즐이 맞았을경우 성공 창을 띄우겠습니다.
        Texture2D suc;
success시 나올 그림을 선언해주시구요~
            suc = Content.Load<Texture2D>("suc");
로드해주시구요~

이제 성공시 bool 자료형을 하나 사용하여 성공시에만 그림을 나타나게 하겠습니다.
먼저 그림이 완성되는 것을 판단하겠습니다.




public void testsuccess() { int su =0; int suess = 0; for (int n = 0; n < 4; n++) { for (int m = 0; m < 6; m++) { if (data[n, m] == su) { if (suess >= 22) { success = true; } suess++; } su++; } } }

protected override void Update(GameTime gameTime)
업데이트 부분에 위 함수를 추가 해줍니다.
매프레임 성공을 하였는지를 검사합니다
만약 성공했을 시에는 success = true ; 값으로 나타내줍니다.
이중 for 문을 이용해서 data배열 값이 차례대로 나열되어있는지를 검사하고
suess값을 1씩 더해서 그수가 차례대로 완성이된다면 true 값을 반환합니다.



success가 true가 되며 더이상 키 입력을 받지 않고 화면상에 성공창을 띄우도록 하겠습니다.
if (success)
{
spriteBatch.Draw(suc, new Vector2(20,50), Color.White);
}
Draw 부분에 위 if문을 추가하였습니다
success가 true 값이되면 20,50위치에 success그림을 호출합니다.
키입력 부분에는 if(!success) 거짓일 때만 먹히게 하면 됩니다. 한번해보세요^^

네 간단한 퍼즐게임을 만들어봤습니다.^^

다음에는 xna creators 있는 예제를 파보도록 하겠습니다.

MoveBlock(int dx, int dy) 함수를 이용해서 키보드에 따라 움직이는 퍼즐을 만들어보겠습니다.

가장먼저 키보드입력을 받아오도록 합시다.



protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); KeyboardState KeyboardState = Keyboard.GetState();//키보드상태 if (KeyboardState.IsKeyDown(Keys.Left) && stopkeyboard.IsKeyUp(Keys.Left)) { MoveBlock(-1, 0); } if (KeyboardState.IsKeyDown(Keys.Right) && stopkeyboard.IsKeyUp(Keys.Right)) { MoveBlock(1, 0); } if (KeyboardState.IsKeyDown(Keys.Up) && stopkeyboard.IsKeyUp(Keys.Up)) { MoveBlock(0, -1); } if (KeyboardState.IsKeyDown(Keys.Down) && stopkeyboard.IsKeyUp(Keys.Down)) { MoveBlock(0, 1); }

키 입력에 따라 MoveBlock() 함수를 호출 합니다.
각 수에따라 위아래로 셀을 움직일 예정입니다.

키 입력 부분이 완성 되었습니다. 그럼 이제 MoveBlock 함수를 만들어 봅시다.



public void MoveBlock(int dx, int dy) { bool bFind = false;//빈블럭 찾기 int ex = 0;//빈블럭 좌표값 int ey = 0;//빈블럭 좌표값 for (int n = 0; n < 4 && !bFind; n++) { for (int m = 0; m < 6 && !bFind; m++) { if (data[n,m] < 0) { bFind = true; ex = m; ey = n; } } } if (ex + dx >= 6 || ex + dx < 0 || ey + dy >= 4 || ey + dy < 0) return; //만약 좌우 위아래 끝에 도달하면 움직이지 말고 리턴하라// data[ey, ex] = data[ey + dy, ex + dx];// data[ey + dy, ex + dx] = -1;//빈블럭과 움직인 셀을 바꿔줍니다. }

-1의 값을 가진 data[n,m] 의 값을 찾습니다.
찾은후 좌표값을 저장하고 MoveBlock시 들어온 인수를 더해서
-1을 가진 셀과 바꿔버리는 것입니다.

이렇게 하면 -1을 값을 가진 것은 그리지 않게 되고
data 값에 의해서 그림영역이 정해지기때문에 그림이 바뀌지 않고 그 위치로 바뀌게 됩니다.

네 다음 #3에서는 랜덤으로 배열하고 완성 시에 success 글을 출력하도록 하겠습니다.
사용자 삽입 이미지


%보너스


private void setdivise() { graphics.PreferredBackBufferWidth = 240; graphics.PreferredBackBufferHeight = 160; graphics.ApplyChanges(); } 화면 크기를 바꾼 함수입니다. 초기화 부분에 넣어두시면 됩니다.^^
간단한 퍼즐게임을 하나 만들어 보겠습니다.^^

조각 맞추기 퍼즐게임을 다들 잘 아시죠^^?
이미지는 이걸로 하겠습니다
가로 6칸 세로 4칸으로 구현하겠습니다.
사용자 삽입 이미지

게임을 어떻게 구현할지 간단하게 생각해보겠습니다.
1. 그림파일을 가져와 일정한 크기로 나열합니다.
2. 각 그림들을 내열할때 다중배열로 저장합니다.
3. Rectangle, vector2, int[][] 만 잘사용하면 금방 끝납니다^^

시작 하겠습니다.

가장먼저 초기 선언을 하겠습니다.

public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Texture2D bk;//배경그림 const int bw = 40;//각 셀 사이즈 40*40 int[,] data = new int[4, 6];//가로 6 세로 4사이즈 int count = 0;//data배열에 값을 저장할 변수 KeyboardState stopkeyboard;//키보드 중복 인식 방지


주석 참고 해주시구요~
가로 셀 6개 세로 셀 4개의 조각 퍼즐을 만들 생각입니다.
data[0,0] = 0; data[0,1] = 1;.... 이런식으로 지정할 생각입니다.


protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); bk = Content.Load("bk"); // TODO: use this.Content to load your game content here }
위와 같이 그림파일 불러와 주세요

다음으로는 초기화 부분입니다 각 셀의 정보를 가지고 있을 data 녀석에게 수치를 부여합시다.
각 수치에 따라 그림 위치가 정해질 것 입니다.



protected override void Initialize() { // TODO: Add your initialization logic here for (int i = 0; i < 4; i++) { for (int j = 0; j < 6; j++) { if (i == 3 && j == 5) data[i, j] = -1; else data[i, j] = count++; } } setdivise();//화면크기 변경 무시하셔도 됩니다. base.Initialize(); }
이중 for문을 이요해서 data[0,0]~data[3,5] 까지 0~22 의 수치와
마지막 셀에는 -1의 수치를 넣어주도록 합시다.
-1을 넣은 이유는 나중에 그릴때 빈 블럭(퍼즐조각의경우 빈블럭있음)을
그리기 위함입니다.

네 키보드 입력을 받아 이동할 MoveBlock(int x, int y)는 두번째 블로깅에서
올리도록 하고 이번에는 일단 지금 까지 작성한걸 출력해보도록 하겠습니다.
>

protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); for(int n=0; n<4; n++) { for(int m=0; m<6; m++) { if(data[n,m] < 0)//-1은 그리지않음(빈블럭) { } else{ int cx = data[n,m]%6;(x셀의 좌표는 0~5까지) int cy = data[n,m]/6;(y셀의 좌표는 0,1,2,3까지) Rectangle Clip = new Rectangle(cx * bw, cy *bw ,bw, bw); spriteBatch.Draw(bk, new Vector2(m * bw,n *bw), Clip, Color.White); } } } spriteBatch.End(); }
draw 부분에 위와같이 작성하도록 합시다.
for문으로 각 셀의 데이터를 조사합니다
-1 일 경우 아무것도 하지 않고 else 일 경우에 그리도록합니다.
x좌표는 총 0~5까지니 6으로 나눈 나머지가 되겠구요
y좌표는 몫이 0~3 까지 나오게 합니다.
그림내부에 그릴 영역을 설정합니다(rectangle)
bw 는 각 셀의 크기 입니다.
cx,cy 좌표에 bw크기만큼 곱합니다. 그림의 좌표 값이 되겠구요 이미지 영역은 bw,bw 만큼 설정합니다.
마지막 이제 그리도록 하겠씁니다
spriteBatch.Draw(bk, new Vector2(m * bw,n *bw), Clip, Color.White);

아까 저장한 bk의 이미지에 위치는 각 셀의 data[n,m] 값을 가져와 설정하고
그림 영역은 셀이 저장하고있는 수치정보로 Clip(rectangle)을 설정합니다.

자 위와 같이 입력하셨으면 출력해보도록 하겠습니다.

사용자 삽입 이미지
다음은 키보드 입력을 받아 이동하는 함수를 하나 제작해보도록 하겠습니다.
3#에서는 랜덤으로 퍼즐을 나열하도록 해보겠습니다.

WIPI2.0 SDK 개발환경을 설정해보도록 하겠습니다.

가장먼저 준비물이 필요합니다.
1. WIPI 2.0
2. EditPlus 3.0
3. 자바

각 프로그램을 받는 사이트는 궁금하신분은 댓글 달아주세요^^;

가장먼저 에딧 플러스 3.0 을 설치하도록 합시다.

사용자 삽입 이미지
사용자 삽입 이미지













설치를 마치셨으면 다음으로는 자바를 설치하도록 합시다.
사용자 삽입 이미지


j2sdk-1_4_2_17-windows-i586-p 이 버젼으로 설치를 하였습니다.

이제 마지막으로 위피 자바 SDK를 설치하도록 하겠습니다.
설치 경로가 중요하니 알기 쉬운 경로로 설치하세요.

이제부터 중요한 부분입니다. 에딧 플러스를 실행해주세요
사용자 삽입 이미지
컴파일을 위해 설정을 해야합니다 도구에서 유저 툴로 들어가주세요~
사용자 삽입 이미지

그룹 1번 이름을 아무거나 정해주시구요 add Tool 로 두개를 만들어주세요
하나는 컴파일용이고 하나는 에뮬레이터 실행기 입니다. ^^

사용자 삽입 이미지
이부분이 중요합니다 메뉴 text는 아무거나 정해주시구요
Command  - > C:\j2sdk1.4.2_17\bin\javac.exe 자바를 설치한 폴더를 지정해주시구요
Argument   - >-g:none -O -bootclasspath c:\xce\classes\classes.jar -source 1.4 $(FileName)
밑줄 친 부분은 xce가 설치된 폴더에 지정해주셔야 합니다.
Initial dir - > $(FileDir)
사용자 삽입 이미지
Capture output 체크 해주세요^^

다음으로 에뮬레이터 설정하겠습니다.
사용자 삽입 이미지
Command - > C:\xce\bin\PhoneEmul_64kc.exe
Arogument  - >
-h 2048 -classpath \project\$(FileNameNoExt)\ -skin \SKTT\SKTT240320.XML $(FileNameNoExt)
Initial dir - > $(FileDir)


설정은 이것으로 끝났습니다. xce 폴더안에 project 폴더하나 만들어주시구요~
사용자 삽입 이미지


사용자 삽입 이미지
















에딧플러스 3.0에서 디렉토리를 위와 같이 설정해주세요^^ hellowipi는 임의로 정한 이름입니다 아무거나
하셔두 됩니다. 단 컴파일시 같은 이름이어야 합니다^^
자 실행 해보도록 합시다^^
hello world 를 출력하는 코드입니다.
프로젝트 폴더안에 새로운 이름의 프로젝트를 생성후
디렉토리 설정 - > new -> java 로 생성후
코드를 붙여넣기 해주세요^^

import org.kwis.msp.lcdui.*;
public class hellowipi extends Jlet {
 public void startApp(String [] args) {
  Display dis = Display.getDefaultDisplay();
  hellowipiCard card = new hellowipiCard();
  dis.pushCard(card);
 }
 public void pauseApp() {}
 public void destroyApp(boolean unconditional) {}
}
class hellowipiCard extends Card {
 protected void paint(Graphics g) {
 g.setColor(0x00FF0000);
   g.drawString("Hello wipi", 0,0, Graphics.TOP | Graphics.LEFT);
 }
}

Ctrl + 1 을 누르면 컴파일이 됩니다.(에러시 클래스명이 틀릴수 있으니 유의하시기랍니다.
클래스명 + 폴더명이 같아야 실행됩니다.)
Ctrl + 2 를 누르면 아래와 같이 실행됩니다.
사용자 삽입 이미지

궁금 하신점 있으시면 댓글 달아주세요^^

"protected 멤버는 외부에서 보면  private로 보이고, 상속 관계에서 보면  public으로 보인다"

당연한 글이지만 머리속에 개념이 완벽하게 잡히는 한 문장


프로그래밍 하면 할수록 기초가 중요하다는 것을 더욱 뼈저리게 느끼고 있습니다.

고군분투 (한게임)

사용자 삽입 이미지
                                                       
1. 고군분투 (한게임)

한게임에서 서비스하고 있는 고군분투 거의 1년 가까이 인기순위 상위에 랭크되어 있는
게임이다. 고군분투에 대해서 알아보자.

  #1 도대체 어떤 게임?
  캐릭터가 앞으로 나가면서 마우스 클릭으로 동전을 모으는 단순한 목적을 가지고 있지만 그 동전을 많이 모으기 위해서 고도의 집중을 요한다.
레벨이 올라갈수록 맵이 어려워지고 지나가는 속도가 빨라져 점프나 와이어 액션을 하는데 긴장감과 재미를 준다. 게임화면 옆에 랭킹이 실시간으로 변화되어 기록을 세우기 위한 경쟁심을 불러일으키기 충분하다.
동전을 연속적으로 획득 시 보너스나 베스트와 같은 이벤트가 발생한다.

  #2 성공한 이유는?
   ※. 가장 큰 이유라고 생각하는 것은 랭크 시스템이다
 플래시 게임이라면 인터넷 유저들의 경쟁심을 유발한다면 그보다 좋은 특징은 없을 것이다. 다른 게임도 다들 랭크 시스템이 있지만 일단 한게임이라는 큰 서비스회사에서 움직이다보니 그 크기가 다르다. 한마디로 큰 경쟁 시스템의 도입이다.

   ※. 화면의 깔끔 명료함 & 간단한 조작 방법
1. 가장 먼저 게임의 목표인 동전이 왼쪽 상당에 나온다. 금색으로 배경 색과 대비를 이루면서 가독성을 높여주고 있다. 다음으로는 2. 자신의 최고기록이 게임을 하는 내내 눈에 보이는 위치하고 있다. 캐릭터를 주시할 수밖에 없는 게임인데 바로 뒤에 자신의 최고기록이 보인다. 하면서 최고기록에 욕심이 생길 수밖에 없다. 3. 자신이 현재 어느 정도 레벨에 도달했는지 보여주고 있음으로 최고기록과 동시에 자신의 현재 달성 정도를 알 수 있다. 그리고 마지막 보너스로 뒤에 고양이 동상의 표정이 변함으로써 혼자 게임을 하지만 누군가가 알아주고 있다는 보상심리까지 추가하고 있다.


모든 내용을 정리해보자면
1. 가독성을 높인 스코어
2. 최고기록정보의 위치 선정
3. 현재 자신의 달성 정도를 표시
4. 반응을 하는 배경

레벨디자인부분도 상당히 잘 되어 있었습니다. 다음에는 이부분에 대해서 알아보도록 하겠습니다.

+ Recent posts