Steinfall Bug

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Raiden93

BeitragMi, Dez 01, 2010 1:46
Antworten mit Zitat
Benutzer-Profile anzeigen
so meine ich das auch warum schlage ich mir hier den so schwer rum wen es auch einfach geht Razz thx

Belion

BeitragMi, Dez 01, 2010 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, ich hätte nicht ggedacht dass man es auch auf diesem einfachen wege lösen könnte.
Danke Psy.

Raiden93

BeitragMi, Dez 01, 2010 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht :DDDDDD fast -.-!.Also die Steine fallen jetzt wen unter ihnen Luft ist.Aber sie fallen nur 1 Schritt runter :/ ? ich kann mir nicht vorstellen was falsch gemacht zu haben.Könnte mir da jemand fix auf die Sprünge Helfen?.
Code: [AUSKLAPPEN]

Laden = True

Type Steintyp
   Field X
   Field Y
End Type
Global Stein.Steintyp

If Laden = True
       Laden = False
      For Y = 0 To 25
         For X = 0 To 25
            If map(X,Y) = 3
               Stein.Steintyp = New Steintyp
               Stein\X = X
               Stein\Y = Y
            End If
         Next
      Next
   End If


For Stein.Steintyp = Each Steintyp
      If map(Stein\X,Stein\Y+1) = 1 ;ist unter dem stein 1 dan fall runter SteinX
           map(Stein\X,Stein\Y) =1
           map(Stein\X,Stein\Y+1) = 3
         map(Stein\X,Stein\Y) =1
           map(Stein\X,Stein\Y+1) = 3
      End If
   Next

PSY

BeitragMi, Dez 01, 2010 2:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Gern Smile

Löschst Du die ganzen Steintypen bei jedem Durchlauf auch wieder?

Weil Du ja bei der For Stein.Steintyp = Each Steintyp Schleife

stein\x und stein\y nicht modifizierst...


Du kannst das Ganze auch anders machen. Nach jedem kompletten Scrollvorgang (oder vor jedem, wie mans halt sieht)(also wenn das Spiel 1 Teil komplett gescrollt hat) wird ja logischerweise die Routine aufgerufen, die den gesamten Level auf alles mögliche überprüft. Die könnte dann (GANZ GROB) so aussehn: (das dimfeld moving wird halt über den level gelegt, darin wird gespeichert in welche richtung das tile sich gerade bewegt).

Code: [AUSKLAPPEN]
Function checklevel()
   For x= 1 To levelbreite
      For y=1 To leveltiefe
         If level(x,y)=stein
            If level(x,y+1)=leer Then moving(x,y)=runter
         EndIf
         If level(x,y)=player
            If level(x,y+1)=gegner Or level(x,y-1)=gegner Or level(x+1,y)=gegner Or level(x-1,y)=gegner Then TOT
            If level(x,y-1)=stein And moving(x,y-1)=runter Then TOT
         EndIf
         If level(x,y)=....
            ....
            ....
         EndIf
      Next
   Next
End Function




L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

Raiden93

BeitragMi, Dez 01, 2010 3:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt ist alles so als hätte ich keinen type obwohl ich ein type habe für meine Steine Evil or Very Mad
Der Stein fällt wen er in der Luft ist, das ist auch ok so soll es ja sein.
Stehe ich unter dem Stein, bleibt der Stein stehen so sollte es ja sein.
Aber stehe ich unter einem Stein fällt gar kein stein mehr.
Auch nicht wen Luft unter ihm ist.
Gehe ich unter dem Stein weg.
Fallen Alle steine plötzlich Runter.

Code: [AUSKLAPPEN]
Type Steintyp
   Field X
   Field Y
End Type
Global Stein.Steintyp

If Stein_Refresh = True
   Stein_Refresh = False
   For X=0 To 25
      For Y=0 To 25
         If map(X,Y) = 3
            Stein.Steintyp = New Steintyp
            Stein\X = X
            Stein\Y = Y
         End If
      Next
   Next
End If

For Stein.Steintyp = Each Steintyp
   If map(SpielerX,SpielerY-1)
   Else
      If map(Stein\X,Stein\Y+1) = 1
         map(Stein\X,Stein\Y) =1
         map(Stein\X,Stein\Y+1) = 3
      End If
   End If
   Delete Stein
   Stein_Refresh = True
Next


Werde mich jetzt schlafen Legen die 5 Stunden Fehler suche haben zwar nix gebracht aber was soll man machen.Später weiter suchen :/
  • Zuletzt bearbeitet von Raiden93 am Mi, Dez 01, 2010 4:14, insgesamt 2-mal bearbeitet

PSY

BeitragMi, Dez 01, 2010 4:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Thema Smile

An was bastelst Du da eigentlich genau? Oder in welche Richtung solls gehn?

Gibts iwelche Screenshots?

L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

Raiden93

BeitragMi, Dez 01, 2010 4:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist so eine art Retro Game, habe leider den Namen von dem Spiel vergessen.
Es geht darum sich durch die Erde zu graben und Kristalle zu sammeln.
Grabt man einen stein frei und steht nicht drunter, fällt der Stein so lange bis er den nächsten Boden berührt.
user posted image

PSY

BeitragMi, Dez 01, 2010 4:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, cool Du meinst Boulder Dash oder Emerald Mine Smile
Eins meiner Favoriten Wink

Dann hau mal rein!

L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

Raiden93

BeitragMi, Dez 01, 2010 4:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja wen es nur so einfach währe ^^ ich kauf mir ne Flasche Sekt wen der Bug beben ist, und stoße drauf an...... Very Happy

EDIT:
Also den Fehler habe ich jetzt mit Rect Stein\X*32,Stein\Y*32,32,32,0 sichtbar gemacht.
Es liegt daran das die Stein\X und Stein\Y werte nicht mit scrollen.
Leider aber kenne ich mich nicht so mit dem Scrolling aus :/.
Vielleicht hat jemand von euch ne Idee.

Der Code:
Code: [AUSKLAPPEN]
Function Steinfallen_Function()
If Stein_Refresh = True
   Stein_Refresh = False
   For X=0 To 25
      For Y=0 To 25
         If map(X,Y) = 3
            Stein.Steintyp = New Steintyp
            Stein\X = X
            Stein\Y = Y
         End If
      Next
   Next
End If

For Stein.Steintyp = Each Steintyp
   Rect Stein\X*32,Stein\Y*32,32,32,0
   If map(SpielerX,SpielerY-1)
   Else
      If map(Stein\X,Stein\Y+1) = 1
         map(Stein\X,Stein\Y) =1
         map(Stein\X,Stein\Y+1) = 3
      End If
   End If
Next
End Function

   ;Steuerung Taste: Pfeil Runter
If KeyDown(208) Then
   If (map(SpielerX,SpielerY+1) = 0) Or (map(SpielerX,SpielerY+1) = 1) Or (map(SpielerX,SpielerY+1) = 2)
      If aa < 1
         Move = 1
         aa = 1
      End If
   End If
End If

If Move = 1 Then ;So sieht mein Scrolling aus.
   If aa > 0
      ScrollY = ScrollY + 2
      SpielerY_Draw = SpielerY_Draw + 2
      xo = xo + 1
      If xo = 16
         aa = 0
         SpielerY = SpielerY + 1
         xo = 0
      End If
   End If
End If

Belion

BeitragMi, Dez 01, 2010 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, ist eine Art Boulderdash Clone die wir machen ^^.
Nur hängen wir leider an diesem ollen bug fest.

Raiden93

BeitragMi, Dez 01, 2010 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Belion nur das komische ist,Jetzt habe ich das mit dem Scrollen zwar aber ein stein denkt immer noch für alle 0o? also als hätte ich gar kein Type stein.....
Es fallen wieder erst die steine wen der Spieler unter gar keinem Stein steht..... :/

Code: [AUSKLAPPEN]
Type Steintyp
   Field X
   Field Y
   Field X_Draw
   Field Y_Draw
End Type
Global Stein.Steintyp

Function Steinfallen_Function()
    If Stein_Refresh = True
       Stein_Refresh = False
      For X=0 To 25
         For Y=0 To 25
            If map(X,Y) = 3
               Stein.Steintyp = New Steintyp
               Stein\X = X
               Stein\Y = Y
            End If
         Next
      Next
   End If
   
    For Stein.Steintyp = Each Steintyp
      Rect Stein\X*32+Stein\X_Draw,Stein\Y*32+Stein\Y_Draw,32,32,0
      If map(Stein\X,Stein\Y+1) = 1
         If map(SpielerX,SpielerY-1) = 3
         Else
             map(Stein\X,Stein\Y) =1
             map(Stein\X,Stein\Y+1) = 3
            Stein\Y = Stein\Y +1
            test = test +1
         End If
      End If
   Next
End Function

  ;Taste: Pfeil Runter ;SO HABE ICH ES AUCH MIT LINKS RECHTS...... gemacht
If KeyDown(208) Then
   If (map(SpielerX,SpielerY+1) = 0) Or (map(SpielerX,SpielerY+1) = 1) Or (map(SpielerX,SpielerY+1) = 2)
      If aa < 1
         Move = 1
         aa = 1
      End If
   End If
End If

If Move = 1 Then
   If aa > 0
      ScrollY = ScrollY + 2
      SpielerY_Draw = SpielerY_Draw + 2
      For Stein.Steintyp = Each Steintyp
         Stein\Y_Draw = Stein\Y_Draw -2
      Next
      xo = xo + 1
      If xo = 16
         aa = 0
         SpielerY = SpielerY + 1
         xo = 0
      End If
   End If
End If



EDIT:!!!!!!
GELÖST
Code: [AUSKLAPPEN]
    For Stein.Steintyp = Each Steintyp
      Rect Stein\X*32+Stein\X_Draw,Stein\Y*32+Stein\Y_Draw,32,32,0
      If Stein\X = SpielerX
      Else
      If map(Stein\X,Stein\Y+1) = 1
         map(Stein\X,Stein\Y) =1
             map(Stein\X,Stein\Y+1) = 3
            Stein\Y = Stein\Y +1
         End If
      End If
   Next


If Stein\X = SpielerX
und nicht map(SpielerX,SpielerY)

Dottakopf

BeitragMi, Dez 01, 2010 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@PSY
Zitat:

also erstmal hacke ich direkt auf der Tilemap rum bei meinem Boulder Dash Clone. Das ist sogar sehr sauber und auch viel unkomplizierter. In der Tilemap steht ja eben drin um was fuer ein Tile es sich handelt. Warum sollte ich da noch n Array drueberlegen? Macht das ganze nur unuebersichtlicher und unnoetig kompliziert.


Gerade eben weil die Tilemap nur das Tile zurückliefert das da gerade ist. Wenn du mal lustigere sachen machen willst, dann kann das ein problem werden.
Evt. will ich meinen Arry zur laufzeit manipulieren ohne das sich die Tilemap ändert.... das geht nur wenn du einen zweiten layer drüber hast in dem du deine manipulationen zwischenspeichern kannst.

Ein Beispiel:
Per Knopfdruck soll eine eigentlich nicht begehbarer bereich plötzlich begehbar werden... Unsichtbare Energiefelder ...was weis ich.

Zudem bin ich nicht an den index aus dem tile set, welcher meine Tile Map befüllt, gebunden. Das heißt ich kann jeder zeit mein Tile Set neu anordnen ohne das sich im code irgendwas ändert...
Was bei großen Projekten sicher ein segen ist...


Schön das alles klappt!

~Edit~ Achja.. wenn ihr als Team an einem Projekt arbeitet, sprecht euch vorher ab und einer stellt die Anfragen ans Forum.



Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

PSY

BeitragDo, Dez 02, 2010 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ein Beispiel:
Per Knopfdruck soll eine eigentlich nicht begehbarer bereich plötzlich begehbar werden... Unsichtbare Energiefelder ...was weis ich.


Hm da haben wir irgendwie aneinander vorbeigeredet Smile
Bei meinen Code wär das gar kein Problem:
Code: [AUSKLAPPEN]

 wir nehmen mal an, level(16,23) wäre eine verschlossene tuer. die soll nun geoeffnet sein
If KeyHit(space)
   level(16,23)=opendoor
   ...
   ...
EndIf

So einfach würde das gehn. Wobei der Code auf einen BoulderDash Clone abgestimmt ist und nicht auf irgendeine Mischung diverser Games...

L8er,
PSY

(edit) nen zweiten layer hab ich schon drüber, der heisst moving(x,y). Darin wird halt gespeichert, ob sich das jeweilige Tile bewegt und wenn, in welche Richtung. Aber selbst für komplexere Sachen (z.b. wenn die Blubbermasse durch den Level wächst usw.) reicht der Standardlayer level(x,y) den ich manipuliere völlig aus.

Raiden93

BeitragDo, Dez 02, 2010 1:07
Antworten mit Zitat
Benutzer-Profile anzeigen
So jetzt möchte ich das mein Stein jede Sekunde um 1 Fällt,leider kann ich mir nicht vorstellen wie ich es verwirkliche.Und ein danke an PSY und DottaKopf.

Ich Kritzel euch mal hier ein Stück meines Codes rein:
Code: [AUSKLAPPEN]
Type Steintyp
   Field X
   Field Y
   Field X_Draw
   Field Y_Draw
End Type
Global Stein.Steintyp

Function Steinfallen_Function()
    If Stein_Refresh = True
       Stein_Refresh = False
      For X=0 To 25
         For Y=0 To 25
            If map(X,Y) = 3
               Stein.Steintyp = New Steintyp
               Stein\X = X
               Stein\Y = Y
            End If
         Next
      Next
   End If
   
   
     For Stein.Steintyp = Each Steintyp
       Color 255,0,0
         Rect Stein\X*32+Stein\X_Draw,Stein\Y*32+Stein\Y_Draw,32,32,0
      
      If (Stein\X = SpielerX)
         If map(Stein\X,Stein\Y+1) = 1
            If Stein\Y = SpielerY-1
            Else
               map(Stein\X,Stein\Y) =1
               map(Stein\X,Stein\Y+1) = 3
               Stein\Y = Stein\Y +1
            End If
         End If
      Else
         If map(Stein\X,Stein\Y+1) = 1
            map(Stein\X,Stein\Y) =1
            map(Stein\X,Stein\Y+1) = 3
            Stein\Y = Stein\Y +1
         End If
      End If
   Next
End Function

ToeB

BeitragDo, Dez 02, 2010 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Millisecs

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Raiden93

BeitragDo, Dez 02, 2010 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Das weiß ich doch aber ich kann nicht sagen if Zeit = 1 dann falle einmal und wen du fertig bist Zeit = 0
:/ das ist das Prob

PSY

BeitragDo, Dez 02, 2010 2:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,

sagen wir mal deine tiles sind alle 20*20 px gross. wenn du willst dass 1 tile 20 px pro sekunde faellt, und du mit 1 px pro loop scrollst, dann gilt folgendes:

1000 millisecs / 20 px = 50 millisecs pro px

---> mainloop
---> 1 px scrollen
---> warten bis 50 millisecs rum sind
---> flip 0

beispiel zur veranschaulichung:

Code: [AUSKLAPPEN]
Graphics 800,600,16
SetBuffer BackBuffer()

Local timer%, y%
timer= CreateTimer (50)

Repeat
   Cls
   Rect 20,y,20,20,1
   y=y+1
   Text 100,y,y
   WaitTimer (timer)
   Flip 0
   If y>600 Then y=0
Until KeyDown(1)


in der realitaet solltest du aber 2 px scrollen, das ist immer noch fluessig. scrollspeed sollte nach bestem spielgefuehl gesetzt werden. also ziemlich am schluss des projectes, nachdem der rest der engine steht.

L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

Raiden93

BeitragDo, Dez 02, 2010 2:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht genau ob das in meinem Prob passend ist.Ich muss ja eigentlich den Code immer nur 1 mal durchlaufen pro Sekunde aber nur dann wen ein stein fällt.Aber ich kann ja leider nicht prüfen ob gerade ein stein fällt.Ich wüsste eigentlich nicht wie :/.

PSY

BeitragDo, Dez 02, 2010 3:23
Antworten mit Zitat
Benutzer-Profile anzeigen
die geschwindigkeit aller einzelbewegungen (spieler läuft, stein fällt, monster bewegt sich....) sollte bei boulderdash clones identisch sein. das ist am einfachsten und läuft am stimmigsten. alle logicchecks sind dann auch ganz easy zu handeln. du weisst genau wann ein kompletter scrollvorgang (1 komplettes tile) durch ist und machst danach den logiccheck des levels (berührt monster player, ist stein auf player gefallen uswusw).

leg dich nicht direkt auf eine bestimmte geschwindigkeit fest. bau mal nen timer ein und test mit der geschwindigkeit ein bischen rum. musst ja nur den 1 wert ändern. sobald du dann scrollen, monster, spielerbewegungen usw eingebaut hast, kannst du den wert nach gefühl anpassen.

l8er,
psy
PSY LABS Games
Coders don't die, they just gosub without return

Raiden93

BeitragDo, Dez 02, 2010 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
baue ich den timer ein wird der Spieler auch langsamer :/

EDIT:
Code: [AUSKLAPPEN]
         
Global timer = Createtimer(32.25)

  ;Taste: Pfeil Runter
         If KeyDown(208) Then
            If (map(SpielerX,SpielerY+1) = 0) Or (map(SpielerX,SpielerY+1) = 1) Or (map(SpielerX,SpielerY+1) = 2) Or (map(SpielerX,SpielerY+1) = 6)
               If aa < 1
                  Move = 1
                  aa = 1
               End If
            End If
         End If
         
         If Move = 1 Then
            If aa > 0
               ScrollY = ScrollY + 2
               SpielerY_Draw = SpielerY_Draw + 2
               For Stein.Steintyp = Each Steintyp
                                        Waittimer (timer)
                  Stein\Y_Draw = Stein\Y_Draw -2
               Next
               For Diamonds.Diamondstyp = Each Diamondstyp
                  Diamonds\Y_Draw = Diamonds\Y_Draw -2
               Next
               xo = xo + 1
               If xo = 16
                  aa = 0
                  If map(SpielerX,SpielerY+1) = 0
                     PlaySound(sfx_schaufeln)
                  End If
                  SpielerY = SpielerY + 1
                  xo = 0
               End If
            End If
         End If



EDIT:
Der Timer stoppt wie Delay das ganze spiel aus.....

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group