我在游戏中添加多个视频时遇到了巨大的困难。在显示菜单之前,第一个视频播放完美(introVid)。一旦我按下开始,而不是显示第二个视频(在level0加载之前),我得到一个错误,说vidTexture2为NULL。
有没有人知道如何添加多个视频?这是视频管理器类的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using TileEngine;
using Microsoft.Xna.Framework.Media;
using System.Diagnostics;
namespace TimerGame.VideoManagers
{
public class Video1Manager
{
#region Declarations
public Video introVid, cineVid;
public VideoPlayer vidPlayer, vidPlayer2;
public Texture2D vidTexture, vidTexture2;
public Rectangle vidRectangle, vidRectangle2;
#endregion
#region Initialization
public void Initialize(ContentManager Content)
{
try
{
vidPlayer = new VideoPlayer();
vidPlayer2 = new VideoPlayer();
introVid = Content.Load<Video>(@"Videos\TimerIntro");
vidRectangle = new Rectangle(-225, 0,
1250, 600);
cineVid = Content.Load<Video>(@"Videos\Cinematic1");
vidRectangle2 = new Rectangle(0, 0, 800, 600);
}
catch { Debug.Write("Video Manager Failed"); }
}
public void PlayIntro()
{
try { vidPlayer.Play(introVid); }
catch { Debug.Write("IntroVid Failed"); }
}
public void PlayCine1()
{
try { vidPlayer2.Play(cineVid); }
catch { Debug.Write("Cinematic1 Failed"); }
}
#endregion
}
}
和Game1:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using TileEngine;
using TimerGame.MenuButtons;
using TimerGame.LevelManagers;
using TimerGame.VideoManagers;
namespace TimerGame
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Player player;
SpriteFont pericles10;
//MENU
...
Video1Manager videoManager;
//Levels
int currentLevel = -1;
int state = 0;
...
protected override void Initialize()
{
videoManager = new Video1Manager();
...
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
...
//Video
videoManager.Initialize(Content);
if (state == 0)
videoManager.PlayIntro();
...
}
protected override void Update(GameTime gameTime)
{
...
switch (state)
{
case 0:
if (keyState.IsKeyDown(Keys.Escape))
{
videoManager.vidPlayer.Stop();
state = 1;
}
if (videoManager.vidPlayer.State == MediaState.Stopped)
{
state = 1;
MediaPlayer.Play(menuMusic);
}
break;
case 1:
...
#region Playing
case GameState.Playing:
IsMouseVisible = false;
...
switch (currentLevel)
{
case 0:
videoManager.PlayCine1();
if (videoManager.vidPlayer2.State == MediaState.Stopped)
{
currentLevel++;
Level0Manager.LoadLevel();
}
break;
case 1:
player.Update(gameTime);
Level0Manager.Update(gameTime);
if (Level0Manager.LevelComplete)
{
currentLevel++;
}
break;
...some code
#endregion
}
break;
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
videoManager.vidTexture = videoManager.vidPlayer.GetTexture(); //Video TEXTURE
spriteBatch.Begin(
SpriteSortMode.BackToFront,
BlendState.AlphaBlend);
switch (state)
{
case 0:
spriteBatch.Draw(videoManager.vidTexture, videoManager.vidRectangle, Color.White);
break;
case 1:
switch (gameState)
{
#region Menu Draw
...
break;
#endregion
#region Playing Draw
case GameState.Playing:
MediaPlayer.Stop();
//spriteBatch.DrawString(pericles10, "12:20", new Vector2(100, 20), Color.Red);
TileMap.Draw(spriteBatch);
switch (currentLevel)
{
case 0:
videoManager.vidTexture2 = videoManager.vidPlayer2.GetTexture();
spriteBatch.Draw(videoManager.vidTexture2, videoManager.vidRectangle2, Color.White);
break;
case 1:
player.Draw(spriteBatch);
Level0Manager.Draw(spriteBatch);
break;
....other code
break;
#endregion
}
break;
}
spriteBatch.End();
base.Draw(gameTime);
}
}
}
答案 0 :(得分:0)
你必须检查纹理是否为空,我建议你查看下面链接的msdn。
来自msdn的代码片段:
// Draw the video, if we have a texture to draw.
if (videoTexture != null)
{
spriteBatch.Begin();
spriteBatch.Draw(videoTexture, screen, Color.White);
spriteBatch.End();
}