tetris frage

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

  • tetris frage

    hallo


    also ich mache spasshalber ein tetris spiel...jetzt hab ich ein kleines script wo die formen also die shapes (blöcke) erstellt werden und abgefragt werden...
    hier mal ein kleiner code daraus

    GML-Quellcode

    1. ​shape = irandom(6);
    2. shape = 0; //nur zum testen
    3. if (shape == 0)
    4. {
    5. instance_create(128.0,obj_tet);
    6. instance_create(156,0,obj_tet);
    7. instance_create(128,32,obj_tet);
    8. instance_create(128,64,obj_tet)
    9. ]


    meine frage ist....gibt es da nicht eine bessere möglichkeit statt den 4 instance creates eine for schleife oder so???

    ich wollte es schon mit ner for schleife machen so:

    GML-Quellcode

    1. ​for (i = 0;i<32;i++)
    2. {
    3. instance_create(128+i,0,obj_tet);_
    4. }


    und da erstellt er nur zwei kästen nebeneinander...(ich dachte er erstellt dann gleich 32)..gibts eine bessere möglichkeit...wenn ja könnt ihr es mir zeigen bitte
  • Um jetzt nur auf deine ForSchleife Frage zu antworte:
    +i macht immer nur ein pixel daneben, was dann evtl. dann so aussieht, dass du nur zwei Blöcke neben einander sind.
    wenn du dann aber +32*i also pro durchgang +32 Pixel hast, müsste es gehen.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • danke


    hast recht

    also wenn ichs jetzt so mache

    GML-Quellcode

    1. ​ for (i = 0;i < 32;i++)
    2. {
    3. instance_create(128*i,0,obj_move)
    4. }
    5. }


    dann erstellt er 32 blöcke aber es ist immer ein grosser abstand von 128 glaub ich zwischen den einzelnen blöcken....wie würde man den abstand wegmachen??
  • EDIT: ok habs schon

    ich musste nur nochmal deinen post durchlesen....hab einfach 128+32*i und jetzt sind sie nebeneinander...toll danke dir husi du bist toll.


    aber würdest du eine for schleife verwenden???oder würdest du was anderes verwendden ...
    und gäbe es noch was besseres weil es sollte ja acuh noch random generated werden da die form nicht immer gleich aussehen sollte.
  • Schau mal hier
    mathebibel.de/lineare-funktionen
    Eigentlich ist sowas eine Lineare Funktion.
    was du gemacht hast, ist mx, m ist 128 und x ist i.
    Du willst aber nicht Abstände von 128 Pixeln, sondern von 32 haben. also musst du 32 statt 128 schreiben.
    Edit: oh jetzt warste schneller :D

    Da Tetrisfiguren nicht alle nach einem gewissen Muster aufgebaut sind, würde ich mir ein Grid oder so anlegen, wo die Anordnung drinne steht und diese dann mit einer For Schleife parsen.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • ok danke cool werde ich mir gleich ansehen..

    eins noch ich hab ein bissl herumgespielt damit ich die lengthdir funktion richtig verstehe...was ich aber nur teilweise tue :headtouch:
    hat aber nix mit tetris mehr zu tun......
    hier mal ein code

    GML-Quellcode

    1. len = 100;
    2. ​spd=8;
    3. if keyboard_check(ord("A"))
    4. {
    5. for(i = 0;i<330;i++){
    6. move_towards_point(x+lengthdir_x(len,i),y+lengthdir_y(len,i),spd);
    7. }
    8. }
    9. else if keyboard_check_released(ord("A"))
    10. {
    11. spd = 0
    12. }
    Alles anzeigen


    wieso bleibt er nicht stehen wenn ich A auslasse und wieso geht er andauernd weiter.....ich dachte er geht maximal soweit wie len ist....was für eine funktion würdest du benutzen wenn du eine figur bewegen willst und dafür dazu die lengthdir benutzt.???
  • Auch wenn das überhaupt nicht hier hereingehört, dein spd muss in die keyboad_check(ord("A")) Abfrage.
    Ich würde einfach direction statt move_towards_point benutzen.

    Frag aber nächstes mal nicht so OffTopic ;)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Also erstens; als anfängerübung ist Tetris definitiv nicht geeignet, da es viel komplizierter ist als es aussieht.

    Ich würde es aber so lösen. Die Shapes sind vorgegebene Sprites. Das Spielfeld ist ein ds_grid. Wenn ein Tetromino an dem grid mit einer besetzten Stelle kollidiert (und dabei ist auch noch die ausrichtung zu beachten!! sauschwer) dann erstellt es im grid an den vier stellen der blöcke aus denen es aufgebaut ist den grideintrag, dass es dort nun besetzt ist. Dann geht eine Schleife durchs grid und schaut ob iwo eine Zeile voll ist und löscht diese gegebenenfalls. Dann müssen die blöcke von oben runtergerutscht werden im grid, dazu eine animation etc...

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • also ich habe es jetzt schon fertig...ohne grid usw...war schon eine herausforderung und bei manchen stellen brauchte ich hilfe aber habe es dennoch geschafft.

    thx drachen aber ich wollte keine fertiggestellte enginge wollte es ja selbst erstellen um es zu lernen.
  • ok gerne....aber was soll ich schreiben...meinen ganzen code??? weil das ist reichlich....

    oder wie ichs gemacht hab???

    dann also ich hab einmal ein obj move erstellt das ein sprite von 32x32 hatte das für die einzelnen formen ist.....dann hab ich ein script gemacht in dem die einzelnen formen erstellt habe und diese dann mit einer globalen variable random gesteuert.dann hab ich für links und rechts bewegung ein step event im controller objekt gemacht und mit with abfragen das obj move bewegen lassen.dann mit einem alarm der jede sekunde ausgelöst wird hab ich einen move down gemacht damit die shapes bzw formen immer jede sekunde runter gehen. dann hab ich noch ein rotation script erstellt in dem ich mit place meeting und with abfrage sowie if abfrage eine rotation erstellt habe für jede einzelne form.und diese dann im obj controller ein key press up event und darin dann das script für rotation aufgerüfen.ja....hmm dann noch ein fertig script in dem es mit for schleifen und place meeting abfragen schaut ob eine reihe voll ist und wenn dann soll sie destroyed werden und die darüber liegenden sollten 32 px nach unten rutschen....dann hab ich noch kleinigkeiten wie ein punkte system eingebaut.
  • oje mir ist gerade ein problem aufgefallen bei meinen tetris....also wenn die unterste reihe voll ist wird sie ja normal zerstört und das sollte auch passieren wenn sie nicht die unterste ist...jedoch geht es bei mir nur mit der untersten....

    und den code für diesen abschnitt habe ich nicht allein geschrieben deshalb würde ich hilfe benötigen....

    also wenn sagen wir die unterste reihe eine lücke hat und die darüber voll ist soltle sie eigentlich zerstört werden aber das tut sie nicht ...hier der code was das zerstören bewirkt.

    GML-Quellcode

    1. ​num_colums = 10;
    2. count = 0;
    3. myy = 576;
    4. for (myx = 32; myx < 352; myx+=32)//checkt ob solid in einer reihe
    5. {
    6. if collision_point(myx,myy,obj_solid,false,true)> 0
    7. {
    8. count++;
    9. }
    10. }
    11. if (count == num_colums)//wenn eine ganze reihe(leiste)voll ist
    12. {
    13. for (myx = 32;myx < 352;myx+=32)
    14. {
    15. position_destroy(myx,myy);
    16. }
    17. with (obj_solid)//alle darüberliegenden eine reeihe runter
    18. {
    19. if (y < other.myy) && (object_index!=obj_wall)
    20. {
    21. y = y+32;
    22. }
    23. }
    24. global.punkte+=1;
    25. }
    Alles anzeigen


    wäre toll wenn mir jemand hier das problem offenlegen könnte
  • Der Code sieht nicht schlecht aus :)

    Du zählst myy nicht runter - von unten nach oben. Du müsstest also noch eine For-Schleife um deinen ganzen Code, nur das du myy wie gesagt von 576 dann (wahrscheinlich) immer 32 - rechnen.
    Musst du nicht drauf achten, aber performance-technisch wäre es beispielsweise gut, wenn du dann, eine ganze Zeile leer ist einfach die myy-Schleife einfach abbrichst, da darüber eh nichts mehr liegt.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • @Husi012


    sorry aber meinst du es so?? nein

    GML-Quellcode

    1. ​num_colums = 10;
    2. count = 0;
    3. myy = 576;
    4. for (myyy = 576; myyy <64; myyy-=32)
    5. {
    6. for (myx = 32; myx < 352; myx+=32)//checkt ob solid in einer reihe
    7. {
    8. if collision_point(myx,myy,obj_solid,false,true)> 0
    9. {
    10. count++;
    11. }
    12. }
    13. }
    14. if (count == num_colums)//wenn eine ganze reihe(leiste)voll ist
    15. {
    16. for (myyy = 576; myyy <64; myyy-=32)
    17. {
    18. for (myx = 32;myx < 352;myx+=32)
    19. {
    20. position_destroy(myx,myy);
    21. }
    22. }
    23. with (obj_solid)//alle darüberliegenden eine reeihe runter
    24. {
    25. if (y < other.myy) && (object_index!=obj_wall)
    26. {
    27. y = y+32;
    28. }
    29. }
    30. global.punkte+=1;
    31. }
    Alles anzeigen




    ich verliere die übersicht....mit der x schleife versteh ichs aber bei der y tu ich mir schwer...