Na razie cały PDF jutro reszta;] popatrz tam czy tej Gameform bo chyba niebardzo po polsku to jest z tymi normalnymi przyciskami które sa tworzone dynamicznie. I tak ogolnie przejrzyj czy git;]
Klasy:
GameForm.cs
Zawiera panel gry i główny kod do gry. Do wyświetlania obrazków użyliśmy normalnych przycisków, które są tworzone dynamicznie(ich liczba określana jest w ustawieniach). Użyliśmy tez stopery do opóźnień, to znaczy wyświetlanie obrazków trwa około jednej sekundy, kiedy na niego klikniemy. Kiedy rozpoczynamy nową grę obrazki są dobierane losowo z określonego adresu, który sami podajemy i są one wczytywane do gry za pomocą klasy ImageContainer.
ImageContainer.cs
Po wczytywania obrazków na starcie, są one ustawiane w szeregach. Zrobiliśmy trzy różne rodzaje wdrażania obrazków do gry.
AddImageClipeed pola przycisków, w którym dobieramy parametry obrazków. A więc użyliśmy rodzimych nazw, aby pokazać nazwy z Windows GDI w języku C#. Kod wyświetlania obrazków znajduje się w ClipImage:
private Image ClipImage(Image source, int nDestWidth, int nDestHeight, int x, int y)
{
Image image;
Bitmap bitmap;
int hbitmap1, hbitmap2;
int hDC1, hDC2, screenDC;
int res;
// Zamieniamy wczytany obrazek na 32 bitowy, aby można go było użyć z GDI
bitmap = (Bitmap)source;
hbitmap1 = (int)bitmap.GetHbitmap();
// Tworzymy metodę do wprowadzania tła
hDC1 = CreateCompatibleDC(0);
res = SelectObject(hDC1, hbitmap1);
hDC2 = CreateCompatibleDC(0);
screenDC = GetDC(0);
// Tworzymy docelową bitmape
hbitmap2 = CreateCompatibleBitmap(screenDC, nDestWidth, nDestHeight);
res = SelectObject(hDC2, hbitmap2);
// Kopiujemy tło z źródła do docelowego miejsca
res = BitBlt(hDC2, x, y, nDestWidth, nDestHeight, hDC1, 0, 0, SRCCOPY);
// Jeszcze raz zamieniamy obrazek na 32 bitowy
image = Image.FromHbitmap(new IntPtr(hbitmap2));
// Czyścimy pamięć
res = DeleteObject(hbitmap1);
res = DeleteObject(hbitmap2);
res = DeleteDC(hDC1);
res = DeleteDC(hDC2);
res = ReleaseDC(0, screenDC);
// Następnie wczytujemy nowy obrazek
return image;
}
AddImageStretched obrazek źródłowy jest rozciągany albo docinany do określonych przez nas rozmiarów, dzieje się to zanim obrazek jest przenoszony do ImageContainer, wdrożyliśmy to z GDI+, ponieważ wygląda to znacznie łatwiej niż w naszym
AddImageClipped.
destImage = new Bitmap(destWidth, destHeight); // Tworzymy nową bitmapę w pamięci ze znakiem szerokość/wysokość
g = System.Drawing.Graphics.FromImage(destImage); // Bierzemy szkic tła z bitmapy
g.DrawImage(source, 0,0,destWidth, destHeight); // Rysujemy źródłowy obrazek na docelowej bitmapie, jest on wpasowany w jej rozmiary
data.Add(destImage); // Dodajemy obrazek do naszego folderu z obrazkami
AddImageStretched with aspect ratio.. this is intended to remain the relationship between width and height, but it does look strange with some
pictures (don't know why)
Player.cs
Zapisuje informacje na temat aktualnego gracza
Settings.cs
Zapisują się w tym ustawienia, które gracz zatwierdził. Jest to używane przez GameForm do określenia lokalizacji, której program ma używać. Wczytywanie i zapisywanie postępu w grze
public static Settings Load(string path)
{
try
{
FileStream s = new FileStream(path, FileMode.Open);
IFormatter f = new BinaryFormatter();
Settings loadedSettings = f.Deserialize(s) as Settings;
s.Close();
return loadedSettings;
}
catch (FileNotFoundException e)
{
string fault = e.GetBaseException().ToString();
return new Settings();
}
}
public bool Save(string path)
{
try
{
FileStream s = new FileStream(path, FileMode.Create);
IFormatter f = new BinaryFormatter();
f.Serialize(s, this);
s.Close();
return true;
}
catch (IOException)
{
return false;
}
}
SettingsForm.cs
Klasa w której możey dostosować swoje ustawienia. Używamy ustawień żeby pobrane obrazki dostosować do rozmiarów pól, w które będą wpisane. Wywołuje ona także klase DirectoryForm, kiedy wybierzemy opcje „Dodaj” lub „Zmień”.
DirectoryForm.cs
Klasa za pomocą której jest dodawany folder z obrazkami, w tej klasie użyliśmy standardowych funkcji C# które są dostępne w VC# 2008 takiej jak DirestoryEntry.