2012-12-05 3 views
2

게임이 재설정되지만 spritebatch가 그리기가 아닌 경우 화면에 빠른 로딩 스프라이트를 그려 넣으려고합니다. 나는 중단 점을 에 두었습니다. game.spritebatch.begin(); 그리고 내가 밟아 갈 때 아무것도 그려지지 않습니다. 어떤 아이디어?SpriteBatch가 화면에 그려지지 않습니다.

여기에 당신은 아마 올바른 장소에서 투표를하지 않은 내 리셋 기능

public void Reset() 
{ 
    loadingScreen = game.Content.Load<Texture2D>("Textures\\loadingScreen"); 
    game.spriteBatch.Begin(); 
    game.spriteBatch.Draw(loadingScreen, Vector2.Zero, null, Color.Black, 0.0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f); 
    game.spriteBatch.End(); 
    cameraPosition = original_cameraPosition; 
    players.Clear(); 
    furthest = 0; 
    enemies.Clear(); 
    LoadEnemies(); 
    ActivatePlayers(); 
} 
+2

'Reset()'이 시작될 때 한 프레임에만 로딩 텍스처가 표시된다는 것을 알고 계셨습니까? – neeKo

+0

Niko가 맞습니다. 로딩 화면이 실제로 볼 수있을만큼 충분히 오랫동안 표시 될만큼 충분히 오래 걸립니까? 게임 루프에서 드로잉으로 대체되기 전에? 'Update' 메소드에서'SupressDraw'를 호출하면, 게임 루프 자체가 무언가를 그리는 것을 막을 수 있습니다 - 이것이 일어나고 있는지 진단 할 수 있습니다. –

+0

game.GraphicsDevice.Present()를 추가하면 자주색 화면이 그려지고 1 초 동안 화면을 표시 할만큼 길게 지속됩니다. 또한 내가 spritebatch.End() 후에 내가 현재를 추가하기 전에 중단 점을 넣는다면 아무 것도 보여주지 않았다 (그리지 않았 음을 의미). 이제 보라색으로 보입니다. – jmack20093

답변

2

입니다. 텍스처 재설정 (loadingScreen = game.Content.Load<Texture2D>("Textures\\loadingScreen")은 한 번만 수행해야합니다. 그렇지 않으면 많은 양의 자원을 낭비합니다.

반면에 렌더링 코드 :

game.spriteBatch.Begin(); 
    game.spriteBatch.Draw(loadingScreen, Vector2.Zero, null, Color.Black, 0.0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f); 
    game.spriteBatch.End(); 

이 지속적 그렇지 않으면 그것은 단지 당신이 당신이 그것을 볼 수 없습니다 후 몇 ms 동안 렌더링 폴링 할 필요가있다. 렌더링 코드를 렌더링 메서드에 넣으면 제대로 작동합니다.

+2

실제로'Content.Load'에 대한 후속 호출은 원래 호출에서로드 된 동일한 인스턴스를 반환합니다. 실제로 그렇게 나쁘지는 않습니다. –

+1

그 경우에도, 그 가난한 관행. 다른 언어로 비슷한 것을하는 것은 자원을 먹는 확실한 방법이며, 그렇게 할 필요가 전혀 없기 때문에 자원을 먹는 것이 가장 좋습니다. –

+2

그건 사실입니다. XNA의 콘텐츠 관리자가 캐싱을한다는 것을 알면 로딩 화면 일 뿐이지 만, 다른 곳에서는 텍스처를 추적 할 수있는 기반을 제공합니다. –

2

Color.White을 사용해 보셨습니까?

+0

그래 그것은 차이를 만들지 않았다. – jmack20093

1

기본 구성에서 XNA는 더블 버퍼링을 사용합니다. 모든 추첨 명령이 발생하지만 결과는 백 버퍼으로 그려집니다. 결과를 화면에 표시하려면 프론트 버퍼와 바꿔야합니다.

일반적으로이 작업이 수행됩니다. 게임은 Update, BeginDraw, Draw, EndDraw을 루프로 호출합니다 (이들은 게임 클래스에서 재정의 할 수있는 Game의 메소드입니다). EndDraw의 기본 구현은 GraphicsDevice.Present을 호출하여 버퍼를 스왑합니다.

로딩 화면이므로 메인 게임 루프 바깥에이 그림을 그리는 인상을받습니다. 버퍼를 뒤집으려면 GraphicsDevice.Present 번으로 전화하십시오.

다른 몇 가지 팁 :

  • 당신은 본질적으로 반대 할 수 - 자동 도면에서 XNA를 방지 - BeginDraw을 무시하고 거짓 반환하여. 또는 SupressDraw으로 전화하십시오. (또는 당신은 EndDraw을 무시하고 base 메소드를 호출하지 않음으로써 스왑을 방지 할 수 있습니다.)

  • SpriteBatch

    End가 호출 될 때까지, 기본적으로 모든 도면을 버퍼링합니다. 그 후에 당신의 Present 전화를하십시오.

+0

이것은 화면에 그릴 무언가를 얻는 데 효과적이지만 텍스처를 그리지는 않습니다. 그냥 자주색 화면을 보여줍니다. – jmack20093

+0

@ jmack20093 자주색 화면은 "새로 할당 된 버퍼"색입니다 (아무 것도 그려지지 않음을 나타냄). 왜 그런 일이 일어나는지 확실하지 않습니다. 렌더링 타겟이 때때로 사람들을 위로 이동시킵니다.하지만 당신은 그것들을 사용하지 않습니다, 그렇죠? 스프라이트에 뭔가 문제가있을 수 있습니까? (완전히 투명하게 처리 할 수 ​​있다고 생각합니다.)'GraphicsDevice.Clear'를 사용하여 예상 한대로 그림이 실제로 나타나는지 확인할 수 있습니다. 'Clear' 뒤에'Present' *가 있어야 화면의 색상을 바꿀 수 있습니다 - 문제를 진단하기위한 좋은 출발점입니다. –

+0

클리어를 사용하면 색이 바뀌 었습니다. 문제를 일으킬 수있는 장면의 뒤에서 Draw()에서 무언가가 호출 될 수 있습니까? 게임은 3D이기 때문에 2D와 3D 드로잉 사이를 자주 변경하고 있지만 UI는'Reset()'과 같은 메소드를 사용하여'Draw()'에서 잘 그립니다. – jmack20093