2013-03-15 2 views
0

다른 클래스에서 모델을 그려야합니다. 다른 클래스에서 모델을 그리려고했습니다. 그러나 내 모델은 내가 만든 코드로는 전혀 렌더링되지 않습니다. 여기 다른 클래스에서 모델을 그릴 수 있습니까?

GAME1의 코드 : ( 참고 :이 코드는 GAME1 잘 작동)

private Vector3 position = new Vector3(0, 0, 0); 
private Matrix world; 
private Matrix view; 
private Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), 800f/600f, 0.1f, 100f); 
private Model car; 
SpriteBatch spriteBatch; 
GraphicsDeviceManager graphics; 
public Game1() 
{ 

    graphics = new GraphicsDeviceManager(this); 
    Content.RootDirectory = "Content"; 
    Vector3 transformedReference = Vector3.Transform(new Vector3(0, 5, 15), Matrix.CreateRotationY(0f)); 
    view = Matrix.CreateLookAt(position + transformedReference, position, Vector3.Up); 
} 
protected override void Initialize() 
{ 
    Components.Add(new Car(this, view, projection)); 
    world = Matrix.CreateTranslation(position); 
    Vector3 transformedReference = Vector3.Transform(new Vector3(0, 5, 15), Matrix.CreateRotationY(0f)); 
    view = Matrix.CreateLookAt(position + transformedReference, position, Vector3.Up); 
    base.Initialize(); 
} 
protected override void LoadContent() 
{ 
    spriteBatch = new SpriteBatch(GraphicsDevice); 
    car = Content.Load <Model> ("car\\car"); 
} 
public void DrawModel(Model model, Matrix world, Matrix view, Matrix projection) 
{ 

    foreach(ModelMesh mesh in model.Meshes) 
    { 
     foreach(BasicEffect effect in mesh.Effects) 
     { 

      effect.EnableDefaultLighting(); 
      effect.PreferPerPixelLighting = true; 
      effect.World = mesh.ParentBone.Transform * world; 
      effect.View = view; 
      effect.Projection = projection; 
     } 

     mesh.Draw(); 
    } 
} 
protected override void Update(GameTime gameTime) 
{ 
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
     this.Exit(); 
    world = Matrix.CreateTranslation(position); 
    base.Update(gameTime); 
} 
protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.CornflowerBlue); 

    DrawModel(car, world, view, projection); 
    base.Draw(gameTime); 
} 

여기 내 의 코드가 다른 클래스 : (참고 :이 코드는 아무튼 다만 승, 내 포인트 '는 t 잘 작동 또는 모델은

  public class Car: DrawableGameComponent 
{ 
    public Model CarModel 
    { 
     get; 
     set; 
    } 
    private Vector3 position = new Vector3(0, 0, 0); 
    private Matrix World = Matrix.CreateTranslation(new Vector3(0, 0, 0)); 
    public Matrix Camera 
    { 
     get; 
     set; 
    } 
    public Matrix Projection 
    { 
     get; 
     set; 
    } 
    public Game1 GameParent 
    { 
     get; 
     set; 
    } 
    public Car(Game1 game, Matrix view, Matrix projection): base(game) 
    { 
     view = Camera; 
     Projection = projection; 
     Camera = view; 
     GameParent = game; 

     World = Matrix.CreateTranslation(position); 
     base.Initialize(); 
    } 

    public static void DrawModel(Model model, Matrix world, Matrix view, Matrix projection) 
    { 
     foreach(ModelMesh mesh in model.Meshes) 
     { 
      foreach(BasicEffect effect in mesh.Effects) 
      { 

       effect.EnableDefaultLighting(); 
       effect.PreferPerPixelLighting = true; 
       effect.World = mesh.ParentBone.Transform * world; 
       effect.View = view; 
       effect.Projection = projection; 
      } 

      mesh.Draw(); 
     } 
    } 
    protected override void LoadContent() 
    { 
     CarModel = GameParent.Content.Load <Model> ("car\\car"); 
     base.LoadContent(); 
    } 
    public override void Update(GameTime gameTime) 
    { 
     base.Update(gameTime); 
    } 
    public override void Draw(GameTime gameTime) 
    { 
     DrawModel(CarModel, World, Camera, Projection); //DOESN'T WORK WELL!! 
     base.Draw(gameTime); 
    } 
} 

OK) GAME1 그래픽을 렌더링 할 수 없습니다 개미 다른 클래스에서 3D 모델을 그리기,

음, 내가 이것을 해결하기 위해 어떻게해야합니까?

+0

!). 나는 예제로 작업 할 시간이 없기 때문에 이것을 답으로 쓰지 않겠다. – Sayse

+0

http://gamedev.stackexchange.com/ –

+0

에서 질문을해야한다고 생각합니다. @Sayse : 나에게 예제를 주시겠습니까? 당신이 나에게이 질문과 관련된 링크를 줄 수있는 시간 – Ricks

답변

2

그것 하나에 두 가지 버전이 포함되어 있기 때문에, 여러분의 코드에 어떤 문제가 있는지보기 위해 어려운 난 당신이 날 도와 상관하지 않습니다 당신이 무슨 뜻인지 이해할 수 있기를 바랍니다

.... 조금만 청소하십시오. 다음은 몇 가지 팁입니다.

내 경험상 개별 객체에 DrawableGameComponent를 사용하고 싶지 않습니다. 자신 만의 수업을 쓰고 컬렉션이나 그와 비슷한 수업에 집착하십시오. 이 방법을 사용하면 XNA가 업데이트를 실행하고 그릴 수있는 부두를 다루지 않아도됩니다. 자신을 제어하는 ​​것이 더 좋습니다.

CAR에서 뷰 및 프로젝션 행렬을 처리하지 않으려는 경우입니다. 게임 클래스에 남겨둔 채로 (지금은 카메라 클래스가 있어야합니다.) Car.Draw 메소드에 전달하십시오. 저는 당신이 생성자에서 그것을 전달하는 것을 보았습니다, 그러나 Matrixes는 제가 기억할 수있는 한 가치 타입입니다. 그래서 코드의 다른 부분에서 여러분의 시각을 변경하면 여러분의 자동차에 전파되지 않을 것입니다. 당신이 그리는 내 변화에서 얻을 수 있습니다로 수신하지 않도록 당신은 또한, (정적 제거) DrawModel에게 정상적인 방법을 확인해야합니다,

public void Draw(Matrix view, Matrix projection) 
{ 
    DrawModel(view, projection); 
} 

:

그래서에 Car.Draw 변경 모델과 세계.

귀하의 차량에는 회전을위한 쿼터니언 (Quaternion)이 있어야합니다. 따라서 Car.World는 다음과 같이 쓸 수 있습니다.

Matrix World = Matrix.Identity; 

//In update: 
World = Matrix.FromQuaternion(Rotation) * Matrix.CreateTranslation(Position); 

Car의 생성자를 매개 변수로 사용하도록합니다. 그런 식으로 "GameParent"와 LoadContent-Method도 제거 할 수 있습니다. 당신이 게임 수준에서

:

도랑 정적 DrawModel-방법. 필드 세계와 자동차를 버리십시오. 그들은 지금 카 클래스에 속한다.

Car MyCar = null; 

Game1.LoadContent에서 :

귀하의 차량에 대한 필드 (속성없는 클래스 수준 변수)를 확인 GAME1에서

MyCar = new Car(Content.Load<Model>("car//car")); 

.업데이트 : Game1.Draw에서

MyCar.Update(gameTime); 

:

GraphicsDevice.Clear(Color.CornFlowerBlue); 
MyCar.Draw(View, Projection); 

편집; 게임 엔진에 대한

, 당신은 일반적으로 현재 누락 일부 "부품"이됩니다

  • 게임 주 시스템을
  • (메뉴 상태의 한 유형이며, NormalLevel 및 BossLeve 다른 사람의 예입니다)
  • 카메라 서비스 (어디에서든지 현재 뷰/투영 매트릭스를 얻을 수 있습니다.) - 타이밍 서비스 (어디서든 얻을 수 있습니다 (부동) gameTime.ElapsedGametime.TotalSeconds)
  • 입력 서비스 어디에서든 값)

A 손떨림 방지 시스템은처럼 간단 할 수있다 :

당신이 할 수있는 예,이 작업을 수행하는 한 가지 방법은 각 모델 (또는 모델 목록에서 무승부 함수에 대한 자료 메서드 호출을하는 것입니다
public interface ICamera 
{ 
    Vector3 Position { get; } 
    Matrix View { get; } 
    Matrix Projection { get; } 

    void Update(float deltaTime); 
    void Target(Vector3 targetPosition); 
} 

public class CameraService 
{ 
    public static ICamera ActiveCamera { get; private set; } 

    public static void ActivateCamera(ICamera camera) 
    { 
     if (ActiveCamera != null) 
      camera.Target(ActiveCamera.Target); 

     ActiveCamera = camera; 
    } 

    public static Update(float deltaTime) 
    { 
     if (ActiveCamera != null) 
      ActiveCamera.Update(deltaTime); 
    } 
} 

public class BasicCamera: ICamera 
{ 
    public Vector3 Position { get; protected set; } 
    public Matrix View { get; protected set; } 
    public Matrix Projection { get; protected set; } 

    public void Target(Vector3 targetPosition) 
    { 
     View = Matrix.CreateLookAt(Position, targetPosition, something something); 
    } 

    public BasicCamera(Vector3 position, Vector3 target) 
    { 
     //Set shit up 
    } 
} 
+0

ok ,,, 이것은 잘 작동했다. 인스턴스가 많은 경우에는 어떻게해야합니까? 각 인스턴스를 그려야합니까? List.Remove()처럼 더 이상 사용하지 않으면 인스턴스를 제거 할 수 있습니다 – Ricks

+0

자동차 컬렉션을 유지하는 "자동차 관리자"가 있어야하며이를 통해 루프를 업데이트하고 그립니다. 게임을 제거하고 추가하는 일을 처리해야합니다. –

+0

알았어. 당신이 정말로 이걸 붙잡 혔을 때 당신은 정말로 저에게 아이디어를줍니다. 답변 해 주셔서 감사합니다. – Ricks