im spiel zeichnen?

  • GM 8

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

  • im spiel zeichnen?

    Hey leutz! :)



    Ich bräuchte hilfe bei einem Thema. Kann mir jemand erklären wie ich es mache das man direkt im Spiel etwas zeichnen könnt? und dann auf diesem auch laufen? also es als objekt zu nutzen? :huh:

    Und könnte man dann auch gleich seinen "Charakter" zeichnen? :huh:

    Ich würde mich freuen wenn ihr es mir schritt für schritt erklären würdet! :S



    Wäre nett wenn ihr helfen würdet. :thumbsup:
    Hier war BlackCat^^
  • Hey

    Also es gibt erstmal viele GML Zeichenbefehle die alle in das Draw-Event müssen.
    Damit kannst du Rechtecke,Linien ,Kreise usw. zeichnen...

    [hide=Auszug aus der Hilfe zum Thema Drawing shapes]


    There is a whole collection of functions available to draw different shapes. Also there are functions to draw text (see next section). You can only use these in the drawing event of an object; these functions in general don't make any sense anywhere else in code. Realize that collisions between instances are determined by their sprites (or masks) and not by what you actually draw. The following drawing functions exist that can be used to draw basic shapes.

    draw_clear(col) Clears the entire room in the given color (no alpha blending).

    draw_clear_alpha(col,alpha) Clears the entire room in the given color and alpha value (in particular useful for surfaces).

    draw_point(x,y) Draws a point at (x,y) in the current color.

    draw_line(x1,y1,x2,y2) Draws a line from (x1,y1) to (x2,y2).

    draw_line_width(x1,y1,x2,y2,w) Draws a line from (x1,y1) to (x2,y2) with width w.

    draw_rectangle(x1,y1,x2,y2,outline) Draws a rectangle. outline indicates whether only the outline must be drawn (true) or it should be filled (false).

    draw_roundrect(x1,y1,x2,y2,outline) Draws a rounded rectangle. outline indicates whether only the outline must be drawn (true) or it should be filled (false).

    draw_triangle(x1,y1,x2,y2,x3,y3,outline) Draws a triangle. outline indicates whether only the outline must be drawn (true) or it should be filled (false).

    draw_circle(x,y,r,outline) Draws a circle at (x,y) with radius r. outline indicates whether only the outline must be drawn (true) or it should be filled (false).

    draw_ellipse(x1,y1,x2,y2,outline) Draws an ellipse. outline indicates whether only the outline must be drawn (true) or it should be filled (false).

    draw_set_circle_precision(precision) Sets the precision with which circles are drawn, that is, the number of segments they consist of. The precision must lie between 4 and 64 and must be dividable by 4. This is also used for drawing ellipses and rounded rectangles.

    draw_arrow(x1,y1,x2,y2,size) Draws an arrow from (x1,y1) to (x2,y2). size indicates the size of the arrow in pixels.

    draw_button(x1,y1,x2,y2,up) Draws a button, up indicates whether up (1) or down (0).

    draw_path(path,x,y,absolute) With this function you can draw the indicated path in the room with its start at position (x,y). If absolute is true the path is drawn at the position where it was defined and the values of x and y are ignored.

    draw_healthbar(x1,y1,x2,y2,amount,backcol,mincol,maxcol,direction,showback,showborder) With this function you can draw a healthbar (or any other bar that indicates some value, like e.g. the damage). The arguments x1, y1, x2 and y2 indicate the total area for the bar. amount indicates the percentage of the bar that must be filled (must lie between 0 and 100). backcol is the color of the background for the bar. mincol and maxcol indicate the color when the amount is 0 and 100 respectively. For an amount in between the color is interpolated. So you can easily make a bar that goes e.g. from green to red. The direction is the direction in which the bar is drawn. 0 indicates that the bar is anchored at the left, 1 at the right, 2 at the top and 3 at the bottom. Finally showback indicates whether a background box must be shown and showborder indicated whether the box and bar should have a black border line.

    Most of the above functions use the color and alpha setting that can be changed with following functions.

    draw_set_color(col) Sets the drawing color to be used from now on for drawing primitives.

    draw_set_alpha(alpha) Sets the alpha transparency value to be used from now on for drawing primitives. Should lie in the range 0-1. 0 is fully transparent, 1 is fully opaque.

    draw_get_color() Returns the drawing color used for drawing primitives.

    draw_get_alpha() Returns the alpha value used for drawing primitives.

    A whole range of predefined colors is available:

    c_aqua

    c_black

    c_blue

    c_dkgray

    c_fuchsia

    c_gray

    c_green

    c_lime

    c_ltgray

    c_maroon

    c_navy

    c_olive

    c_orange

    c_purple

    c_red

    c_silver

    c_teal

    c_white

    c_yellow

    The following functions can help you to create the colors you want.

    make_color_rgb(red,green,blue) Returns a color with the indicated red, green, and blue components, where red, green and blue must be values between 0 and 255.

    make_color_hsv(hue,saturation,value) Returns a color with the indicated hue, saturation and value components (each between 0 and 255).

    color_get_red(col) Returns the red component of the color.

    color_get_green(col) Returns the green component of the color.

    color_get_blue(col) Returns the blue component of the color.

    color_get_hue(col) Returns the hue component of the color.

    color_get_saturation(col) Returns the saturation component of the color.

    color_get_value(col) Returns the value component of the color.

    merge_color(col1,col2,amount) Returns a merged color of col1 and col2. The merging is determined by amount. A value of 0 corresponds to col1, a value of 1 to col2, and values in between to merged values.

    The following miscellaneous functions exist.

    draw_getpixel(x,y) Returns the color of the pixel corresponding to position (x,y) in the room. This is not very fast, so use with care.

    screen_save(fname) Saves a png image of the screen in the given filename. Useful for making screenshots.

    screen_save_part(fname,x,y,w,h) Saves part of the screen in the given png filename.


    [/hide]

    Bewegungen usw. ist alles damit realisierbar jedoch ziemlich umständlich.

    Wenn du jedoch einfach Freihand zeichnen möchtest brauchst du Surfaces. Mehr dazu findest du auch in der Hilfe.
    Du kannst das gezeichnete auch einfach abspeichern > Hilfe :D


    MfG xxskxx
    -
  • Die Events, also alle mit leichgelben Hintergrund sind Draw-Events, also Events mit denen du alles mögliche zeichnen kannst.

    Draw Events

    Im Spiel direkt kannst du nicht zeichnen, das wäre dann nur mit einem eigenem Level- oder Zeicheneditor möglich ;)
    Viel Spass beim Ausprobieren!
  • Es gibt ein paar möglichkeiten. Entweder zeichnest du mit den obigen Funktionen in einem Draw event deinen Charakter jeden step neu.

    Oder man zeichnet alles auf eine Surface in etwa so:

    surf = surface_create(Breite,Länge)
    surface_set_target(surf)


    Hier zeichnen, ganz normal von 0 ausgehend. Also 0,0 ist die Ecke oben links


    surface_reset_target();

    global.new_sprite = sprite_create_from_surface(surf,0,0,Breite,Länge,0,0,0,0) // die Werte kannst du verändern.


    Wenn du ein weiteres Bild zu einer sprite hinzufügen möchtest kannst du das selbe nochmal machen und dann sprite_add_from_surface statt dem obigen einsetzen und die Argumente anpassen.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • kapier nicht

    Okay also ihr habt es mir schon etwas eklärt. Naja Freuihand zeichnen ist ja das schönste aber ich habe hier i-wo gelesen das Surfaces ja schwer für Comnputer seien. Kann man dieses Freihand zeichnen auch anders machen, nicht mit Surfaces?

    weil ich kapiers immer noch nicht richtig was ich wohin einfügen soll! also bei welchem objekt und so?!







    lg 8)
    Hier war BlackCat^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bl@ckCat ()

  • Kommt darauf an was du machen willst.
    Warum willst du das überhaput ingame machen? es ist eindeutig umständlicher als es im Editor zu zeichnen und auch langsamer da man ja sozusagen für jede Line, jeden Pixel, jeden Kreis eine Zeile code braucht.

    Du solltest dass nur machen wenn du unbedingt etwas im Spiel brauchst was du nicht schon vor dem Spiel weist.

    Und du musst wissen wozu du es brauchst.
    Wenn es ein Sprite werden soll dann benutz den Code da oben in irgend einem Objekt (ein Controler objekt).
    Anschließend kannst du dann woimmer du willst diesen Sprite verwenden bzw. zeichnen.
    Die ID des Sprites ist ja dann in der variable global.new_sprite enthalten.

    Somit zeichnest du mit draw_sprite(global.new_sprite,0,x,y); die Sprite.
    Vergiss nicht wenn du die Surface nicht mehr brauchst 8also nachdem du das Sprite gemacht hast) surface_free(surf) zu machen.
    Das entlastet den Speicher.


    "Schwer für den Computer" sind Surfaces nicht wirklich. Sie sind viel "leichter" als wenn du jeden Step die ganzen Sachen drawst.

    Leider haben ein paar wenige Grafikkarten probleme mit surfaces. Ist aber eher selten.


    Wenn du das Bild das du ingame zeichnen willst oft ändern willst,
    wäre es besser direkt die Surface zu benutzen und keine Sprite zu zeichnen.

    Du kannst die Surface einfach per draw_surface zeichnen.
    Nachteil ist aber dass Surfaces keine Kollisionen oder so benutzen können, nur sprites können das.



    Upps, hab was wichtiges vergessen:
    als erste Zeile nach dem surface_set_target(surf) muss unbedingt diese zeile rein: draw_clear_alpha(c_white,0);
    Dies macht den Hintergrund des Surface sozusagen transparent bzw unsichtbar.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • wozu ich es brauche :



    z.b. nehmen wir an ein strich mänchen geht und bleibt beim abgrund stehen. man zeichnet mit der maus eine Linie ein und er geht weiter.



    dazu brauch ichs^^

    wie kann ich das machen !? auch immer noch mit surfaces? :S
    Hier war BlackCat^^
  • Hm, das ist schwiriger.

    Wenn es Freihand sein soll. dann ist es vergleichseise schwer. (will dich nicht entmutigen xD)
    Du brauchst erstmal eine Physik engine die es ermöglicht auf einem unebenen Sprite zu laufen.
    Dann kannst du per surfaces sprites machen die die Zeichnung beinhalten.

    Dann erstellst du ein Objekt und gibst ihm dieses Sprite und plazierst es richtig.
    Das Objekt sollte als parent ein Objekt haben mit dem der Player kollidiert.



    Vieleicht sollte das mal jemand erklären der mehr Erfahrung in Platformer hat als ich xD

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()

  • DragonGamer schrieb:

    Du brauchst erstmal eine Physik engine die es ermöglicht auf einem unebenen Sprite zu laufen.
    Dann kannst du per surfaces sprites machen die die Zeichnung beinhalten.

    Dann erstellst du ein Objekt und gibst ihm dieses Sprite und plazierst es richtig.
    Das Objekt sollte als parent ein Objekt haben mit dem der Player kollidiert.




    8| okaaay?! also ich bin n anfänger was GML angeht. Was ist ein Physik engine? (ich hoffe du meinst nicht das Fach -.-) auf einem unebenen sprite zu laufen?

    dann das mit dem Objekt erstellen. das Objekt auf dem er laufen soll soll ja der der das spiel spielt zeichnen.



    ?! 8|
    Hier war BlackCat^^
  • naja du willst ja das der Spieler auch auf diesem gezeichneten laufen kann.
    D.h. es reicht nicht es nur zu zeichnen sondern musst es hinkriegen dass der Spieler nicht einfach durchgeht.
    Der GM hat ein eingebautes Killisionssystem.
    Allerdings ist es leider viel zu unanpassungs fähig.
    Man kann es nur durch Objekte benutzen.
    Das mit Physik-engine hat nicht so direkt was mit dem Physik-Fach zutun aber sehr sehr viel mit programmieren.
    Physik heißt einfach das der pieler bzw das Objekt nicht einfach durch das Objekt fällt.
    das würde ja gehen indem man ins Kollisions-event die Bewegung stoppt.
    Aber do willst ja wohl dass der Spieler drüberläuft und nicht an jeder Unebenheit hängen bleibt.
    Dasshier ist ein Code mit dem sowas gehen müsste:
    Man kann damit eine steigung von STEIGUNG pixel überwinden und SPD ist die Geschwindigkeit:

    Ist jetzt aber ziemlich einfach gehalten:


    GML-Quellcode

    1. var ys;
    2. ys = y;
    3. if keyboard_check(vk_right)
    4. {
    5. x += SPD
    6. if !place_free(x+SPD,y)
    7. {
    8. do
    9. y -= 1;
    10. until(!place_free(x,y) or ys-y>STEIGUNG);
    11. if !place_free(x,y)
    12. {
    13. x -= SPD;
    14. move_contact_solid(0,SPD);
    15. }
    16. }
    17. }
    18. ys = y
    19. if keyboard_check(vk_left)
    20. {
    21. x -= SPD
    22. if !place_free(x+SPD,y)
    23. {
    24. do
    25. y -= 1;
    26. until(!place_free(x,y) or ys-y>STEIGUNG);
    27. if !place_free(x,y)
    28. {
    29. x += SPD;
    30. move_contact_solid(180,SPD);
    31. }
    32. }
    33. }
    Alles anzeigen




    EDIT: hab den Code mal überarbeitet. jetzts ollte er einleuchtender sein.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()

  • Ich nehme an dass sich der spieler nicht bewegen kann während er zeichnet, oder? und er kann auch nur im aktiven View also im sichtbaren bereich zeichnen.

    Dann müsste sowas ins step event:
    Hab jetzt aber leider keine zeit zum Testen.


    GML-Quellcode

    1. if mouse_check_button_pressed(mb_left)
    2. {
    3. surf = surface_create(view_wview[0],view_hview[0])
    4. surface_set_target(surf);
    5. draw_clear_alpha(c_white,0);
    6. lxx = mouse_x;
    7. lyy = mouse_y;
    8. rxx = mouse_x;
    9. ryy = mouse_y;
    10. }
    11. if mouse_check_button(mb_left)
    12. {
    13. surface_set_target(surf)
    14. draw_circle_color(mouse_x-view_xview[0],mouse_y-view_yview[0],3,c_red,c_red,0)
    15. if mouse_x-view_xview[0] < lxx lxx = mouse_x-view_xview[0];
    16. if mouse_x-view_xview[0] > rxx rxx = mouse_x-view_xview[0];
    17. if mouse_y-view_yview[0] < lyy lyy = mouse_y-view_yview[0];
    18. if mouse_y-view_yview[0] > ryy ryy = mouse_y-view_yview[0];
    19. surface_reset_target()
    20. }
    21. if mouse_check_button_released(mb_left)
    22. {
    23. global.new_sprite[10000 + global.new_sprites_num] = sprite_create_from_surface(surf,min(lxx,rxx),min(lyy,ryy),max(rxx,lxx)-min(rxx,lxx),max(ryy,lyy)-min(ryy,lyy),1,0,0,0)
    24. with(instance_create(view_xview[0]+min(lxx,rxx),view_yview[0]+min(lyy,ryy),obj_ground))
    25. sprite_index = global.new_sprite[10000 + global.new_sprites_num]
    26. global.new_sprites_num += 1;
    27. surface_free(surf);
    28. }
    Alles anzeigen


    So, hoffe s funktioniert.
    obj_ground braucht keine Events.
    Sollte aber solid sein,
    damit mein vorheriger Code geht.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()

  • Du minst doch nicht etwa den raum mit 1-Pixel großen Objekten füllen?
    Das heißt mindestens 800*600 = 480 000 Objekte.
    das schaft der GM nicht mal wenn sie komplett ohne Events wären.


    Ja das muss beim Spieler rein.
    hab den Code getestet und komplett umgändert.
    Jetzt sollte er auch funktionieren.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Ohne die vorherigen Posts gross durchgelesen zu haben, fällt mir ein (nicht sonderlich origineller oder spezieller) Lösungsweg für das Zeichnen von Linien und darauf herumgehen ein.

    Wenn Maustaste gedrückt => Instanz an dieser Position erzeugen. Diese Instanz ist ein Objekt, das die Grösse und Form des gewünschten zu zeichnenden Striches darstellt.
    Diese Instanz wird in jedem Step kreiert, solange die Maustaste gedrückt wird und nicht schon bereits ein Objekt an dieser Position existiert. Somit sieht es aus, als würde man etwas zeichnen.

    Die dicht aneinandergereihten Objekte ergeben den Strich. Jedes dieser Objekte (bzw. Instanzen) reagieren auf die Spielerfigur. In diesem Falle "darauf laufen".

    Das muss einfach noch in einen simplen Code umgesetzt werden und fertig. So würde ich das jedenfalls auf die Schnelle machen.

    Lg

    Michael :D
  • Michaelp800 schrieb:

    Wenn Maustaste gedrückt => Instanz an dieser Position erzeugen. Diese Instanz ist ein Objekt, das die Grösse und Form des gewünschten zu zeichnenden Striches darstellt.
    Diese Instanz wird in jedem Step kreiert, solange die Maustaste gedrückt wird und nicht schon bereits ein Objekt an dieser Position existiert. Somit sieht es aus, als würde man etwas zeichnen.

    Die dicht aneinandergereihten Objekte ergeben den Strich. Jedes dieser Objekte (bzw. Instanzen) reagieren auf die Spielerfigur. In diesem Falle "darauf laufen".
    Müsste man sehen wie es dann mit der Rechenleistung aussieht hab das noch nicht probiert. Man könnte aber einige Sachen hinzufügen zb:
    Wenn 15 "1 Punkt Objekte" genau gerade nebeneinander liegen, werden diese entfernt und es wird 1 Instanz erstellt die so breit ist wie 15 einzelne kleine Instanzen.

    Edit: Hab mal ein kleines Example hochgeladen wie das gehen könnte mit "Linien" zeichnen.
    Dateien
    • exp.rar

      (61,78 kB, 170 mal heruntergeladen, zuletzt: )

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