Pāreja uz MonoGame

Pirms pāris nedēļām iegādājos jauno Windows 8.1. Viss strādā lieliski, bet ir arī daži pārsteigumi, kā piemēram ierobežojumi veidot XNA spēles priekš Windows 8 un Windows Phone 8. Itkā ir iespējams turpināt rakstīt parastas Windows aplikācijas, bet nevar izmanot WP8 un W8 specifiskas fīčas. Tapēc nolēmu migrēt uz MonoGame. Nekādas lielas atšķirības nemanu, bij problēmas ar Visual Studio + MonoGame templates, bet kombinācijā VS2012 Pro un MonoGame 3 viss strādā. Nopirku arī Nokia Lumia 925, tapēc centīšos veidot spēli tā, lai varētu palaist arī uz telefona.

Tālu neesu ticis, uz doto mirkli izskatās šādi:

Pirmā kustība uz ekrāna.

Šodien sāku darboties ap pašu spēli. Uztaisiju ‘kuģi’ un nelielu animāciju, kā arī zvaigznes. Vajadzētu beidzot iegādāties videokarti, savādak pat tik elementāru spēli ierakstot rezultāts raustās. Arī XBox kontrolieris nenāktu par sliktu.

Screen menedžers

Nolēmu jau pašā sākumā izveidot ļoti vienkaršu Screen(State) menedžeri.

Kas ir screen vai state menedžers?

Spēle var būt dažādos “stāvokļos”, piemeram MENU, PLAY, PAUSE utt. Katram no šiem stāvokļiem būs atbilstoša klase, Screen menedžers koordinēs pārslēgšanos no viena Screen uz nakamo. No sākuma es izveidošu ļoti elementāru medžedzeri bez pārslēgšanās efektiem, loading screeniem utt.

Tātad pievienoju projektam mapi SCREENS, ScreenManager klasi, abstraktu klasi Screen un iesākumam divas konkrētas klases MenuScreen un PlayScreen, kuras izriet no Screen. ScreenMenedzer izriet no DrawableGameComponent un tiek pievienots compontntiem Game klases konstruktorā.

ScreenManager screenManager = new ScreenManager(this);
screenManager.SetScreen(new MainMenuScreen(screenManager));
Components.Add(screenManager);

 


public class ScreenManager : DrawableGameComponent
{
#region FIELDS
private Stack<Screen> screens;
private Screen screenToUpdate;

private SpriteBatch spriteBatch;
#endregion

#region CONSTRUCTORS
public ScreenManager(Game game)
: base(game)
{
screens = new Stack<Screen>();
screenToUpdate = null;
}
#endregion

#region SCREEN MANAGER INTERFACE
public void SetScreen(Screen screen)
{
foreach (Screen scr in screens)
{
scr.UnloadContent();
}
screens.Clear();

screen.LoadContent();
screens.Push(screen);
}
#endregion

#region GAME INTERFACE
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
}

public override void Update(GameTime gameTime)
{
if (screens.Count > 0)
{
screenToUpdate = screens.Peek();
screenToUpdate.Update(gameTime);
}
}

public override void Draw(GameTime gameTime)
{
if (screens.Count > 0)
{
foreach (Screen screen in screens)
{
screen.Draw(spriteBatch);
}
}
}

protected override void UnloadContent()
{
foreach (Screen scr in screens)
{
scr.UnloadContent();
}
base.UnloadContent();
}
}

public class Screen
{
#region FIELDS
private ScreenManager screenManager;
#endregion

#region PROPERTIES
public Screen(ScreenManager screenManager)
{
this.screenManager = screenManager;
}
#endregion

#region CONSTRUCTORS
public ScreenManager ScreenManager
{
get { return screenManager; }
}
#endregion

#region PUBLIC METHODS
public virtual void LoadContent()
{

}

public virtual void Update(GameTime gameTime)
{

}

public virtual void Draw(SpriteBatch spriteBatch)
{

}

public virtual void UnloadContent()
{

}
#endregion
}
class MainMenuScreen : Screen
{
#region TMP
private int testFrames = 0;
#endregion

#region CONSTRUCTORS
public MainMenuScreen(ScreenManager screenManager)
: base(screenManager)
{

}
#endregion

#region GAME INTERFACE
public override void LoadContent()
{
Console.WriteLine("MenuScreen LoadContent()");
}

public override void Update(GameTime gameTime)
{
Console.WriteLine("MenuScreen update()");

#region TMP
if (testFrames > 10)
{
ScreenManager.SetScreen(new PlayScreen(ScreenManager));
}

testFrames++;
#endregion
}

public override void Draw(SpriteBatch spriteBatch)
{
Console.WriteLine("MenuScreen draw()");
}

public override void UnloadContent()
{
Console.WriteLine("MenuScreen UnloadContent()");
}
}
#endregion

Asteroīdi 101

Iespaidojoties no foruma biedra Vilx (boot.lv), nolemu pielikt arī savu roku pamācību rakstīšanā. Mana pieeja gan būs mazliet savādāka, es mēģināšu izveidot ļoti vienkāršu spēli, programēšanas pamatus atstājot kāda cita ziņā. Tā kā Vilx deva priekšroku C#, tad es arī turpināšu izmantot šo pašu valodu un vidi. Brīdinu uzreiz ka manas C Sharp zinašanas nav tās spožākās, bet mēģināšu mācīties pats un pie reizes informēt citus, kā man sokas. Pieļauju domu ka mani raksti nebūs regulāri un var gadīties lielāki pārtraukumi starp tiem, kā arī jebkurā mirklī tie var apstāties pilnībā, jo esu samērā aizņemts darbā un koledžā. Mans programēšanas stils nav perfekts un risinājumi, kurus pielietošu, ne tuvu tie pareizakie, tomēr ceru uz kritiku komentāros, lai varētu mācīties gan pats, gan citi.
Pilnibā sākt visu no nulles nav vajadzības, tapēc izmantošu Microsoft populāro un samērā labi izstrādāto dzinēju – XNA. Microsoft pats ir pārstājis XNA attīstīšanu, bet ir pieejama alternatīva – MonoGame, kas būtiba ir kopēts XNA un pa lielam nav nozīmes kuru no viņiem izmantot.
Labākais ko manuprāt būtu darīt ir ķerties uzreiz vērsim pie ragiem. Pirmā lieta ko vajadzētu izdarīt ir lejupielādēt un uzinstalēt Visual Studio. Es izmantoju VS 2012 Desktop Edition, man kā studentam viņa ir pieejama par brīvu. Tiem kuriem nav pieejama 2012 versija, iesaku izmantot VS 2010 Express, jo ta ir bezmaksas un ari XNA vieglak uzstādāms. Protams vajadzētu lejupielādēt un uzstādīt pašu XNA. Instrukcijas un visu pārējo var atrast šeit http://www.microsoft.com/en-gb/download/details.aspx?id=23714
Kad tas ir izdarīts, var startēt Visual Studio un izveidot jaunu projektu. Izvelamies File->New Project un no pieejamajiem šabloniem Windows Game 4.0, projekta nosaukumam uz doto mirkli nav nozīmes, bet es ieteiktu izvēlēties kautko saprātīgu, piemēram manā gadījumā – Asteroidi. Kapēc Asteroidi? Tāpēc ka pirma spēle, kuru mēģināšu izveidot būs līdzīga klasiskai spēlei Asteroids.
lwsson_101_01
Kad viss gatavs, spiežam OK.
Kad viss veiksmīgi izdarīts, VS uzģenerēs standarta projektu. Pirmā lieta, ko ievēro ir Game1 klase. Tā kā man nepatīk tāds jokains nosaukums, tad es Solution Explorerī pārsaucu viņu vienkarši par Game. VS nomainis gan faila, gan klases nosaukumu.
Tik tālu visam vajadzētu būt skaidram. Turpmāk soli pa solim virzīšos uz priekšu, pieminot katru klasi un katru metodi, kuru pievienoju. Cerams kādam būs noderīgi.
Priekš pirmā raksta vajadzētu būt pietiekami. Spiežam Run vai F5 un skatamies kas notiek.
Veiksmi!