Spiel Freeze und Unbekannte Variable (Nur noch Spiel Freeze)

  • GM 8

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

  • Spiel Freeze und Unbekannte Variable (Nur noch Spiel Freeze)

    Hallöchen Leute...

    Ich arbeite wie (ich gemerkt habe) einige andere an einen Minecraft ähnlichen Spiel welches in 2D gehalten ist. Ich arbeite momentan an einen Weltengenerator es funktionierte eigentlich beim ersten Test alles fein... Die Map ist endlos groß aber was mich wundert ist die Tatsache das ich beim ersten Test an die 3000Pixel oder mehr nach rechts fliegen konnte. Jetzt aber hängt sich das Spiel immer im 900er Bereich auf ich kann einfach nicht verstehen wieso. An der Anzahl der gleichzeitig vorhandenen Objekte kann es eigentlich nicht liegen das hat das Spiel vorher auch nicht gestört. Zudem werden Objekte die garnicht mehr gebraucht werden gelöscht und Objekte die noch gebraucht werden aber zu weit weg liegen deaktiviert. Ich bin einfachmal in die Erde "geflogen" und die maximal Anzahl an gleichzeitig aktiven Instanzen war bei 1700 in der Richtung. Konstant fast (da die Blöcke ja deaktiviert werden wenn sie zu weit abseits des Spielers liegen). Aber wie gesagt jetzt kommt ich nichtmal bis zur X-Kordinate 1000 und erreiche somit garnicht erst die 1700 Blöcke (die Linke Seite würd noch nicht weiter generiert, sprich die Karte ist momentan nur nach Rechts endlos). Generiert wird die Welt nur wenn der Spieler sich zu nahe an einen neuen Chunk begibt.
    Vielleicht hat jemand anhand der Erklärung eine ahnung warum das Spiel dann freezed und nur mit den Task-Manager zu schließen ist.

    Zweites Problem ist (und das ist sehr merkwürdig): Bei meinen Weltengenerator brauche icht natürlich auch einige Variablen welche Biome und ähnliches festlegen. Ich habe einmal eine Variable die bestimmt was für allgemeines Biome es ist (also ob eine Wüste, ein Dschungel, Grasslandschaft, Ozean, ...), eine Variable die einen Untertypus des Biomes bestimmt (Z.b. bei Wüste eine Pyramide generiert, bei Dschungel einen Tempel und sowas) und nochmal eine Variable für den Untergrund (Ob eine Höhle generiert werden soll oder ein geschlossenes Chunk).
    Die Variable wird vom Spiel erkannt wenn sie genau den Wert 2 beträgt, hat sie aber den Wert 1 oder 0 wird vom Gamemaker die Fehlermeldung ausgegeben das die Variable garnicht exestiert bzw. ungültig ist. Ich hab erst gedacht das ich mich nur verschrieben hab und habe dann einfach den Namen der Variable von Wert2 bei den andern Fällen hinein kopiert... Jedoch immernoch das selbe, es ist aber wirklich nur so wenn der Wert 0 oder 1 ist, die 2 klappt einwahnfrei. Hat da jemand eine Ahnung?



    Wäre nett wenn jemand helfen könnte, die beiden Probleme hindern an ein weiter programmieren...


    Edit:
    Seltsam, gerade konnte ich in einen Testlauf über die 900er Grenze, seltsamerweise hat das Spiel allerdings bis zur X-Kordinate 2000 übersprungen...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von TitanKaempfer ()

  • Sorry ich bin nicht öfters in solchen Foren, normalerweise find ich die Fehler einige Stunden schon nachdem auftreten, aber dieser hier plagt mich jetzt doch schon eine Weile.

    Mein aktueller Versuch schaut in etwa so aus:
    obj_chunk: (Create Event)

    Quellcode

    1. touch = 0
    2. if (place_meeting(x+336,0,obj_chunk)) or (place_meeting(x-320,0,obj_chunk))
    3. {
    4. changechunk = irandom(1)
    5. if changechunk = 1
    6. {
    7. oberchunk = irandom(3)
    8. }
    9. else
    10. {
    11. touch = 1
    12. }
    13. }
    14. else
    15. {
    16. oberchunk = irandom(3)
    17. ceil = oberchunk
    18. }
    19. if touch = 0
    20. {
    21. if oberchunk < 2
    22. {
    23. // chunktype = irandom_range(0,5)
    24. }
    25. if oberchunk = 2
    26. {
    27. // chunktype = irandom_range(6,9)
    28. }
    29. if oberchunk = 3
    30. {
    31. // chunktype = irandom_range(10,13)
    32. }
    33. }
    34. chunktype = 0
    35. ceil = chunktype
    36. workx = 0
    37. worky = 0
    38. blockplace = 0
    39. cave = 0
    40. if touch = 0
    41. {
    42. if oberchunk < 2
    43. {
    44. undergroundtype = irandom(2)
    45. ceil = undergroundtype
    46. }
    47. if oberchunk = 2
    48. {
    49. undergroundtype = irandom(3)
    50. ceil = undergroundtype
    51. if undergroundtype = 3
    52. {
    53. undergroundtype = 4
    54. }
    55. }
    56. if oberchunk = 3
    57. {
    58. undergroundtype = irandom(3)
    59. ceil = undergroundtype
    60. }
    61. }
    62. alarm[0] = 3
    Alles anzeigen


    Alarm[0] Event

    Quellcode

    1. if distance_to_point(obj_cam.x,y)<1200
    2. {
    3. instance_create(x+336,0,obj_chunk)
    4. repeat(2020)
    5. {
    6. if workx > 20
    7. {
    8. workx = 0
    9. worky += 1
    10. }
    11. if chunktype < 2 //Gras Chunk (leicht Hügelig)
    12. {
    13. if worky = 18 //Baum
    14. {
    15. blockplace = irandom(8)
    16. ceil = blockplace
    17. if blockplace < 3
    18. {
    19. instance_create(x+workx*16,worky*16,obj_sapling)
    20. }
    21. }
    22. if (worky = 19) or (worky = 20) //Hills
    23. {
    24. blockplace = irandom(2)
    25. ceil = blockplace
    26. if blockplace < 2
    27. {
    28. instance_create(x+workx*16,worky*16,obj_dirt)
    29. }
    30. }
    31. if worky = 21 //Ebene aus Dirt
    32. {
    33. instance_create(x+workx*16,worky*16,obj_dirt)
    34. }
    35. if (worky > 21) and (worky < 30) //Übergangsschicht
    36. {
    37. blockplace = irandom(3)
    38. ceil = blockplace
    39. if blockplace = 0
    40. {
    41. instance_create(x+workx*16,worky*16,obj_dirt)
    42. }
    43. if blockplace = 1
    44. {
    45. instance_create(x+workx*16,worky*16,obj_stone)
    46. }
    47. if blockplace = 2
    48. {
    49. instance_create(x+workx*16,worky*16,obj_ore)
    50. }
    51. if blockplace = 3
    52. {
    53. instance_create(x+workx*16,worky*16,obj_dirt)
    54. }
    55. }
    56. }
    57. if (worky > 29) and (worky < 100)
    58. {
    59. if undergroundtype = 1 //Gefüllt
    60. {
    61. if (worky > 29) and (worky < 39)
    62. {
    63. blockplace = irandom(3)
    64. ceil = blockplace
    65. if blockplace = 0
    66. {
    67. instance_create(x+workx*16,worky*16,obj_stone)
    68. }
    69. if blockplace = 1
    70. {
    71. instance_create(x+workx*16,worky*16,obj_stone)
    72. }
    73. if blockplace = 2
    74. {
    75. instance_create(x+workx*16,worky*16,obj_ore)
    76. }
    77. }
    78. }
    79. if undergroundtype = 1 //Gefüllt
    80. {
    81. if (worky > 29) and (worky < 39)
    82. {
    83. blockplace = irandom(3)
    84. ceil = blockplace
    85. if blockplace = 0
    86. {
    87. instance_create(x+workx*16,worky*16,obj_stone)
    88. }
    89. if blockplace = 1
    90. {
    91. instance_create(x+workx*16,worky*16,obj_stone)
    92. }
    93. if blockplace = 2
    94. {
    95. instance_create(x+workx*16,worky*16,obj_ore)
    96. }
    97. }
    98. }
    99. if undergroundtype = 0 //Gefüllt
    100. {
    101. if (worky > 29) and (worky < 39)
    102. {
    103. blockplace = irandom(3)
    104. ceil = blockplace
    105. if blockplace = 0
    106. {
    107. instance_create(x+workx*16,worky*16,obj_stone)
    108. }
    109. if blockplace = 1
    110. {
    111. instance_create(x+workx*16,worky*16,obj_stone)
    112. }
    113. if blockplace = 2
    114. {
    115. instance_create(x+workx*16,worky*16,obj_ore)
    116. }
    117. }
    118. }
    119. if undergroundtype = 2 //Höhle
    120. {
    121. if (worky > 29) and (worky < 39)
    122. {
    123. blockplace = irandom(3)
    124. ceil = blockplace
    125. if blockplace = 0
    126. {
    127. instance_create(x+workx*16,worky*16,obj_stone)
    128. }
    129. if blockplace = 1
    130. {
    131. instance_create(x+workx*16,worky*16,obj_air)
    132. }
    133. if blockplace = 2
    134. {
    135. instance_create(x+workx*16,worky*16,obj_ore)
    136. }
    137. }
    138. }
    139. }
    140. if worky = 100
    141. {
    142. instance_create(x+workx*16,worky*16,obj_bedrock)
    143. }
    144. workx +=1
    145. }
    146. }
    147. else
    148. {
    149. alarm[0] = 150
    150. }
    Alles anzeigen


    und Collision Event mit obj_chunk

    Quellcode

    1. if touch = 1
    2. {
    3. oberchunk = other.oberchunk
    4. if oberchunk < 2
    5. {
    6. chunktype = irandom_range(0,5)
    7. }
    8. if oberchunk = 2
    9. {
    10. chunktype = irandom_range(6,9)
    11. }
    12. if oberchunk = 3
    13. {
    14. chunktype = irandom_range(10,13)
    15. }
    16. ceil = chunktype
    17. if oberchunk < 2
    18. {
    19. undergroundtype = irandom(2)
    20. ceil = undergroundtype
    21. }
    22. if oberchunk = 2
    23. {
    24. undergroundtype = irandom(3)
    25. ceil = undergroundtype
    26. if undergroundtype = 3
    27. {
    28. undergroundtype = 4
    29. }
    30. }
    31. if oberchunk = 3
    32. {
    33. undergroundtype = irandom(3)
    34. ceil = undergroundtype
    35. }
    36. }
    Alles anzeigen


    Die angeblich Fehlerverursachende Variable ist "undergroundtype" und sie verursacht diesen Fehler hier:
    ERROR in
    action number 1
    of Alarm Event for alarm 0
    for object obj_chunk:

    Error in code at line 60:
    if undergroundtype = 1 //Gefüllt
    ^
    at position 8: Unknown variable undergroundtype

    An besagter Stelle finde ich aber eigentlich keinen Fehler...

    Bei den Freeze-Fehler kommt übrings keine Fehlermeldung sondern das Spiel hängt sich einfach nur auf und lässt sich nur mit Taskmanager schließen. Instanzzahl laut den Debug Mode ist 1200 das ist eigentlich noch nicht viel.
  • Also ok erstes Problem ist weg, ich habe einfachmal alle möglichen Variablen mit einer 0 vordefinieren lassen... Das Untergrund Problem scheint weg zu sein (jedenfalls in den 2Testläufen nicht vorgekommen).

    Zweiteres Problem werde ich nochmal überprüfen, ich hab den Verdacht das Problem gefunden zuhaben (Ergebnis werd ich dann hier als Edit posten)
    Edit:
    Ok die Endlosschleife die ich dachte, das sie es ist, ist es jedenfalls nicht. Ich dachte das liegt am Collisionevent da wenn sich ein Chunk berührt und die Biomeart des Nebenan übernehmen will (oder eben nicht, ist ja Random) dauerthaft passiert aber das ist nicht das Problem wie es ausschaut. Auch alsich gesehen hab das ich beim Versuch zu fixen bei den Fall das die Underground Variable 1 beträgt doppelt hatte isses nicht... Ich hätte gedacht das die Blöcke irgendwie untereinandern (reagieren) oder so, ist auch nicht der Fall... Dafür überspringt man nun scheinbar 900 und kommt auf 1024 und dann hängt es sich da auf...
    Es wundert mich nur das es genau Variable 970 oder so in der Richtung ist...

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

  • Das Kollisionsevent verhält sich nicht unbedingt so, wie man erwartet. Versuche mal, manuell Instanzen zu flaggen (vllt. wird eins doppelt ausgeführt, auch wenn das nicht passieren dürfte) und/oder nur die Kollisionsevents der Objekte mit kleinerer ID auszuführen. Viel würde ich mir von diesen Tests zwar nicht erhoffen, aber man könnte recht fatale, GM-eigene Probleme weitgehend ausschließen. Wahrscheinlich deckst du das aber schon mit touch und oberblock ab...
  • Benutzer online 1

    1 Besucher