Entwickler-Ecke

Multimedia / Grafik - textur mit der maus zeichnen, probleme


DarkPrisma - So 02.05.10 01:17
Titel: textur mit der maus zeichnen, probleme
huhu ihrs,
vllt könnt ihr mir ja helfen. ich suche schon seid monaten eine lösung für mein problem.

ich bin momentan an einem einfachen 2d karteneditor dran. dazu möchte ich mit der maus texturen zeichnen können.
vor einiger zeit hatte ich ein script irgendwo mal gefunden, leider weiß ich nicht mehr wo das war :(

das funktioniert relativ gut. egal wie schnell ich die maus bewege, die textur wird gezeichnet, ohne lücken.
jetzt habe ich aber noch 2 probleme:

1. wenn man langsam zeichnet, zeichnet der plötzlich ein feld mehr als man eigentlich zeichnen wollte.

2. wenn man nah am rand zeichnet, kann es passieren, dass er plötzlich in einer anderen reihe ein feld zeichnet
---- ----
-

oder
|
|
|

ich hab das projekt mal hier angehangen, vllt könnt ihr mir ja helfen:
Moderiert von user profile iconKha: Beitrag angehängt


Kha - So 02.05.10 10:35

:welcome:

Der Fehler scheint im else-Teil von Drawer.DrawLine zu liegen. Da du ja aber sowieso nie Linien, sondern nur einzelne Pixel zeichnen musst, streiche aus dieser Methode einfach alles außer

C#-Quelltext
1:
2:
3:
                int PosiX = ((int)Math.Floor(Math.Floor((double)(((double)p.Value.X) / sizeVal)))) * sizeVal;
                int PosiY = ((int)Math.Floor(Math.Floor((double)(((double)p.Value.Y) / sizeVal)))) * sizeVal;
                this.g.DrawImage(this.texture, PosiX, PosiY, this.sz.Width, this.sz.Height);

Scheint dann zu funktionieren :) .

PS: Dateien kannst du auch direkt bei uns im Forum hochladen, ich habe es einmal für dich angehängt.


DarkPrisma - So 02.05.10 11:17

hallo,

das problem daran ist dann aber nur leider, dass er lücken beim zeichnen hinterlässt.
diese "do while" schleife sollte da ja verhindern :( es ist zum haare raufen.


Kha - So 02.05.10 12:39

Gut, wenn man die Maus wirklich schnell bewegt, können Lücken entstehen.

Der Original-Code war mir etwas zu merkwürdig zum Verstehen, also habe ich ihn lieber ganz ersetzt.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  private void DrawLine(Point? p)
  {
    if (p.HasValue)
    {
      var p1 = this.p1 ?? p.Value;
      var start = new Point(p1.X / sizeVal, p1.Y / sizeVal);
      var stop = new Point(p.Value.X / sizeVal, p.Value.Y / sizeVal);

      Size delta = new Size(stop) - new Size(start);
      int steps = (int)Math.Max(Math.Abs(delta.Width), Math.Abs(delta.Height));

      for (int step = 0; step <= steps; step++) {
        Point point = step == 0 ? start : start + new Size(delta.Width * step / steps, delta.Height * step / steps);
        g.DrawImage(this.texture, point.X * sizeVal, point.Y * sizeVal, sizeVal, sizeVal);
      }
    }
    this.p1 = p;
  }

(Drawer.p1 noch als Point? deklarieren)
Das ist quasi ein einfacher Bresenham-Algorithmus, Punkte können also auch nur diagonal zusammenhängen.


DarkPrisma - So 02.05.10 13:39

oh man, das ist geil :D die ganze nacht hab ich rumgesucht und nix gefunden...
hätte ich mal gewartet, das funktioniert super!

ich danke dir, damit geht ein jahrelanger traum in erfüllung.