Ich würde gerne in einem Tutorial zeigen wie man auf einem Spiel die Mapbewegen kann, sobald sich der Spieler dem Rand des Formes nährt.
Zu Beginn nenne ich mal die Klassen die in euerem Projekt vorhanden Sein Sollten
[ul]
[li]Game
[/li][li]Sprite
[/li][li]World
[/li][li]Render
[/li][li]Moving
[/li][/ul]
World Klasse
In dieser Klasse legen wir die Eigenschaften Unserer Map fest. Unter anderem die Größe, den Offset Wert und auch die Textur. In dieser Klasse finden sich nur eigenschaften. Folgende eigenschaften sind Erforederlich. Der Offset wert Verschieb die Textur anhand des Wertes.
[CSHARP]
class World
{
public Bitmap map { get; set; }
public int OffsetX { get; set; }
public int OffsetY { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}
[/CSHARP]
Sprite Klasse
Die Sprite Klasse Beinhaltet alle Eigenschaften zu unserem Spieler. In dieser Klasse finden Sich auch nun wieder nur Eigenschaften. Es werden hier die Eigenschaften NowX und NowY (Diese Eigenschaften sind im Späteren Spielverlauf für Quests z.b. Wichtig. Sie Erhöhen sich beim Bewegen in der Moving Klasse, in diesem Tutorial werden diese erstmal nicht benötigt), PosX und PosY ( Anhand dieser Werte werden wir die Figur (Spieler) auf Unsere Form Zeichnen), SpriteNorth, SpriteSouth, SpriteWest und SpriteEast (Dies Sind die Bilder des Spielers ich habe dafür die 4 Eigenschaften festgelegt das man wenn man nach norden Läuft ein Bild der Figur hat die nach norden läuft. etc) und Width und Height ist die Größe der Textur.
[CSHARP]
public class Sprite
{
public String SpriteName { get; set; }
public int PosX { get; set; }
public int PosY { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public int NowX { get; set; }
public int NowY { get; set; }
public Bitmap SpriteNorth { get; set; }
public Bitmap SpriteSouth { get; set; }
public Bitmap SpriteWest { get; set; }
public Bitmap SpriteEast { get; set; }
}
[/CSHARP]
Klasse Game
Diese Klasse ist ein Form auf der wir das Spiel Ausgeben. hier finden wir folgenden Code. Wichtig wir Brauchen einen Timer !
[CSHARP]
// Lokale Variabeln
Public static Sprite sprite;
Public static World map;
private void GamePanel_Load(object sender, EventArgs e)
{
this.DoubleBuffered = true;
sprite = new Sprite();
setSprite(sprite);
map = new World();
setMap(map);
timer1.Start();
}
[/CSHARP]
Hier wird das Spiel Initialisiert
[CSHARP]
private void setSprite(Sprite s)
{
// Hier Ihre Eigenschaften
}
private void setMap(World map)
{
// Hier Ihre Eigenschaften
}
[/CSHARP]
Hier werden die Eigenschaften der Klassen Definiert.
[CSHARP]
private void GamePanel_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Up) Moving.moveUp(sprite);
if (e.KeyData == Keys.Down) Moving.moveDown(sprite);
if (e.KeyData == Keys.Left) Moving.moveLeft(sprite);
if (e.KeyData == Keys.Right) Moving.moveRight(sprite);
}
[/CSHARP]
Dies ist unsere Bewegungs Steuerung, die Klasse Moving wird im Späteren erläutert.
[CSHARP]
private void GamePanel_Paint(object sender, PaintEventArgs e)
{
render.moveMap(e);
render.dorender(e);
}
[/CSHARP]
Hier die Zeichen Methode des Formes, die Klasse render wird im Späteren erläutert.
[CSHARP]
private void timer1_Tick(object sender, EventArgs e)
{
this.Invalidate();
}
[/CSHARP]
Hier wird die Welt automatisch neu Gezeichnet. Invalidate() ruft die Methode Paint auf und es wird neu Gezeichnet.
Klasse Moving
Diese Klasse ist unsere Bewegungs Steuerung. Hier wird nichts Anderes gemacht als die Koordianten Berechnet. Es giebt nur 4 Methoden.
[CSHARP]
class Moving
{
public static void moveUp(Sprite Sprite)
{
Sprite.PosY -= 5; // Y-Achsen Position um 5 Veringern
Sprite.NowY -= 5; // NowY um 5 Veringern
Declaration.Walk = Declaration.WalkWorldMap.North; // Deklarieren das sich nach Norden Bewegt wird
GamePanel.ActiveForm.Invalidate();
GamePanel.ActiveForm.Text = Sprite.NowY + "," + Sprite.NowX + ";" + GamePanel.ActiveForm.Width + "," + GamePanel.ActiveForm.Height;
}
public static void moveDown(Sprite Sprite)
{
Sprite.PosY += 5; // Y-Achse Um 5 erhöhen
Sprite.NowY += 5; // NowY um 5 erhöhen
Declaration.Walk = Declaration.WalkWorldMap.South; // Nach Unten laufen
GamePanel.ActiveForm.Invalidate();
GamePanel.ActiveForm.Text = Sprite.NowY + "," + Sprite.NowX + ";" + GamePanel.ActiveForm.Width + "," + GamePanel.ActiveForm.Height;
}
public static void moveLeft(Sprite Sprite)
{
Sprite.PosX -= 5; // X-Achse um 5 veringern
Sprite.NowX -= 5; // NowX um 5 veringern
Declaration.Walk = Declaration.WalkWorldMap.West; // Nach Links Laufen
GamePanel.ActiveForm.Invalidate();
GamePanel.ActiveForm.Text = Sprite.NowY + "," + Sprite.NowX + ";" + GamePanel.ActiveForm.Width + "," + GamePanel.ActiveForm.Height;
}
public static void moveRight(Sprite Sprite)
{
Sprite.PosX += 5; // X-Achse um 5 erhöhen
Sprite.NowX += 5; // NowX um 5 erhöhen
Declaration.Walk = Declaration.WalkWorldMap.East; // Nach Rechts Laufen
GamePanel.ActiveForm.Invalidate();
GamePanel.ActiveForm.Text = Sprite.NowY + "," + Sprite.NowX + ";" + GamePanel.ActiveForm.Width + "," + GamePanel.ActiveForm.Height;
}
}
[/CSHARP]
Klasse Render
In dieser Klasse wird nur Gezeichnet !
[CSHARP]
public class render
{
/*
* Hier wird die Map Gezeichnet
* und in dem Puffer Gespeichert
*/
public static void drawmap()
{
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(Game.map.map()); // Neues Graphics Element Hinzufügen
g.DrawImage(Game.map.map, Game.map.LocationX, Game.map.LocationY, Game.map.Width, Game.map.Height); // Textur wird Gezeichnet
}
/*
* Hier wird die Welt auf das Form
* Gezeichnet.
*/
public static void moveMap(System.Windows.Forms.PaintEventArgs e)
{
CheckPosition(Game.sprite());
int WorldOffsetX = -Game.map.map.OffsetX;
int WorldOffsetY = -Game.map.map.OffsetY;
e.Graphics.DrawImage(Declaration.map.map,WorldOffsetX,WorldOffsetY,Declaration.map.Width,Declaration.map.Height);
}
/*
* Hier wird der Spieler auf die Welt
* Gezeichnet
*/
public static void dorender(System.Windows.Forms.PaintEventArgs e)
{
Sprite item = Game.sprite();
if (Declaration.Walk == Declaration.WalkWorldMap.North) e.Graphics.DrawImage(item.SpriteNorth, item.PosX, item.PosY, item.Width, item.Height); // Wenn Laufrichtung Norden = NordSprite
if (Declaration.Walk == Declaration.WalkWorldMap.South) e.Graphics.DrawImage(item.SpriteSouth, item.PosX, item.PosY, item.Width, item.Height); // Wenn Laufrichtung Süden = SouthSprite
if (Declaration.Walk == Declaration.WalkWorldMap.West) e.Graphics.DrawImage(item.SpriteWest, item.PosX, item.PosY, item.Width, item.Height); // Wenn Laufrichtung West = WestSprite
if (Declaration.Walk == Declaration.WalkWorldMap.East) e.Graphics.DrawImage(item.SpriteEast, item.PosX, item.PosY, item.Width, item.Height); // Wenn Laufrichtung Osten = East Sprite
}
}
// Wichtig mit dieser Methode wird die Map Bewegt
public static void CheckPosition(Sprite Sprite)
{
if (Sprite.PosY <= 50)
{
Declaration.map.OffsetY -= 50;
Sprite.PosY += 55;
Sprite.NowY += 5;
}
if (Sprite.PosY >= GamePanel.ActiveForm.Height - 100)
{
Declaration.map.OffsetY += 50;
Sprite.PosY -= 55;
Sprite.NowY -= 5;
}
if (Sprite.PosX <= 50)
{
Declaration.map.OffsetX -= 50;
Sprite.PosX += 55;
Sprite.NowX += 5;
}
if (Sprite.PosX >= GamePanel.ActiveForm.Width - 100)
{
Declaration.map.OffsetX += 50;
Sprite.PosX -= 55;
Sprite.NowX -= 5;
}
}
}
[/CSHARP]