problem mit keyhit

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

feuerball11

Betreff: problem mit keyhit

BeitragMo, Apr 06, 2009 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
(solangsam habe ich die probleme sat...)
also in dem code (steht am schluss) habe ich folgendes problem.
bei der ersten durchlauf der schleife funktioniert sie wie sie soll.
beim zweiten durchlauf nicht...
nun zur erklärung:

ich habe ein fahrzug was auf den globalen variabeln x und y gezeichnet wird.
dan habe ich ein paar objecte in den types ballen.
die ballen haben ein field namens hold. das sollte sagen ob das object am fahrzeug hängt oder nicht.
wen die leertaste (57) gedrückt wird und sich das fahrzeug über ein object befindet soll das object aufgenommen werden.
wen ein object aufgenommen ist, und man die lertaste wieder bestätigt, wird es fallen gelassen.
beim ersten object klappt das prima.
aber beim zweiten object (weiter habe ich noch nicht getestet, weils bei einem schon ärgerlich ist) klappt das überhaupt nicht. es wird nichtmal aufgenommen.

ps: das ganze ist in einer function(falls das wichtig sein sollt)

und nun der code:

Code: [AUSKLAPPEN]
For bal.ballen = Each ballen
   If bal\hold = 1 Then
      bal\x = x+ 30*(Cos(winkel))
      bal\y = y+  30*(Sin(winkel))
      Goto bal2
   EndIf
   If KeyHit(57)
   If ImageRectCollide (bild(winkel/2),x,y,0,bal\x-2,bal\y-5,5,10)  And bal\hold = 0 Then
      bal\x = x+ 30*(Cos(winkel))
      bal\y = y+  30*(Sin(winkel))
      bal\hold = 1
      Goto bal
   EndIf
   EndIf
   .bal2
   If bal\hold = 1 And KeyHit(57) Then
      bal\hold = 0
   EndIf
   .bal
Next

Xeres

Moderator

BeitragMo, Apr 06, 2009 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal auf GoTo verzichten, so lässt sich nichts sauber programmieren...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

feuerball11

BeitragMo, Apr 06, 2009 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
warum??

Xeres

Moderator

BeitragMo, Apr 06, 2009 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wildes herumgehüpfe löst keine Probleme, es erhöht nur die Unordnung im Code. Mache saubere Bedingungen mit If...Then, dann kann dir auch mal einer Helfen.
Siehe Keyhit - du fragt die Leertaste 2x in einer Funktion an verschiedenen Stellen ab.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 06, 2009 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil Goto Spaghetticode verursacht, ganz einfach. Und du überreizt es auch noch dadurch, dass du einfach bestehende Schleifen mittendrin abbrichst. Da kommt nichts gutes bei zustande. Zuerst sollte man also eine gewisse Struktur in sein Programm rein bringen, denn nur so ist gewährleistet, dass man auch nach den ersten 10% Fortschritt auch die nächsten 90% schafft.

Deine Probleme rühren im übrigen daraus, dass der Status aus KeyHit-Abfragen nach dem ersten Abfragen auf 0 gestellt werden. Was ja auch logisch ist, denn sonst könnte so eine Abfrage auch nicht funktionieren.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

feuerball11

BeitragMo, Apr 06, 2009 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm... wie sollte ich es sonst machen??
kann ich keyhit wie eine variable benutzen??
aber
Code: [AUSKLAPPEN]
 if keyhit(57) > 0 then

funktioniert auch nicht... also wie sollte ich es dann machen?? mir fällt da so kongreth nichts ein...

*edit* also das mit dem goto ist eigentlich hauptsächlich eine struktur-frage richtig?
  • Zuletzt bearbeitet von feuerball11 am Mo, Apr 06, 2009 23:25, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 06, 2009 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Tralla=KeyHit(57)

If Tralla Then Blub
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

feuerball11

BeitragMo, Apr 06, 2009 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit dem "tralla" funktioniert.... danke

Nova

BeitragDi, Apr 07, 2009 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
GoTo ist gar nicht mal so schlecht. Allerdings nur für Leute die auch von programmieren sonst eine Ahnung haben. Anfänger sollten die Finger davon lassen, aber auch Profis sollten es nur mit Bedacht benutzen.
Ebenso ist GoTo nur für kleine Programme, bei größeren verliert man auch bei einem GoTo bereits sehr an Übersicht.

Diese ganze Angst vor "Spagetticode" ist meistens unbegründet. Nur absolute Deppen benutzen GoTo so oft, dass halt solcher Code dabei rauskommt. Gegen einmal GoTo ist meistens nichts zu sagen.

Aber meistens geht es auch anders. Z. B. mit Funktionen. Oder auch, falls man eine Schleife verlassen will, mit Exit.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Nicdel

BeitragDi, Apr 07, 2009 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt keine Stelle, an der man auf Goto nicht verzichten kann. Gerade Profis sollten wissen, wie man das verhindern kann.
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

ozzi789

BeitragDi, Apr 07, 2009 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
my 2 cents

Ich löse es meistens so, dass ich eine Variable mit (wichtig!) sinnvollem Name setze, welche dann am Ende der Schleife Abgefragt wird auf 0 gesetzt wird und dann das ausgeführt werden muss was du sagst.

Ich weiss Funktionen sind besser aber ich habe es mir halt so angewöhnt, und sehe nicht wieso ich es ändern sollt (es gibt ausnahmen wo ich Funktionen nehme)


Goto wird jedes Projekt grösser als 2 KB verhunzen Sad
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Nova

BeitragMi, Apr 08, 2009 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Goto wird jedes Projekt grösser als 2 KB verhunzen Sad
Wie gesagt, wenn man zu blöd ist oder es einfach falsch macht, dann ja. Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

ozzi789

BeitragMi, Apr 08, 2009 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Egal ob richtig oder falsch, Goto ist der Teufel in Person >:0
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

feuerball11

BeitragMi, Apr 08, 2009 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
wohl eher der teufel in befehl.........

ozzi789

BeitragMi, Apr 08, 2009 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
du lenkst nur von der Tatsache ab Wink
Glaub mir wenn du die Functions begreifst wirst du sie lieben, dass ist das gleiche wie bei den Types ^^
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

feuerball11

BeitragMi, Apr 08, 2009 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
functionen habe ich bereits begriffen.....

Silver_Knee

BeitragMi, Apr 08, 2009 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Goto-Probleme lassen sich mittels Else ganz gut lösen.

Der Grund warum hier alle auf Goto rumhacken ist Rob's BB-Tut indem dir eingeflößt wird Goto zu meiden. Tatsächlich lassen sich viele Probleme auch mittels Funktionen oder zumindest Gosub lösen. Goto wird halt bei großen Programmen sehr unübersichtlich.

Code: [AUSKLAPPEN]
Repeat
Befehl()
Goto Bla
.returnbla
Befehl2
Forever

.Bla
Blubb()
Goto returnbla


lässt sich sehr gut in

Code: [AUSKLAPPEN]
Repeat
Befehl()
Bla()
Befehl2
Forever

Function Bla()
Blubb()
End Function


verwandeln. Das wird auf der niedersten Stufe von PC zwar wieder in das erste Umgewandelt, jedoch sparst du dir so das Merken von 2 Sprungmarken und hast nur 1 Funktion im Kopf an der du sogar ablesen kannst welche Variablen gebraucht werden.

Goto hat tatsächlich trotzdem einen Sinn:

Code: [AUSKLAPPEN]
For x=1 to 100
For y=1 to 100
if Bla(x,y)=true then Goto Raushier
next
next
.Raushier


Hier kommt exit nicht mehr hin. Da ist goto anzuwenden ganz in Ordnung. Ähnlich hast du es auch bei dir verwendet nur geht hier auch ein Else (Spart soweit ich weiß intern auch einen befehl, weil ein "Goto" von IF zu ENDIF wegfällt)

The_Nici

BeitragMi, Apr 08, 2009 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch DarkCorner benutzte Goto in Stranded (1), da es richtig angewendet nicht böse ist. Er hat z.B. Labels wie .menu gemacht, insgesamt 3, was zwar rumgehüpfe verursacht, jedoch bei Gamestates nicht zu schlecht ist.
ozzi's Variante mit den Schaltervarianten umgeht zwar GoTo, ist jedoch nicht immer besser. Am besten baut man seinen Code so auf, dass das Zeugs dort ist wo es hingehört, also ohne Rumgehüpfe.

Tschausens.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group