reihe zerstören wie bei tetris

  • GM 8

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

  • reihe zerstören wie bei tetris

    so,ich hab schon wieder ein problem.ich will wie bei teris eine reihe zerstören,wenn diese voll ist.ich habe blöcke mit einer größe von 40 auf 40.ich überprüfe also in jedem von diesen blöcken ob an der stelle 20,y ein solides object ist.dies mache ich mit !place_free.wenn dies so ist,zerstört sich der block.aber iwie wills nicht so gabz klappen.ich habs mal angehängt.

    danke, stevey
    Dateien
  • Das Funktioniert nicht, weil die Objekte nicht 100%ig gleichzeitig zerstört werden und somit im Stepevent nach der Zerstörung des 1. Objekts gemerkt wird, dass die Reihe nicht mehr vollständig ist. Ich hab mich vor einigen Wochen zur übungszwecken an einen Tetris-Ableger gewagt, hier sind meine (sehr ausführlich kommentierten) Skripts dafür:

    Nach jedem "Ablegen" eines Bausteins wird dieser in vier "obj_viertel" geteilt (Du hast bei dir ja auch ein einziges Objekt, das überprüft werden muss, also dürfte es genauso laufen). Danach wird dieser Script ausgeführt:

    GML-Quellcode

    1. for (i=432; i>=80; i-=16) { //i => y-Koordinate, geht hier von 432 bis runter zu 80 in 16er-Schritten
    2. ii=80 // ii => x-Koordinate, geht hier von 80 bis 336
    3. while ii<336 {
    4. if !collision_rectangle(ii,i,ii+16,i+16,obj_viertel,true,false) break //wenn keine Kollision mit dem Objekt "obj_viertel" stattfindet wird der Script abgebrochen
    5. if ii = 320 { //wenn die x-koordinate am letzten Platz ist (hier 320)
    6. global.koord = i //wir die Y-KOORDINATE (wichtig!) global gespeichert
    7. with obj_viertel event_perform(ev_other,ev_user0)} //in allen "obj_viertel" wird das Event "user0" ausgeführt
    8. ii+=16}} //laufvariable (also x-Koordnate) wird erhöht


    Das UserEvent0 (Add Event -> Other -> User defined -> User 0) sieht so aus:

    GML-Quellcode

    1. if y<global.koord y+=16 else if y=global.koord instance_destroy();
    2. /* wenn die global ausgegebene y-Koordinate kleiner ist als die eigene
    3. heißt es, dass eine Reihe unter dem Objekt zerstört wurde, also wird das
    4. Objekt um ein Kästchen (hier 16 Pixel) nach unten versetzt //else//
    5. wenn die global ausgegebne y-Koordinate der eigenen entspricht, wird das Objekt
    6. zerstört */


    Ich hoffe du kannst damit was anfangen.
  • also ich habs jetzt selber hingekommen.ich hab den code:

    GML-Quellcode

    1. if (!place_free(20,580) && !place_free(60,580) && !place_free(100,580) && !place_free(140,580) && !place_free(180,580) && !place_free(220,580) && !place_free(260,580) && !place_free(300,580) && !place_free(340,580) && !place_free(380,580) && !place_free(420,580) && !place_free(460,580))
    2. {
    3. for(i=0;i<460;i+=40)
    4. {
    5. position_destroy(i,580)
    6. }
    7. }

    dieser code steht in einem eigenen obj.das muss aber dann für jede reihe gemacht werden.

    jetzt habe ich jedoch ein weiteres problem.die steine müssen ja auch nachfallenx,aber nur wenn die komplette reihe unter ihnen frei ist.ich habe in jeden einzelnen block folgendes geschrieben:

    GML-Quellcode

    1. if (place_free(20,y+40) && place_free(60,y+40) && place_free(100,y+40) && place_free(140,y+40) && place_free(180,y+40) && place_free(220,y+40) && place_free(260,y+40) && place_free(300,y+40) && place_free(340,y+40) && place_free(380,y+40) && place_free(420,y+40) && place_free(460,y+40))
    2. {
    3. y+=40
    4. }


    jedoch gehen die steine nicht alle im gleichen step runter.es fällt immer einer zuerst und der blockiert dann die reihe.

    ich hoffe ihr könnt mir helfen.
  • Du müsstest das ein wenig anders machen.

    Wie sind deine Blöcke gemacht, also wodurch halten sie zusammen?

    Du musst dann einfach überprüfen ob unter so einem Block frei ist und dann den Block nachrutschen lassen.

    Dadurch geht die welle des Runterfallens durch alle Steine.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • ok, dann ist es ja recht einfach, mach in das object wo auch der andere code drinn ist (nicht die blöcke):

    GML-Quellcode

    1. if collision_line(linker_feld_randx,unterste_Linie -20,rechter_feld_randx, unterste_Liniey -20,obj_block,0,1) = noone
    2. with (obj_block) y += 40;

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • ich hab das jetzt nicht ausprobiert,weil ich insgesamt 7 verschiedene blöcke habe und für jeden einzelnen block noch jede reihe überprüft werden müssen.dasird dann doch sehr viel arbeit und ob das recht performance schonend ist,bezweifle ich auch.
    ich habe es jetzt so versucht(nicht erschrecken,ist im grunde immer das gleiche,nur mit anderen y-werten).irgenwie funktioniert es aber nicht und ich weiß nicht warum.
    Spoiler anzeigen

    GML-Quellcode

    1. //mover
    2. if (place_free(20,580) && place_free(60,580) && place_free(100,580) && place_free(140,580) && place_free(180,580) && place_free(220,580) && place_free(260,580) && place_free(300,580) && place_free(340,580) && place_free(380,580) && place_free(420,580) && place_free(460,580))
    3. {
    4. if instance_exists(obj_block_1){obj_block_1.y+=40}
    5. if instance_exists(obj_block_2){obj_block_2.y+=40}
    6. if instance_exists(obj_block_3){obj_block_3.y+=40}
    7. if instance_exists(obj_block_4){obj_block_4.y+=40}
    8. if instance_exists(obj_block_5){obj_block_5.y+=40}
    9. if instance_exists(obj_block_6){obj_block_6.y+=40}
    10. if instance_exists(obj_block_7){obj_block_7.y+=40}
    11. }
    12. if (place_free(20,540) && place_free(60,540) && place_free(100,540) && place_free(140,540) && place_free(180,540) && place_free(220,540) && place_free(260,540) && place_free(300,540) && place_free(340,540) && place_free(380,540) && place_free(420,540) && place_free(460,540))
    13. {
    14. if instance_exists(obj_block_1){obj_block_1.y+=40}
    15. if instance_exists(obj_block_2){obj_block_2.y+=40}
    16. if instance_exists(obj_block_3){obj_block_3.y+=40}
    17. if instance_exists(obj_block_4){obj_block_4.y+=40}
    18. if instance_exists(obj_block_5){obj_block_5.y+=40}
    19. if instance_exists(obj_block_6){obj_block_6.y+=40}
    20. if instance_exists(obj_block_7){obj_block_7.y+=40}
    21. }
    22. if (place_free(20,500) && place_free(60,500) && place_free(100,500) && place_free(140,500) && place_free(180,500) && place_free(220,500) && place_free(260,500) && place_free(300,500) && place_free(340,500) && place_free(380,500) && place_free(420,500) && place_free(460,500))
    23. {
    24. if instance_exists(obj_block_1){obj_block_1.y+=40}
    25. if instance_exists(obj_block_2){obj_block_2.y+=40}
    26. if instance_exists(obj_block_3){obj_block_3.y+=40}
    27. if instance_exists(obj_block_4){obj_block_4.y+=40}
    28. if instance_exists(obj_block_5){obj_block_5.y+=40}
    29. if instance_exists(obj_block_6){obj_block_6.y+=40}
    30. if instance_exists(obj_block_7){obj_block_7.y+=40}
    31. }
    32. if (place_free(20,460) && place_free(60,460) && place_free(100,460) && place_free(140,460) && place_free(180,460) && place_free(220,460) && place_free(260,460) && place_free(300,460) && place_free(340,460) && place_free(380,460) && place_free(420,460) && place_free(460,460))
    33. {
    34. if instance_exists(obj_block_1){obj_block_1.y+=40}
    35. if instance_exists(obj_block_2){obj_block_2.y+=40}
    36. if instance_exists(obj_block_3){obj_block_3.y+=40}
    37. if instance_exists(obj_block_4){obj_block_4.y+=40}
    38. if instance_exists(obj_block_5){obj_block_5.y+=40}
    39. if instance_exists(obj_block_6){obj_block_6.y+=40}
    40. if instance_exists(obj_block_7){obj_block_7.y+=40}
    41. }
    42. if (place_free(20,420) && place_free(60,420) && place_free(100,420) && place_free(140,420) && place_free(180,420) && place_free(220,420) && place_free(260,420) && place_free(300,420) && place_free(340,420) && place_free(380,420) && place_free(420,420) && place_free(460,420))
    43. {
    44. if instance_exists(obj_block_1){obj_block_1.y+=40}
    45. if instance_exists(obj_block_2){obj_block_2.y+=40}
    46. if instance_exists(obj_block_3){obj_block_3.y+=40}
    47. if instance_exists(obj_block_4){obj_block_4.y+=40}
    48. if instance_exists(obj_block_5){obj_block_5.y+=40}
    49. if instance_exists(obj_block_6){obj_block_6.y+=40}
    50. if instance_exists(obj_block_7){obj_block_7.y+=40}
    51. }
    52. if (place_free(20,380) && place_free(60,380) && place_free(100,380) && place_free(140,380) && place_free(180,380) && place_free(220,380) && place_free(260,380) && place_free(300,380) && place_free(340,380) && place_free(380,380) && place_free(420,380) && place_free(460,380))
    53. {
    54. if instance_exists(obj_block_1){obj_block_1.y+=40}
    55. if instance_exists(obj_block_2){obj_block_2.y+=40}
    56. if instance_exists(obj_block_3){obj_block_3.y+=40}
    57. if instance_exists(obj_block_4){obj_block_4.y+=40}
    58. if instance_exists(obj_block_5){obj_block_5.y+=40}
    59. if instance_exists(obj_block_6){obj_block_6.y+=40}
    60. if instance_exists(obj_block_7){obj_block_7.y+=40}
    61. }
    62. if (place_free(20,340) && place_free(60,340) && place_free(100,340) && place_free(140,340) && place_free(180,340) && place_free(220,340) && place_free(260,340) && place_free(300,340) && place_free(340,340) && place_free(380,340) && place_free(420,340) && place_free(460,340))
    63. {
    64. if instance_exists(obj_block_1){obj_block_1.y+=40}
    65. if instance_exists(obj_block_2){obj_block_2.y+=40}
    66. if instance_exists(obj_block_3){obj_block_3.y+=40}
    67. if instance_exists(obj_block_4){obj_block_4.y+=40}
    68. if instance_exists(obj_block_5){obj_block_5.y+=40}
    69. if instance_exists(obj_block_6){obj_block_6.y+=40}
    70. if instance_exists(obj_block_7){obj_block_7.y+=40}
    71. }
    72. if (place_free(20,300) && place_free(60,300) && place_free(100,300) && place_free(140,300) && place_free(180,300) && place_free(220,300) && place_free(260,300) && place_free(300,300) && place_free(340,300) && place_free(380,300) && place_free(420,300) && place_free(460,300))
    73. {
    74. if instance_exists(obj_block_1){obj_block_1.y+=40}
    75. if instance_exists(obj_block_2){obj_block_2.y+=40}
    76. if instance_exists(obj_block_3){obj_block_3.y+=40}
    77. if instance_exists(obj_block_4){obj_block_4.y+=40}
    78. if instance_exists(obj_block_5){obj_block_5.y+=40}
    79. if instance_exists(obj_block_6){obj_block_6.y+=40}
    80. if instance_exists(obj_block_7){obj_block_7.y+=40}
    81. }
    82. if (place_free(20,260) && place_free(60,260) && place_free(100,260) && place_free(140,260) && place_free(180,260) && place_free(220,260) && place_free(260,260) && place_free(300,260) && place_free(340,260) && place_free(380,260) && place_free(420,260) && place_free(460,260))
    83. {
    84. if instance_exists(obj_block_1){obj_block_1.y+=40}
    85. if instance_exists(obj_block_2){obj_block_2.y+=40}
    86. if instance_exists(obj_block_3){obj_block_3.y+=40}
    87. if instance_exists(obj_block_4){obj_block_4.y+=40}
    88. if instance_exists(obj_block_5){obj_block_5.y+=40}
    89. if instance_exists(obj_block_6){obj_block_6.y+=40}
    90. if instance_exists(obj_block_7){obj_block_7.y+=40}
    91. }
    92. if (place_free(20,220) && place_free(60,220) && place_free(100,220) && place_free(140,220) && place_free(180,220) && place_free(220,220) && place_free(260,220) && place_free(300,220) && place_free(340,220) && place_free(380,220) && place_free(420,220) && place_free(460,220))
    93. {
    94. if instance_exists(obj_block_1){obj_block_1.y+=40}
    95. if instance_exists(obj_block_2){obj_block_2.y+=40}
    96. if instance_exists(obj_block_3){obj_block_3.y+=40}
    97. if instance_exists(obj_block_4){obj_block_4.y+=40}
    98. if instance_exists(obj_block_5){obj_block_5.y+=40}
    99. if instance_exists(obj_block_6){obj_block_6.y+=40}
    100. if instance_exists(obj_block_7){obj_block_7.y+=40}
    101. }
    102. if (place_free(20,180) && place_free(60,180) && place_free(100,180) && place_free(140,180) && place_free(180,180) && place_free(220,180) && place_free(260,180) && place_free(300,180) && place_free(340,180) && place_free(380,180) && place_free(420,180) && place_free(460,180))
    103. {
    104. if instance_exists(obj_block_1){obj_block_1.y+=40}
    105. if instance_exists(obj_block_2){obj_block_2.y+=40}
    106. if instance_exists(obj_block_3){obj_block_3.y+=40}
    107. if instance_exists(obj_block_4){obj_block_4.y+=40}
    108. if instance_exists(obj_block_5){obj_block_5.y+=40}
    109. if instance_exists(obj_block_6){obj_block_6.y+=40}
    110. if instance_exists(obj_block_7){obj_block_7.y+=40}
    111. }
    112. if (place_free(20,140) && place_free(60,140) && place_free(100,140) && place_free(140,140) && place_free(180,140) && place_free(220,140) && place_free(260,140) && place_free(300,140) && place_free(340,140) && place_free(380,140) && place_free(420,140) && place_free(460,140))
    113. {
    114. if instance_exists(obj_block_1){obj_block_1.y+=40}
    115. if instance_exists(obj_block_2){obj_block_2.y+=40}
    116. if instance_exists(obj_block_3){obj_block_3.y+=40}
    117. if instance_exists(obj_block_4){obj_block_4.y+=40}
    118. if instance_exists(obj_block_5){obj_block_5.y+=40}
    119. if instance_exists(obj_block_6){obj_block_6.y+=40}
    120. if instance_exists(obj_block_7){obj_block_7.y+=40}
    121. }
    122. if (place_free(20,100) && place_free(60,100) && place_free(100,100) && place_free(140,100) && place_free(180,100) && place_free(220,100) && place_free(260,100) && place_free(300,100) && place_free(340,100) && place_free(380,100) && place_free(420,100) && place_free(460,100))
    123. {
    124. if instance_exists(obj_block_1){obj_block_1.y+=40}
    125. if instance_exists(obj_block_2){obj_block_2.y+=40}
    126. if instance_exists(obj_block_3){obj_block_3.y+=40}
    127. if instance_exists(obj_block_4){obj_block_4.y+=40}
    128. if instance_exists(obj_block_5){obj_block_5.y+=40}
    129. if instance_exists(obj_block_6){obj_block_6.y+=40}
    130. if instance_exists(obj_block_7){obj_block_7.y+=40}
    131. }
    132. if (place_free(20,60) && place_free(60,60) && place_free(100,60) && place_free(140,60) && place_free(180,60) && place_free(220,60) && place_free(260,60) && place_free(300,60) && place_free(340,60) && place_free(380,60) && place_free(420,60) && place_free(460,60))
    133. {
    134. if instance_exists(obj_block_1){obj_block_1.y+=40}
    135. if instance_exists(obj_block_2){obj_block_2.y+=40}
    136. if instance_exists(obj_block_3){obj_block_3.y+=40}
    137. if instance_exists(obj_block_4){obj_block_4.y+=40}
    138. if instance_exists(obj_block_5){obj_block_5.y+=40}
    139. if instance_exists(obj_block_6){obj_block_6.y+=40}
    140. if instance_exists(obj_block_7){obj_block_7.y+=40}
    141. }
    142. if (place_free(20,20) && place_free(60,20) && place_free(100,20) && place_free(140,20) && place_free(180,20) && place_free(220,20) && place_free(220,20) && place_free(300,20) && place_free(340,20) && place_free(380,20) && place_free(420,20) && place_free(420,20))
    143. {
    144. if instance_exists(obj_block_1){obj_block_1.y+=40}
    145. if instance_exists(obj_block_2){obj_block_2.y+=40}
    146. if instance_exists(obj_block_3){obj_block_3.y+=40}
    147. if instance_exists(obj_block_4){obj_block_4.y+=40}
    148. if instance_exists(obj_block_5){obj_block_5.y+=40}
    149. if instance_exists(obj_block_6){obj_block_6.y+=40}
    150. if instance_exists(obj_block_7){obj_block_7.y+=40}
    151. }
    Alles anzeigen


    //Aus Gründen der Übersicht von Moolt in einen Spoiler verfrachtet.
    //danke Moolt^^

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

  • Willst du etwa behaupten das dein Code performanceschonender sein soll als meiner? xD
    Ok, 7 Blöcke, kein Problem.
    Du brauchst für sowas einen Parent-object.
    Wenn du ein ordentliches tetris machst wirst du noch öfters auf alle Blöcke auf einmal zugreifen müssen.
    Darum mach obj_parent_block und gib dieses den Blöcken als parent (bei den Objectproperitys).

    Dann:


    GML-Quellcode

    1. if collision_line(linker_feld_randx,unterste_Linie -20,rechter_feld_randx, unterste_Liniey -20,obj_parent_block,0,1) = noone
    2. with (obj_parent_block) y += 40;



    EDIT: ich weis auch warum deins nicht so funktionieren kann, du must with-statements benutzen.
    Eine kleiner Erklärung warum und wie gibt es hier:
    gm-d.de/help/
    Leider kann man kein Thema in den Link einspeichern, du musst das kapitel With Konstruktionen anklicken.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • ach man,das mit den parents vergesse ich immer.ich habe den code jetzt noch ein wenih angepasst,da ja jede volle reihe zerstört werden kann und im code somit auch jede reihe überprüft werden muss.das ganze sieht jetzt folgedermaßen aus:
    Spoiler anzeigen

    GML-Quellcode

    1. //mover
    2. if collision_line(20,580,460,580,obj_block_parent,0,1)= noone
    3. {
    4. if place_free(x,y+40)
    5. {
    6. with (obj_block_parent) y += 40
    7. }
    8. }
    9. if collision_line(20,540,460,540,obj_block_parent,0,1)= noone
    10. {
    11. if place_free(x,y+40)
    12. {
    13. with (obj_block_parent) y += 40
    14. }
    15. }
    16. if collision_line(20,500,460,500,obj_block_parent,0,1)= noone
    17. {
    18. if place_free(x,y+40)
    19. {
    20. with (obj_block_parent) y += 40
    21. }
    22. }
    23. if collision_line(20,460,460,460,obj_block_parent,0,1)= noone
    24. {
    25. if place_free(x,y+40)
    26. {
    27. with (obj_block_parent) y += 40
    28. }
    29. }
    30. if collision_line(20,420,460,420,obj_block_parent,0,1)= noone
    31. {
    32. if place_free(x,y+40)
    33. {
    34. with (obj_block_parent) y += 40
    35. }
    36. }
    37. if collision_line(20,380,460,380,obj_block_parent,0,1)= noone
    38. {
    39. if place_free(x,y+40)
    40. {
    41. with (obj_block_parent) y += 40
    42. }
    43. }
    44. if collision_line(20,340,460,340,obj_block_parent,0,1)= noone
    45. {
    46. if place_free(x,y+40)
    47. {
    48. with (obj_block_parent) y += 40
    49. }
    50. }
    51. if collision_line(20,300,460,300,obj_block_parent,0,1)= noone
    52. {
    53. if place_free(x,y+40)
    54. {
    55. with (obj_block_parent) y += 40
    56. }
    57. }
    58. if collision_line(20,260,260,580,obj_block_parent,0,1)= noone
    59. {
    60. if place_free(x,y+40)
    61. {
    62. with (obj_block_parent) y += 40
    63. }
    64. }
    65. if collision_line(20,220,460,220,obj_block_parent,0,1)= noone
    66. {
    67. if place_free(x,y+40)
    68. {
    69. with (obj_block_parent) y += 40
    70. }
    71. }
    72. if collision_line(20,180,460,180,obj_block_parent,0,1)= noone
    73. {
    74. if place_free(x,y+40)
    75. {
    76. with (obj_block_parent) y += 40
    77. }
    78. }
    79. if collision_line(20,140,460,140,obj_block_parent,0,1)= noone
    80. {
    81. if place_free(x,y+40)
    82. {
    83. with (obj_block_parent) y += 40
    84. }
    85. }
    86. if collision_line(20,100,460,100,obj_block_parent,0,1)= noone
    87. {
    88. if place_free(x,y+40)
    89. {
    90. with (obj_block_parent) y += 40
    91. }
    92. }
    93. if collision_line(20,60,460,60,obj_block_parent,0,1)= noone
    94. {
    95. if place_free(x,y+40)
    96. {
    97. with (obj_block_parent) y += 40
    98. }
    99. }
    100. if collision_line(20,20,460,20,obj_block_parent,0,1)= noone
    101. {
    102. if place_free(x,y+40)
    103. {
    104. with (obj_block_parent) y += 40
    105. }
    106. }
    Alles anzeigen


    es klappt aber nicht.sobald die objecte unten ankommen und in die einzelnen blöcke verwandelt werden,verschwinden sie einfach.ich weiß nicht ob sie zerstört werden oder einfach nach unten durch die festen fallen.