D3D: Spieler richtig zeichnen

  • GM 8

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

  • D3D: Spieler richtig zeichnen

    Hallo Community,
    wieder stehe ich vor einem Problem, dass ich einfach nicht lösen kann.

    Ich hab beschlossen, Battle of War Online in 3D zu entwickeln.
    Die Blöcke und Items werden in 3D gezeichnet und der Spieler in 2D.

    Die Teile des Spielers werden so gezeichnet:

    GML-Quellcode

    1. draw_sprite_ext(spr_player_arm,0,x,y,image_xscale,side,angle,global.chautfarbe,image_alpha)
    2. draw_sprite_ext(spr_player_waffe,global.waffe,x,y,image_xscale,side,other.angle,image_blend,image_alpha)
    3. draw_sprite_ext(spr_player_ ...
    Doch die Teile werden in gleicher Depth gezeichnet und das sieht ziemlich blöd aus.

    Dann hab ich folgendes versucht:

    GML-Quellcode

    1. depth = -3
    2. draw_sprite_ext(spr_player_arm,0,x,y,image_xscale,side,angle,global.chautfarbe,image_alpha)
    3. depth = -2
    4. draw_sprite_ext(spr_player_waffe,global.waffe,x,y,image_xscale,side,other.angle,image_blend,image_alpha)
    5. depth = -1
    6. draw_sprite_ext(spr_player_ ...
    Nichts ist anders.

    Ich hoffe ihr könnt mir helfen.

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

  • Wie wärs, deinen Creation Code durchzuguggen und zu vergleichen mit dem Kerl, der richtig rum steht, und anschliessend einfach gegebenermassen umzudrehen?
    Bzw die Variablen der beiden Objekte miteinander vergleichen... "side" könnte doch vl was damit zu tun haben
    Sonst gib mal Code her.
    "das war meine letzte flamewar PM an dich ."
  • Aber was sind denn die Unterschiede zwischen den beiden Spielerobjekten codemässig? Ist der Eine der vom lokalen Spieler gesteuerte und die anderen Verkehrten Mitspieler aus dem Internet?
    Nimm am besten mal so paar Variablen auf wie "side" und andere mit dem Zeichnen zusammenhängende Variablen, lass sie auf den Screen zeichnen oder gib sie sonst wie auf...
    Evtl. könnte es auch was mit 3d Transformierungen aus anderen Objekten zu tun haben oder so, wenn du die im Draw Event des Spielers nicht setzt(reine Vermutung, arbeite zZ. nicht mehr mit dem GM..)
    "das war meine letzte flamewar PM an dich ."
  • Du musst immer wenn du in 3d Transformationen benutzt, vorher und nachher d3d_transform_set_identity() verwenden
    z. B. :

    GML-Quellcode

    1. d3d_transform_set_identity()
    2. d3d_transform_add_rotation_z(direction)
    3. d3d_draw_block(blablablubblub)//kein Bock mir was auszudenken ;-)
    4. d3d_transform_set_identity()

    Falls du keine Transformationen benutzt weis ich auch nicht weiter. :|
  • @peyi: Klappt trotzdem nicht. Die Munition bewegt sich trotzdem mit dem Spieler. Wenn die Munition am Anfang da ist, klappt alles, doch wenn sie erstellt wird, nicht.

    Ich hab schnell ein Video gemacht, das euch zeigen soll, was ich genau meine.
    Video: Battle of War Online - Bugs

    EDIT: Moolt, wo steckst du? :D

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

  • Ok, jetzt hab ich den Bug bei den Items gefixt.
    Aber den Bug beim Spieler ist nur teilweise gefixt. Also er ist jetzt richtig rum, und hat normale Größe, aber bewegt sich mit der Camera mit.

    Ich poste mal den Code:

    Draw Event vom Spieler (obj_player):

    GML-Quellcode

    1. // Zeichne Spieler
    2. d3d_set_depth(-4)
    3. draw_sprite_ext(spr_player_arm,0,x,y,image_xscale,side,angle,global.chautfarbe,image_alpha)
    4. d3d_set_depth(-3)
    5. draw_sprite_ext(spr_player_waffe,global.waffe,x,y,image_xscale,side,other.angle,image_blend,image_alpha)
    6. d3d_set_depth(-2)
    7. draw_sprite_ext(sprite_index,global.koerper,x,y,image_xscale,image_yscale,image_angle,global.chautfarbe,image_alpha)
    8. d3d_set_depth(-1)
    9. draw_sprite_ext(spr_player_auge,global.auge,x-5,y-7,image_xscale,image_yscale,angle,global.caugenfarbe,image_alpha)
    10. draw_sprite_ext(spr_player_auge,global.auge,x+5,y-7,image_xscale,image_yscale,angle,global.caugenfarbe,image_alpha)
    11. draw_sprite_ext(spr_player_mund,global.mund,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha)
    12. draw_sprite_ext(spr_player_frisur,global.frisur,x,y,image_xscale,image_yscale,image_angle,global.chaarfarbe,image_alpha)
    13. }
    14. d3d_set_projection_ortho(view_xview,view_yview,view_wview,view_hview,0)
    15. // Zeichne Spielernamen
    16. draw_set_font(fnt_name)
    17. draw_set_color(c_yellow)
    18. draw_set_alpha(1)
    19. draw_text(x,y-18-(string_height(global.nick)/2)-2,global.nick)
    20. d3d_set_projection_perspective(0,0,room_width,room_height,0)
    Alles anzeigen


    Draw Event vom anderen Spieler (obj_player_remote):

    GML-Quellcode

    1. //if distance_to_object(obj_player) > 800 exit
    2. if view_current = 0
    3. {
    4. draw_set_color(c_white)
    5. d3d_set_depth(4)
    6. draw_sprite_ext(spr_player_arm,0,x,y,image_xscale,side,angle,chautfarbe,image_alpha)
    7. d3d_set_depth(3)
    8. draw_sprite_ext(spr_player_waffe,waffe,x,y,image_xscale,side,angle,image_blend,image_alpha)
    9. d3d_set_depth(2)
    10. draw_sprite_ext(sprite_index,koerper,x,y,image_xscale,image_yscale,image_angle,chautfarbe,image_alpha)
    11. d3d_set_depth(1)
    12. draw_sprite_ext(spr_player_auge,auge,x-5,y-7,image_xscale,image_yscale,angle,caugenfarbe,image_alpha)
    13. draw_sprite_ext(spr_player_auge,auge,x+5,y-7,image_xscale,image_yscale,angle,caugenfarbe,image_alpha)
    14. draw_sprite_ext(spr_player_mund,mund,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha)
    15. draw_sprite_ext(spr_player_frisur,frisur,x,y,image_xscale,image_yscale,image_angle,chaarfarbe,image_alpha)
    16. }
    17. d3d_set_projection_ortho(view_xview,view_yview,view_wview,view_hview,0)
    18. draw_set_font(fnt_name)
    19. draw_set_color(c_yellow)
    20. draw_set_alpha(1)
    21. draw_text(x,y-18-(string_height(nick)/2)-2,nick)
    22. d3d_set_projection_perspective(view_xview,view_yview,view_wview,view_hview,180)
    Alles anzeigen


    Ich hoffe das Problem wird bald gelöst.
    Ich will Battle of War Online nicht nochmal in 2D proggen. ;(
  • d3d_transform_set_identity()
    IMMER vor und nach dem Code, sonst übernimmt er Transformationen von vorhergehenden Draw Events aus anderen Objekten!


    Hier aus Moolts 3d Tutorial

    GML-Quellcode

    1. d3d_transform_set_identity();
    2. d3d_transform_add_rotation_z(direction);
    3. d3d_transform_add_translation(x,y,0);
    4. d3d_draw_block(-5,-4,0,+5,+4,5,tex,1,1);//Zeichnet einen Block
    5. d3d_transform_set_identity();


    Und so nebenbei wäre es eig angebracht, den ganzen Code, der bei beiden Playern gleich ist(zB: der Draw Code), in ein gemeinsames neues Parent Objekt zu stecken..
    "das war meine letzte flamewar PM an dich ."

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

  • Bringt mir jetzt auch nicht weiter, denn es wird ja ein Sprite gezeichnet und kein Block oder Wall.

    Ok, ich bin jetzt wieder etwas weiter gekommen, und das passt auch.
    Man wird den Bug erkennen, wird aber nicht störend sein.

    Kurz gefasst: Problem gelöst
  • Naja statt dem Block würdest du halt das Sprite zeichnen.. Billboarding halt.. Das Sprite muss genau wie der Block auch transformiert werden richtig, nur muss es halt zusätzlich immer Richtung Kamera schauen.
    "das war meine letzte flamewar PM an dich ."
  • Benutzer online 1

    1 Besucher