Snake engine problem

  • GM 7
  • Snake engine problem

    Jetzt dürft ihr denken was ihr wollt! SNAKE? der ist doch alt!

    Ja, das ist er, dashalb will ich mich mal daran machen, undzwar nicht nur mit x,y sondern auch mit z-akse.

    Das 3d kommt aber erst später, ich binn nehmlich erst mal bei die engine zu machen.

    Ja, snake engines gibt es, aber nicht so wie ich es will.

    Snakeengine


    Bei snake hüpft die slange ja bekannter weise immer, aber das will ich nicht. Sie soll sich wie eine schlange verhalten.

    Damit das möglich ist, habe ich eine liste erstellt, st.
    diese wird jeden step mit den x und y kordinaten den kopfes gefüllt
    Diese liste ist 16*10*2 (320) lang, weil jedes teilstück 16 lang ist, davon gibt es max. 10, und 2 (später 3) brauche ich für die x und y akse!

    also: create event vom kopf:


    GML-Quellcode

    1. st=ds_list_create()
    2. repeat 16*10{
    3. ds_list_add(st,x)
    4. ds_list_add(st,y)
    5. }



    Da geht super und zieht auch nicht so extrem performance.

    Dann gibt es auch noch die punkte, die im raum per random erstellt werden.

    Wenn man kolidiert, dann score+= 1

    doch jetzt zum problem:

    Im drawevent, werde ich die punkte drawen, die hinter dem head mit gezogen werden:


    GML-Quellcode

    1. ds_list_delete(st,0)// löscht die letzten x kordinaten aus der liste, die brauche ich nicht mehr
    2. ds_list_delete(st,0)// und dann auch noch mit den y
    3. ds_list_add(st,x)// fügt die aktuelle x position hinzu
    4. ds_list_add(st,y)// und das auch noch mit y
    5. //Hier das problem
    6. var i;
    7. for (i=0 i<=score i+=1){
    8. draw_sprite(sprite0,-1,ds_list_find_value(st,i),ds_list_find_value(st,i+1))
    9. }



    Sollte funktioniern, tut es auch, nur nicht so wie ich es will

    wenn der score nur 1 ist, wird der sprite nur an einer der letzten position gedrawt, und wenn man mehr als 1 score hat, dann werden die anderen nur 1 px hinter dem forderem gedrawt!

    Wer es nicht versteht, Klick-klack

    Bis jetzt steht noch nicht viel, und wenn jemand ein ganz ander idee hat, darf er sie gerne äußern!

    Ich wette das die antwort verhältnismäsig einfach ist, doch sie kommt mir einfach nicht!

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

  • Ich hätte eine andere Lösung.
    Erstelle immer Objekte an der vorigen Position. So ist das mit der Kollision auch leichter (meiner Meinung nach).
    Diese Objekte bekommen einen Alarm der proportional zur Score steigt. Nachdem der Alarm abgelaufen ist, wird das Objekt zerstört.
  • Ja, das ist gut! :headtouch:

    Simpel und genial. Was mache ich bloß fürn Salat! :whistling:


    EDIT: doch nicht gut, ich bekomme dann doch den effekt den ich umgehen wollte, dass es nehmlich so hüpfend vorangeht! :P

    EDIT 2:

    Ich habe einfach durch pures glück und viel zeit es zum laufen gebracht:


    allerding habe ich jezt ein neues problem:
    Wenn ich die geschindichkeit ändere, dann ändert sich auch (logischerweise) der abstand zwischen den einzelnene teilen.

    Alles ist wie vorher, außer im drawevent sieht es jetzt ein bisschen anders aus:

    GML-Quellcode

    1. ds_list_delete(st,0)
    2. ds_list_delete(st,0)
    3. ds_list_add(st,x)
    4. ds_list_add(st,y)
    5. var i, ie, dir;
    6. for (i=-1 i<=score i+=1)
    7. {
    8. ie=i*16 //16 weil das der halbe länge eines schwanzstückes ist
    9. dir=point_direction(ds_list_find_value(st,220-ie),ds_list_find_value(st,220-ie+1),ds_list_find_value(st,220-ie+2),ds_list_find_value(st,220-ie+1+2))
    10. if i!=score
    11. {draw_sprite_ext(sprite0,-1,ds_list_find_value(st,220-ie),ds_list_find_value(st,220-ie+1),1,1,dir,c_white,1)}
    12. else
    13. {draw_sprite_ext(sprite3,-1,ds_list_find_value(st,220-ie),ds_list_find_value(st,220-ie+1),1,1,dir,c_white,1)}
    14. }
    Alles anzeigen



    Wenn ich jetzt "ie=i*16" noch draschreibe "/speed/4" dann solte der sich der geschindichkeit anpassen, doch das gibt probleme, weil die list ja immer abwechselnd x und y hat.

    Das einzige was mir jetzt einfällt ist es zwei listen zu machen, eine mit x koordinaten, und eine mit den y koordinaten. Doch das würde bedeuten das ich so gut wie alles neu machen muss.

    Hat jemand eine bessere idee?

    Wenn jemand hier nicht durchblickt, dann habt keine angst nach der .gmk zu fragen, ich werde die euch dann schon geben!


    EDIT: 3
    Thema erledigt, habe eingesehen das es zu kompliziert wird wenn man nur eine liste hat, habe es umgebaut, und es funktioniert. War außerdem nicht so schwer wie ich es erwartet hatte.

    Danke an alle die vorhatten hier was zu schreiben! :D

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von SDX ()