Autor Beitrag
DarkPrisma
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 02.05.10 01:17 
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
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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.