Werkzeugauswahl

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Werkzeugauswahl

    Hi Leute,
    Ich habe eine Frage: :headtouch:
    Wie kann ich z.b jetzt einen Bleistift auswählen und dann mit dem zeichnen. ?(
    Also ich möchte ähnlich wie bei Paint zeichnen können.
    Ich meine dass ich jetzt z.b den Stift nehme ne Farbe aussuche und dann zeichnen kann.

    Ich bedanke mich schonmal im voraus an die schnelle antwort von euch, ^^
    MFG,
    Pick of Destiny
    Der Gedanke ist die stärkste Waffe!
  • Würde ich so machen, das man auf eine surface drawt, die dann jeden step auf den screen kommt. Dann machst du am Rand Einstellungen für die Dicke der Form die du drawen willst und mit den Windows Dialogen die dabei sind kannst du die Farbe auswählen lassen.
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • sorry,
    ich bin noch eiin blutiger anfänger... :headtouch:
    was ist ein surface...??
    also ich habe schon die sprites für die werkzeuge, also farbeimer, Radiergummi, Stift, Pinsel u.s.w...
    nur die frage für mich ist halt die wie ich jetzt zeichnen oder malen kann!
    sorry dass ich net mitkommen konnte....
    Mfg,
    POD
    Der Gedanke ist die stärkste Waffe!
  • ok, du setz in das create event von einem controller obj:

    GML-Quellcode

    1. //du erstellst die surface und machst sie zb so groß wie der raum und zus. speicherst du ihre id
    2. sur=create_surface(room_width,room_height)


    jetzt ins step event:
    //du brauchst mal eine var die angibt ob du gerade zeichnen willst und dann setzt du das auf was
    //du drawen willst, also die surface sur

    GML-Quellcode

    1. if draw_mode=true
    2. {
    3. surface_set_target(sur);
    4. draw_sprite_ext(dein_sprite_den_du_drawen_willst,-1,x,y,x_width_of_brush,y_width_of_brush,image_angle=>also 0,c_white,deine_gesetzte_transparents);
    5. surface_reset_target();
    6. }

    und das in das draw event:

    Falls dir was unklar ist, frag einfach :P

    GML-Quellcode

    1. draw_surface(sur,x_position_wo_du_das_haben_willst,y_position_wo_du_das_haben_willst);
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Ja mit Surfaces bist du schon gut beraten.
    Ich habe mir früher auf diese Weise auch einen "Paint" geschrieben. Erstell dir pro Pixel, den du zeichnest eine Instanz. Prüfe, ob die x- und y-Koordinate der Maus mit der alten übereinstimmen (Leistungssparender, falls der Benutzer nur die Maustaste drückt; denn bei über 3000 ist dann schon Ende mit den 30 FPS ;)). Wenn die Koordinate nicht übereinstimmt, ziehst du eine Linie von der alten Instanz zur neuen:

    Warum?
    Der GM empfängt die Mausmessages zu lansam -> Wenn man die Maus zu schnell bewegt, dann entstehen Abstände zwischen den Pixeln!

    Wenn man jetzt die Maustaste loslässt, erstellst du dir ein Surface über das aktuelle Bild und löscht die alten Instanzen (das spart wieder Leistung).

    mfg Critical
  • Nee, das ist nicht grad schnell und "sinnvoll", hab außerdem das example fertig:

    ich weiß aber nicht ob der download funkt, muss ein bisschen probieren
    @trompadon.bplaced.net/filemanager/Little_Paint.gmk
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Trompadon schrieb:

    Nee, das ist nicht grad schnell und "sinnvoll", hab außerdem das example fertig:

    ich weiß aber nicht ob der download funkt, muss ein bisschen probieren
    @trompadon.bplaced.net/filemanager/Little_Paint.gmk
    Und warum ist das nicht sinnvoll?
    Btw. wärs nett, wenn du die GEX mal mitliefern würdest, denn nicht jeder hat diese Window-GEX. Hmm der GM hat bei mir Fehler ausgelöst, ich habe diese Color-Dialog Zeile Einfach mit dem get_color(); ersetzt.

    Edit: omg nur wegen dem Color-Dialog (der sogar über get_color(); aufzurufen ist) gleich ne ganze GEX ins Projekt laden...Edit2: omg²: Dir ist nicht zufällig aufgefallen, dass du alles, außer dem Instanzen zerstören, was später wirklich auf die Leistung geht, alles gemacht hast, was ich geschrieben habe? Vielleicht vorher mal nachdenken, oder meinen Post genauer durchlesen.
    Außerdem erzeugt dein Example bei mir Grafikfehler, die ich jetzt nicht wirklich erklären kann. Gezeichnet wird zwar, aber der Hintergrund ist total Fehlerhaft.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Critical ()

  • Äh, naja ok. Das ist dann mit der Farbauswahl ein bisschen dumm, musst du halt selbst c_red oder so hinschreiben.
    ps: windows dialoge sind in der pro enthalten, die kann ich dir nicht "schicken"
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Hier ist die andere Version, muss man aber selbst die Hexadezimal Werte eingeben *absolute schei***
    Link, wegen Unsinnigkeit gelöscht ;)


    Ps: Mit shift kann man gerade Linien machen!

    @Critical: Ich hab echt keine Ahung was du meinst, und für jeden Pixel eine Instanz ist, naja ok. 1. Nachteil der nicht die performance und die flexiblität des erstellten sprites verändert: Du kannst nicht mehrmals über einen Punkt zeichnen, du kannst nicht radieren und vieles mehr.
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Trompadon ()

  • Dir ist aber Bewusst, dass dem Computer irgendwann der Speicher ausgeht oder? Du solltest viellecht im Game Quit Event noch

    GML-Quellcode

    1. surface_free(sur);
    schreiben, sonst kommt der GM irgendwann mit "Try to draw a non existing surface". Dieser Fehler kommt, wenn man das "Spiel"

    Btw. der Fehler:

    Edit: Wann habe ich gesagt, dass ich einen alten Computer habe?^^
    Speicher? Die hat 512 MB.
    Das liegt sicher nicht an meinem PC sonst hätte Half Life 2 auch schon längst solche Fehler angezeigt^^

    Edit, die 2.: Ich weiß nicht, ob das eine Behauptung war, aber du hast irgendwo geschrieben, dass du an alte PC's denken solltest. Ja ich hab ja auch 2 Posts oben geschrieben, dass du lieber get_color(); verwenden sollst, bist aber sicher selbst draufgekommen und hast meinen Post nich gelesen ;D
    Ich hab auch geschrieben, wann der Fehler kommt und außerdem enstehen dadurch Memoryleaks und die sind auf manchen Systemen erst nach einem Neustart behoben, d.h. wenn man das Programm beendet, dann muss dieser nicht unbedingt behoben sein. Außerdem, wenn ich weiß, dass ich einen Fehler mache und ihn nicht absichtlich behebe, weil es ja "egal" ist, dann weiß ich auch nicht^^

    Fazit: Am Ende hast du nur das in deinem Example realisiert, was ich oben als Vorschlag geliefert habe und den Post als sinnlos bezeichnet. ^^

    mfg Critical
    Bilder
    • fehler.JPG

      104,49 kB, 646×512, 128 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Critical ()

  • Jo, aber das hat auch nur ein paar minuten gedauert (ich vergess immer an ältere Computer zu denken, das sollte ich mir langsam mal merken :headtouch:Wand"> )

    @Critical das ist mir noch nie passiert, wie viel Grafik speicher hat deine Karte eigentlich?

    Edit: Hab gerade herausgefunden, dass es get_color auch so ohne windows dialoge gibt, beim ersten Link geändert.

    @ Critical die 2.: Wann hab ich das behauptet :P , hmm meine hat zwar doppelt so viel, aber daran liegt es sicher nicht, vielleicht bau ich ja surface_free(sur) noch ein.

    Das ist aber unötig, da ich nur eine surface habe, und auch nicht mehr erstellte werden, es gibt nur diese eine?!
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Trompadon ()

  • Der Fehler kommt häufig vor, wenn man das Surface vor dem Erstellen nicht mittels draw_clear() löscht.
    Da kann schonmal jeglicher Grafikmüll zum Vorschein kommen.

    Nebenbei bemerkt ist das Beispiel auch ein ziemlich schlechtes.
    Wenn man etwas schneller mit der Maus ist, entstehen ziemlich größe Lücken.
    Das sollte nach Möglichkeit eher nicht vorkommen.
  • sollte eigentlich nicht, kann eigentlich nicht ?(
    das kommt nur wenn man die width erhöht, und das ist mir absolut klar.
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Ich hab nichts verändert, nur gestartet und gezeichnet.
    Und die Lücken sind normal, wenn man das ganze logisch betrachtet.
    Ich hab selbst irgendwo noch ein Paint Programm rumfliegen, da hatte ich am Anfang auch Lücken beim zeichnen.
    Ich weiß nur nicht mehr wie ichs behoben hab, ich mein da war irgendwas mit ner while-Schleife und den lengthdir Befehlen.

    EDIT:
    Okay das mit den lengthdir Befehlen und der while Schleife ist nur beim Zeichnen mit nem Kreis als Stiftform notwendig. (hatte das nich mehr so im Kopf :P)
    Bei dem Zeichnen mit ner Linie ist aber ne andere Methode effektiver als das was du machst.

    Das Step-Event könnte folgendermaßen aussehen:

    GML-Quellcode

    1. x=mouse_x
    2. y=mouse_y
    3. if mouse_check_button(mb_left)==true&&keyboard_check(vk_shift)!=true {draw_mode=true} else {draw_mode=false}
    4. if draw_mode=true
    5. {
    6. surface_set_target(sur);
    7. draw_set_color(obj_button_color.color)
    8. draw_line_width(xprevious,yprevious,x,y,obj_button_width.width)
    9. surface_reset_target();
    10. }
    11. usw...
    Alles anzeigen


    Deine mouse_x_previous und mouse_y_previous Berechnung scheint n Tick zu langsam zu sein.
    Das behebt den Fehler mit den Lücken ;) ...der taucht bei mir nämlich auch auf, wenn er nicht "noch kurz lädt".

    EDIT²:
    Sorry Trompadon, da müsstest du Critical selbst fragen ^^

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Marv1 ()

  • Da das Programm recht simple, bis fünfminutig ist, zeichnet es immer vom letzt registrierten punkt zur aktuellen position, womit sich nur die genauigkeit der kurven ändert => es wird alles gerade. Das was du angesprochen hast passiert bei mir komischer weise nur ganz am anfang wenn er noch kurz lädt...

    @critical: ich hab das ganze ganz anders gelöst oder hab ich irgendwas falsch verstanden. ich benutze nur die draw_line funktion, sonst eigentlich nichts??
    @marv1: Danke, sieht schon mal gut aus. Und könntest du mir bitte erklären was critical da meint?
    also entweder ich hab nen gehirnknaks oder so, oder criticals sätze beginnen mit einem anderen sinn als sie aufhören :D
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Trompadon ()