Snake sitzt direkt aneinander???
Übersicht

![]() |
M0rgensternBetreff: Snake sitzt direkt aneinander??? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo an alle...
Für mein Snake Klon halt ich mich teilweise an das Tutorial hier im Forum. Und als ich eben dem anderen geholfen habe, da hats auch geklappt... Aber bei mir stimmts einfach nicht... Ich weiß wirklich nicht warum. Meine Schlangenteile überlappen sich, auch am Kopf... Also die Schlange die eigentlich 5 Teile + Kopf lang sein müsste, sieht total blöd aus.... Hier ist mal der Code der Funktionen und der Hauptschleife: Code: [AUSKLAPPEN] Repeat
WaitTimer FTimer Cls SteuerungSchlange() SchwanzErstellen() AllesZeichnen() Flip 0 Until KeyDown(1) Code: [AUSKLAPPEN] Function AllesZeichnen()
;Der Kopf Color 255,255,255 For Teil.TSchwanz = Each TSchwanz Select Richtung Case Hoch Oval Teil\Sx#, Teil\Sy#, 10, 13, 0 Case Runter Oval Teil\Sx#, Teil\Sy#, 10, 13, 0 Case Links Oval Teil\Sx#, Teil\Sy#, 13, 10, 0 Case Rechts Oval Teil\Sx#, Teil\Sy#, 13, 10, 0 End Select Next Select Richtung Case Hoch Oval Kopf\Kx#, Kopf\Ky#, 10, 13, 1 Case Runter Oval Kopf\Kx#, Kopf\Ky#, 10, 13, 1 Case Links Oval Kopf\Kx#, Kopf\Ky#, 13, 10, 1 Case Rechts Oval Kopf\Kx#, Kopf\Ky#, 13, 10, 1 End Select End Function Function SteuerungSchlange() Select Richtung ;Die Richtung bestimmen Case Hoch Kopf\Ky# = Kopf\Ky# - Kopf\Speed# Case Runter Kopf\Ky# = Kopf\Ky# + Kopf\Speed# Case Rechts Kopf\Kx# = Kopf\Kx# + Kopf\Speed# Case Links Kopf\Kx# = Kopf\Kx# - Kopf\Speed# End Select If KeyHit(200) And Richtung <> Runter Then Richtung = Hoch ;Hoch Steuern If KeyHit(208) And Richtung <> Hoch Then Richtung = Runter ;Runter Steuern If KeyHit(203) And Richtung <> Rechts Then Richtung = Links ;Links Steuern If KeyHit(205) And Richtung <> Links Then Richtung = Rechts ;Rechts Steuern If Kopf\Kx# >= GraphicsWidth() Then GameOver() If Kopf\Kx# <= 0 Then GameOver() If Kopf\Ky# >= GraphicsHeight() Then GameOver() If Kopf\Ky# <= 0 Then GameOver() End Function Function SchwanzErstellen() Teil.TSchwanz = New TSchwanz Teil\Sx# = Kopf\Kx# Teil\Sy# = Kopf\Ky# Delete First TSchwanz End Function Function GameOver() ClsColor 0, 0, 0 Cls Color 255, 0, 0 Text GraphicsWidth()/2, GraphicsHeight()/2, "VERLOREN!", 1 End Function Achja, hier noch vor der Hauptschleife: Code: [AUSKLAPPEN] For i=0 To 4 ;Vier Körperteile zu beginn
Teil.TSchwanz = New TSchwanz Teil\Sx# = Kopf\Kx# - i;Damit die Schlange nach Westen gerichtet ist Teil\Sy# = Kopf\Ky# Next Hoffentlich könnt ihr mir helfen.... Lg, M0rgenstern |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du soviel Code postest, kannst du auch gleich alles posten.
Im Moment zwingst du uns dazu, den Code zusammenzukopieren, und zu ergänzen und zu schauen, was passiert. Denn das eigentliche Problem lautet bei dir nur: Es sieht blöd aus. |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, da ich nicht weiß, WO im COde der Fehler genau liegt hab ich alles geschickt... Dann werde ich hier mal die FUnktionen einzeln darstellen, vllt ist das dann besser, sry musste direkt weg deswegen wars ein wenig unübersichtlich...
Code: [AUSKLAPPEN] Function AllesZeichnen()
;Der Kopf Color 255,255,255 For Teil.TSchwanz = Each TSchwanz Select Richtung Case Hoch Oval Teil\Sx#, Teil\Sy#, 10, 13, 0 Case Runter Oval Teil\Sx#, Teil\Sy#, 10, 13, 0 Case Links Oval Teil\Sx#, Teil\Sy#, 13, 10, 0 Case Rechts Oval Teil\Sx#, Teil\Sy#, 13, 10, 0 End Select Next Select Richtung Case Hoch Oval Kopf\Kx#, Kopf\Ky#, 10, 13, 1 Case Runter Oval Kopf\Kx#, Kopf\Ky#, 10, 13, 1 Case Links Oval Kopf\Kx#, Kopf\Ky#, 13, 10, 1 Case Rechts Oval Kopf\Kx#, Kopf\Ky#, 13, 10, 1 End Select End Function Diese Funktion zeichnet (bisher) den Kopf und die Schwanzteile. Die Select Case Abfrage ist einfach nur da um die Ellipsen in die richtige Richtung zu drehen. Code: [AUSKLAPPEN] Function SteuerungSchlange()
Select Richtung ;Die Richtung bestimmen Case Hoch Kopf\Ky# = Kopf\Ky# - Kopf\Speed# Case Runter Kopf\Ky# = Kopf\Ky# + Kopf\Speed# Case Rechts Kopf\Kx# = Kopf\Kx# + Kopf\Speed# Case Links Kopf\Kx# = Kopf\Kx# - Kopf\Speed# End Select If KeyHit(200) And Richtung <> Runter Then Richtung = Hoch ;Hoch Steuern If KeyHit(208) And Richtung <> Hoch Then Richtung = Runter ;Runter Steuern If KeyHit(203) And Richtung <> Rechts Then Richtung = Links ;Links Steuern If KeyHit(205) And Richtung <> Links Then Richtung = Rechts ;Rechts Steuern If Kopf\Kx# >= GraphicsWidth() Then GameOver() If Kopf\Kx# <= 0 Then GameOver() If Kopf\Ky# >= GraphicsHeight() Then GameOver() If Kopf\Ky# <= 0 Then GameOver() End Function Mit dieser Funktion wird die Schlange gesteuert und bewegt (bzw um genau zu sein nur der Kopf). Code: [AUSKLAPPEN] Function SchwanzErstellen()
Teil.TSchwanz = New TSchwanz Teil\Sx# = Kopf\Kx# Teil\Sy# = Kopf\Ky# Delete First TSchwanz End Function Mit der Funktion wird auch der Schwanz bewegt... Indem ein neues Teil weiter vorne erstellt wird und das letzte gelöscht wird. Die GameOver Funktion lasse ich weg weil sie irrelevant ist für das Problem. reihenfolge in der Hauptschleife: Zitat: SteuerungSchlange()
SchwanzErstellen() AllesZeichnen() Hoffe so ists besser, tut mir leid. Lg, M0rgenstern |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, fehlt noch irgendwas?
Oder findet niemand den Fehler? Ich hoffe mir kann doch noch jemand helfen. Lg, M0rgenstern |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Niemand hat Lust sich alles zusammenzukopieren... | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Öhm, Der eine sagt, ich soll nicht den ganzen Code senden. Dann schreib ich jede Funktion einzeln hin, dann sagt ein anderer keiner will alles zusammenkopieren.
Wie soll ich es denn bitte richtig machen? Ich würds ja gern so machen wies richtig ist Lg, m0rgenstern |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zeig den ganzen Code in einer Codebox. | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] AppTitle "Snake"
Graphics 800,600,32,2 SetBuffer BackBuffer() ClsColor 100,180,120 Cls Global FTimer = CreateTimer(50) ;Schablone für Teile Type TSchwanz Field Sx# Field Sy# End Type Type TKopf Field Kx# Field Ky# Field Speed# End Type Const Hoch = 1 Const Runter = 2 Const Links = 3 Const Rechts = 4 Global Richtung = Rechts Global Kopf.TKopf = New TKopf Kopf\Kx# = GraphicsWidth()/2 Kopf\Ky# = GraphicsHeight()/2 Kopf\Speed# = 2 For i=0 To 4 ;Vier Körperteile zu beginn Teil.TSchwanz = New TSchwanz Teil\Sx# = Kopf\Kx# + 4 - i;Damit die Schlange nach Westen gerichtet ist Teil\Sy# = Kopf\Ky# Next Repeat WaitTimer FTimer Cls SteuerungSchlange() SchwanzErstellen() AllesZeichnen() Flip 0 Until KeyDown(1) Function AllesZeichnen() ;Der Kopf Color 255,255,255 For Teil.TSchwanz = Each TSchwanz Select Richtung Case Hoch Oval Teil\Sx#, Teil\Sy#, 10, 13, 0 Case Runter Oval Teil\Sx#, Teil\Sy#, 10, 13, 0 Case Links Oval Teil\Sx#, Teil\Sy#, 13, 10, 0 Case Rechts Oval Teil\Sx#, Teil\Sy#, 13, 10, 0 End Select Next Select Richtung Case Hoch Oval Kopf\Kx#, Kopf\Ky#, 10, 13, 1 Case Runter Oval Kopf\Kx#, Kopf\Ky#, 10, 13, 1 Case Links Oval Kopf\Kx#, Kopf\Ky#, 13, 10, 1 Case Rechts Oval Kopf\Kx#, Kopf\Ky#, 13, 10, 1 End Select End Function Function SteuerungSchlange() Select Richtung ;Die Richtung bestimmen Case Hoch Kopf\Ky# = Kopf\Ky# - Kopf\Speed# Case Runter Kopf\Ky# = Kopf\Ky# + Kopf\Speed# Case Rechts Kopf\Kx# = Kopf\Kx# + Kopf\Speed# Case Links Kopf\Kx# = Kopf\Kx# - Kopf\Speed# End Select If KeyHit(200) And Richtung <> Runter Then Richtung = Hoch ;Hoch Steuern If KeyHit(208) And Richtung <> Hoch Then Richtung = Runter ;Runter Steuern If KeyHit(203) And Richtung <> Rechts Then Richtung = Links ;Links Steuern If KeyHit(205) And Richtung <> Links Then Richtung = Rechts ;Rechts Steuern If Kopf\Kx# >= GraphicsWidth() Then GameOver() If Kopf\Kx# <= 0 Then GameOver() If Kopf\Ky# >= GraphicsHeight() Then GameOver() If Kopf\Ky# <= 0 Then GameOver() End Function Function SchwanzErstellen() Teil.TSchwanz = New TSchwanz Teil\Sx# = Kopf\Kx# Teil\Sy# = Kopf\Ky# Delete First TSchwanz End Function Function GameOver() ClsColor 0, 0, 0 Cls Color 255, 0, 0 Text GraphicsWidth()/2, GraphicsHeight()/2, "VERLOREN!", 1 End Function FreeTimer FTimer End So, das ist der ganze Code. Ich dachte, es sei falsch alles zu schicken, weil es so oft heißt "Wir werden uns nicht aus dem ganzen Code das Problem raussuchen" Lg, M0rgenstern. sorry nochmal |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, also, ist das jetzt besser so?
Oder immernoch was falsch dran? Ich hoff wirklich ich habs richtig gemacht... Lg, M0rgenstern |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du solltest dein Konzept überdenken... Du erstellst nämlich in jedem Frame ein Schwanzteil an der Position des Kopfes, löscht dafür das hinterste. Logischerweise sind so die Schwanzteile immer nur so weit von einaner entfernt, wie sich der Kopf pro Frame bewegt (= Geschwindigkeit). Dh, die Schlange wird gestreckt, wenn du schneller Fährst.
Eine Möglichkeit, dies zu verhindern, wäre, den Verlauf des Kopfes zu speichern (so, wie du es bereits jetzt tust, nämlich immer die aktuelle Position in ein Type zu schieben), aber nicht an jeder Position ein Schwanzteil zu zeichnen, sondern nur dort, wo der Abstand zum vorderen Teil halt eben so gross ist, wie er sein sollte. Ich hoffe, ich kann den Post noch absenden, bevor ein Mod den Thread sperrt. Doppelposts sind nämlich wahnsinnig ungern gesehen und du hast dir gleich zwei Päckchen davon geleistet... mfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, also das mitn Code hast richtig gemacht, das mitn posten hier im Forum nicht: Keine Doppelposts bitte.
Hab mir deinen Code angeschaut bzw. getestet (Ist ja zum Glück lauffähig) Kenne das Vorbild-Tutorial nicht aber die Ursache liegt beim Schwanz erstellen. Du erstellst jedes Frame (Also nachdem sich die Schlange um Speed bewegt hat) einen neuen Schwanzteil. Entweder Speed gleichsetzen mit der Schwanzgröße oder die Sache überhaupt anders angehen und alle Schwnaztiele einzeln steuern. EDIT: Lol, jetzt war Holzchopf schneller ![]() |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
https://www.blitzforum.de/foru...ight=snake
Das ist das Vorbild Tutorial. Sorry wegen den doppelposts werd ich ändern. Verdammt. Naja, in dem Programm, bei dem ich davor geholfen habe, war das auch so, ich kann mal den Code kurz Posten: Code: [AUSKLAPPEN] AppTitle "Snake"
Graphics 600,400,16,2 SetBuffer BackBuffer() ClsColor 255,255,255 Cls timer = CreateTimer(50) Global x = 5 Global y = 195 Global richtung$ = "r" Global punkte = 0 Global geschwindigkeit = 5 Global startzeit# = MilliSecs() Global futter = 0 Global gefressen = 0 ;Schablone für Teile Type TTeil Field x Field y End Type For i=0 To 4 ;Vier Körperteile zu beginn Teil.TTeil = New TTeil Teil\x = x + 4 - i ;Damit die Schlange nach Westen gerichtet ist Teil\y = y Next Repeat WaitTimer(timer) Cls ;Zufallskoordinaten des Futters If futter = 0 Then futter_x = Rand (0,580) futter_y = Rand (0,380) futter = 1 EndIf ;"Fahren" mit der Schlange Select richtung$ Case "r" x = x + geschwindigkeit Case "l" x = x - geschwindigkeit Case "o" y = y - geschwindigkeit Case "u" y = y + geschwindigkeit End Select ;Testen ob Schlange auf Futter trifft If RectsOverlap (x,y,10,10,futter_x,futter_y,25,25) Then futter() EndIf Teil.TTeil = New TTeil ;Instanz erstellen Teil\x = x ;Position des Kopfes Teil\y = y If gefressen = 0 Then Delete First TTeil EndIf gefressen = 0 ;rechts If KeyHit (205) And richtung$ <> "l" Then richtung$ = "r" ;links ElseIf KeyHit (203) And richtung$ <> "r" Then richtung$ = "l" ;oben ElseIf KeyHit (200) And richtung$ <> "u" Then richtung$ = "o" ;unten ElseIf KeyHit (208) And richtung$ <> "o" Then richtung$ = "u" EndIf If x > 594 Or x < 0 Or y > 394 Or y < 0 Then verloren() EndIf ;Zeichnen des Futters Color 255,0,0 Rect futter_x, futter_y,25,25,1 ;Alle Körperteile durchgehen For Teil.TTeil = Each TTeil Color 0,0,255 Rect Teil\x,Teil\y,10,10,1 If Teil\x = x And Teil\y = y And (Teil <> Last TTeil) Then verloren() Next ;Zeichnen der Schlange Color 0,0,255 Rect x,y,10,10,1 Flip 0 Until KeyDown(1) Function verloren() Cls Color 0,0,0 Locate 200,100 Print "Verloren !" Locate 200,150 Print "Punktestand: " +punkte + " Punkte" zeit# = MilliSecs() / 1000 - startzeit# / 1000 Locate 200,200 Print "Zeit: " +zeit# + " Sekunden" FlushKeys WaitKey End End Function Function futter() punkte = punkte + 10 futter = 0 gefressen = 1 Return punkte Return futter Return gefressen End Function FlushKeys WaitKey FreeTimer timer End Und wenn ich das so vergleiche ist das vom Prinzip her das gleiche, deshalb versteh ich das ganze nicht. @ Eingeproggt wenn ich den Speed gleichsetzte mit der Schwanzgröße (ich schätze du meinst die Anzahl der Teile), dann ist es immernoch zu sehr verschoben. Lg, M0rgenstern. Danke für Eure Antworten, ich hab jetzt wenigstens ne Richtung. Edit: Verdammt, wollte die Doppelposts in die anderen Posts einfügen und löschen, geht ja aber nicht. Sorry. |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich meinte die Größe die du beim zeichnen (Oval) angibst, also 10.
Und bei deinem "neuen" (Naja, eig alten^^) Code seh ich n Problem: Code: [AUSKLAPPEN] Function futter()
punkte = punkte + 10 futter = 0 gefressen = 1 Return punkte Return futter Return gefressen End Function Eine Function kann nur einen Wert zurückgeben, danach wird sie verlassen. Sprich diese Funktion gibt nur die punkte zurück. Was aber ohnehin unsinnig ist, da diese Variablen gobal sind. Genauer hab ichs mir noch nicht angesehen. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich kann dir sagen, dass sie alle zurückgibt.
Die Punkte funktionieren und die anderen beiden Variablen auch. Ansonsten sähe das ganze ein wenig anders aus. Die Punkte werden hochgezählt und neues Essen wird erstellt und die Schlange wird auch länger. Öhm, dann muss ich das anders lösen, weil ich die Geschwindigkeit nicht auf 10 setzen will. Lg, M0rgenstern |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es wird nicht zurückgegeben aber trotzdem verändert, da die Variablen global sind. | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, stimmt auch wieder.
Aber ich sitzt hier jetzt schon wirklich dauernd vor dem Code und seh den prinzipiellen Unterschied nicht. Die Teile haben in etwa die selbe Größe. Und wenn ich Speed auf 5 stelle dann bringt das auch nicht viel mehr. Bin ich wirklich so blind, dass ich den Unterschied nicht finde? Lg, m0rgenstern |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab mir das Tut mal angesehen und dort is der Ansatz dass das Spiel auf einer Art "Tilemap" abläuft. Naja, nicht ganz, aber es wird gerastert. Die Bewegung ist in 1er-Schritten und alles wird "10-fach vergrößert" gezeihcnet. Weiß nicht wie ich es besser erklären soll aber schau dir das noch mal genau an, beim Zeichnen steht da:
Code: [AUSKLAPPEN] Teil\x*10,Teil\y*10
Es ist also etwas klein wenig anderes als du versuchst, aber ich würd dir vorschlagen dass du das zuerst durcharbeitest und versuchst zu verstehen. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Den Teil von dem Tut konnt ich ehrlich gesagt wirklich nicht nachvollziehen.
Aber das ist ja auch irgendwo unmöglich das so zu schreiben. Überlegen wir mal, ich hab eine Auflösung von 800*600. wenn die Teile also bei 400/300 sind, und ich rechne das mal 10, dann bin ich doch bei 800/600... Oder hab ich nen Denkfehler drin? Lg, M0rgenstern |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Denkfehler ist, dass du bei 800*600 und einer Rastergröße von 10*10 nur noch 80*60 Felder hast. Die Mitte wäre dann 40/30.
Ist in dem Tut so (bzw so ähnlich, dort ist halt ein kleineres Feld, ändert nix am Prinzip) und wie gesagt, du solltest das zuerst verstehen. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, aber das hat doch tortzdem nichts mit den beiden Programmen zu tun.
Ich verwende es bei dem ersten ja auch nicht und da klappts. Da liegt ja mein Problem. Warum gehts bei dem einen, bei dem anderen aber nicht? Lg, M0rgenstern (Keine Sorge ich werde mir das im Tut trotzdem nochmal ansehen) Edit: Das Tutorial hab ich jetzt verstanden. Aber da "muss" man dann mit dem Raster arbeiten, wenn mans so macht. Also da darf die Schlange im Grunde immer nur ein Rasterpunkt weiter bewegt werden. Dann dürfte sich die Geschwindigkeit der Schlange aber niemals ändern, weil sie sonst irgendwann aussehen würde als würde sie "springen". Und das kann ich ehrlich gesagt nicht gebrauchen... Außerdem, bei dem ersten hab ichs ja auch ohne Raster gemacht. Lg, M0rgenstern Edit2: Jetzt mal wirklich sau blöd gefragt, aber das ist der einzige Unterschied der mir jettz so wirklich auffällt: Kann es sein, dass das Problem daher kommt, dass ich in dem neuen Code auch nen Type für den Kopf benutze oder dass ich alles in Funktionen verpacke? Ich kann es mri eigentlich kaum vorstellen, aber nur mal so ne Idee... Lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group