Sprites/Backgrounds zerren

  • GM 8
  • Sprites/Backgrounds zerren

    Hi alle,

    ich versuch gerade selbst eine einfache kleine 3d-engine zu schreiben(nur als Übung). Mit Fluchtpunkten und so.
    Jetzt mein Problenm: wie kann man sprites/backgrounds zerren?
    Bis jetzt hab ich es so gelöst:

    GML-Quellcode

    1. var tex,flpx,flpy,entf,xx,yy;
    2. tex = background_get_texture(argument0)
    3. flpx = 320
    4. flpy = 240
    5. entf = max(argument1,0.1)
    6. draw_set_color(c_white)
    7. draw_primitive_begin_texture(pr_trianglestrip,tex)
    8. xx = flpx+lengthdir_x(point_distance(flpx,flpy,640,0)/(entf+5),point_direction(flpx,flpy,640,0))
    9. yy = flpy+lengthdir_y(point_distance(flpx,flpy,640,0)/(entf+5),point_direction(flpx,flpy,640,0))
    10. draw_vertex_texture(xx,yy,0,0)
    11. xx = flpx+lengthdir_x(point_distance(flpx,flpy,640,0)/entf,point_direction(flpx,flpy,640,0))
    12. yy = flpy+lengthdir_y(point_distance(flpx,flpy,640,0)/entf,point_direction(flpx,flpy,640,0))
    13. draw_vertex_texture(xx,yy,0,1)
    14. xx = flpx+lengthdir_x(point_distance(flpx,flpy,640,480)/(entf+5),point_direction(flpx,flpy,640,480))
    15. yy = flpy+lengthdir_y(point_distance(flpx,flpy,640,480)/(entf+5),point_direction(flpx,flpy,640,480))
    16. draw_vertex_texture(xx,yy,1,0)
    17. xx = flpx+lengthdir_x(point_distance(flpx,flpy,640,480)/entf,point_direction(flpx,flpy,640,480))
    18. yy = flpy+lengthdir_y(point_distance(flpx,flpy,640,480)/entf,point_direction(flpx,flpy,640,480))
    19. draw_vertex_texture(xx,yy,1,1)
    20. draw_primitive_end()
    Alles anzeigen


    aber das zerrt nicht richtig.

    Hilfe und Forensuche hab ich schon probiert aber nichts gefunden(villeicht bin ich auch nur zu blöd).

    mfg Alron
  • Vielleicht solltest du mal besser sagen, wie du es dir vorgestellt hast. Soll die Textur an bestimmten Punkten verzerrt werden? Ich hab mir den Skript jetzt nicht genau angeschaut, aber sieht wohl so aus, dass dich dieses ganze point_distance und lengthdir_* Gedöns in die Irre führt.

    Ich hab mal kurz einen kleinen Skript erstellt, der dir hoffentlich weiterhilft (Er hat nix mit 3D und Perspektiven zu tun, es ist nur ein 2D-Welleneffekt, der mit draw_vertex_texture arbeitet. Lass dich nicht von der for-Schleife irritieren.):

    Spoiler anzeigen

    GML-Quellcode

    1. //arg0 - bg//
    2. //arg1 - x1//
    3. //arg2 - y1//
    4. //arg3 - x2//
    5. //arg4 - y2//
    6. //arg5 - prec//
    7. //arg6 - speed//
    8. var i,yy,width,height,prec,length,sp;//Temporäre Variablen deklarieren
    9. z += 1;
    10. z = z mod 360;
    11. //Variablen inirialisieren
    12. bg = argument0;
    13. tex = background_get_texture(bg);
    14. xx = argument1;
    15. yy = argument2;
    16. width = argument3;
    17. height = argument4;
    18. prec = argument5;
    19. sp = argument6;
    20. length = width/prec;//Anzahl der Punkte, welche dazu dienen um die Textur zu verzerren
    21. draw_primitive_begin_texture(pr_trianglestrip,tex);
    22. for(i = 0; i <= length; i+= 1){
    23. yy = 20+sin(degtorad(z*sp)+i)*5;//Das ist für den Welleneffekt
    24. draw_vertex_texture(i*prec,yy,(i*texture_get_width(tex))/length,0);//Wir verzerren den Punkt an der i-ten Stelle (horzontal gesehen) und an der 0-ten Stelle (vertikal gesehen)
    25. draw_vertex_texture(i*prec,height,(i*texture_get_width(tex))/length,texture_get_height(tex));//Wir verzerren den Punkt an der i-ten Stelle (horzontal gesehen) und an der letzten Stelle (vertikal gesehen, Höhe der Textur)
    26. }
    27. draw_primitive_end();
    Alles anzeigen



    Ein Example dazu ist hier.

    Hoff das hilft.

    MfG Trixt0r ;)

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.