2011-09-27 6 views
2

작년 C# 프로젝트가 게임처럼 'Monster Dash'이 될 것이라고 결정 했으므로 C# 및 XNA를 사용하여 개발할 것이며 PC 용으로 타겟팅 될 것입니다. Microsoft Visual Studio 2010 및 XNA Game Studio 4.0 사용 이 게임은 3D가 아닌 2D 게임이 될 것입니다.AC# & XNA '괴물 대시'만들기 게임

개발 과정에 대한 생각, 몇 가지 문제가 일어나 :

먼저, 내가 만들 필요가 '정렬의-플랫폼'플레이어가 실행되고 그들 사이의 구멍과 틈이있을 것이다 (무작위로 나타납니다) 그리고 나는 그 일을하는 방법을 모른다! 필자가 발견 한 유일한 사실은 마이크로 소프트에서 'Platformer'이라는 샘플 코드가 있다는 것을 설명 할 수있는 것으로 밝혀졌지만, 나는 이해하지 못했다. (사람들이 사용하는 방법을 설명 할 수 있으면 좋을 것이다.).

두 번째 두 번째로는 선수가 뛰어 와야합니다 이를 처리하거나 유용한 코드를 가리킬 수있는 방법을 제안 할 수 있습니다.

감사합니다. iLyrical.

+0

http://gamedev.stackexchange.com/ –

+0

왜에 더 나은 해답을 얻을 수있는이 질문에 뭔가 간단한 것으로 시작하니? Monster Dash 게임이 [Canabalt] (http://www.adamatomic.com/canabalt/)를 기반으로하는 게임을 만들어보세요. 작업을 쉽게하기 위해 iOS 포트의 소스 코드가 공개되었습니다 (https://github.com/ericjohnson/canabalt-ios). – Elideb

+0

와우, 고마워요! 공개적으로 공개 된 코드인지 몰랐습니다! 나는 Canabalt와 같은 것을 생각했지만 코드가 필요했습니다 ... 나는 확실히 그것을 체크 할 것입니다! – Itamar

답변

3

2 차원이기 때문에 실수하지 마십시오. 플랫폼 작성자는 쉬운 작업이 아닙니다. 그래서 나는 XNA와 C#을 사용하여 얻을 수있는 제 3 자 라이브러리 사용을 권장합니다. 이미 좋은 출발점입니다. 다음은, 그리고 이것이 여러분의 질문이 들어오는 곳, 물리학을 해결하는 방법입니다. 당신은 좋은 학습 경험이지만, 시간이 중요하다면 그것은 어려울 수 있고 좌절 할 수 있습니다. 그래서 나는 제 3 자 lib를 사용하여, Farseer처럼 제안 할 것입니다. 어쩌면 this 작은 튜토리얼도 유용합니다.

하지만이 작업은 쉬운 일이 아닙니다. 당연히 모르는 당신의 스킬에 따라 게임이 되어야만한다면 더 쉬운 게임을 제안 할 것입니다. 게임은 적절하게 상상할 수있는 가장 어려운 프로그래밍 작업입니다. 동시에 여러 하위 시스템 다루기 (그래픽, 인공 지능, 소리, 입력, 물리); 그것들을 함께 작동시키는 것은 이미 큰 일이지만 내용 (Sprites, Wavs, Music, Menu gfx 등)을 가지고있는 것은 또 다른 짐승입니다.

마지막 조언은 Platformer 코드를 이해하지 못하는 경우입니다. 그것을 다시 읽고 다시 읽으십시오. 당신이 이해할 때까지 그들에 대해 읽은 특정 부분을 이해하지 못한다면. C#에 문제가 있으면 먼저 배워야하고 결코 배워야합니다. 또한 찾을 수있는 게임에 대한 자습서와 코드를 읽을 수 있습니다. 어떻게 그리고 왜 다른 사람들이 문제를 해결하는지 보는 것이 중요합니다.

+0

+1 "만약 당신이 platformer 코드를 이해하지 못한다면, 다시 읽으십시오 ..."MS 샘플은 매우 훌륭합니다. –

2

Microsoft 웹 사이트의 platformer 예제를 시작하는 것이 좋습니다.

나는 그 예를 바탕으로 다소 비슷한 것을 만들었습니다. "타일"목록의 목록 (타일 목록)> 타일의 정적 크기 (예 : 16x16 픽셀)를 설정하면 목록을 반복하는 것입니다. 그리기/충돌 감지 등을 할 수 있습니다. 생각해 보면 생각합니다. 원한다면 나중에 코드를 게시 할 수 있습니다. 집에 있습니다.

일반적으로 움직이는 물리학에 접근하는 간단한 방법은 위치에 하나, 속도에 하나, 가속으로 하나씩 3 개의 Vector2 개체를 사용하는 것입니다. 간단한 물리학에 익숙하다면, 위치 = 속도 * deltaTime, 속도 = 가속 * deltaTime.플레이어가 방금 업데이트 루프에서 다음 선수 가속을 증가 점프 할 때, 위치를 계산 :

// On Jump 
player.acceleration += someConstant 

// On Update 
this.velocity += this.acceleration * deltaTime 
this.position += this.velocity * deltaTime 

다시 말하지만, 나중에 진짜 코드를 게시 할 수 있습니다.

희망이 당신이 시작하는 데 도움이

편집 : 여기

는 일부 이동 코드의

public override void Update(GameTime gameTime) 
    { 
     float deltaTime = ((float)gameTime.ElapsedGameTime.Milliseconds)/1000f; 
     currentState = Keyboard.GetState(); 

     if (canMove) 
     { 

      // Input 
      if (currentState.IsKeyDown(Keys.Left)) 
       Acceleration.X -= 1000; 
      if (currentState.IsKeyDown(Keys.Right)) 
       Acceleration.X += 1000; 
      if (!airbourne && currentState.IsKeyDown(Keys.Space) && previousState.IsKeyUp(Keys.Space)) 
      { 
       Acceleration.Y -= 25000; 
       airbourne = true; 
      } 

      // Friction in X to limit sliding 
      if (Velocity.X > 0) 
      { 
       Velocity.X -= X_FRICTION; 
       if (Velocity.X < 0) 
        Velocity.X = 0; 
      } 
      else 
      { 
       Velocity.X += X_FRICTION; 
       if (Velocity.X > 0) 
        Velocity.X = 0; 
      } 

      // Gravity 
      Acceleration.Y += 500; 
     } 

     Velocity += Acceleration * deltaTime; 
     if (Velocity.X > 0) 
      Velocity.X += speedMod; 
     else if (Velocity.X < 0) 
      Velocity.X -= speedMod; 

     // Move and check collisions in X 
     Position.X += Velocity.X * deltaTime; 
     if (game.checkCollisions(boundingBox())) 
     { 
      Position.X -= Velocity.X * deltaTime; 
      Velocity.X = 0; 
     } 

     // Move and check collisions in Y 
     Position.Y += Velocity.Y * deltaTime; 
     movingUp = Velocity.Y < 0; 
     if (game.checkCollisions(boundingBox())) 
     { 
      // If moving downwards, player not airbourne 
      if (Velocity.Y >= 0) 
      { 
       airbourne = false; 
       Position.Y = game.getCollisionDistance(boundingBox()) - 32; 
      } 
      else 
      { 
       Position.Y = game.getCollisionDistance(boundingBox()) + 32; 
      } 

      Velocity.Y = 0; 
     } 
     else 
      airbourne = true; 

     movingUp = false; 

     // Reset acceleration 
     Acceleration = Vector2.Zero; 
     previousState = currentState; 

    }