Problem mit dem kompletten Code (wie sich rausstellte)
Übersicht

Gehe zu Seite Zurück 1, 2, 3, 4, 5 Weiter
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@mpmxyz
Code: [AUSKLAPPEN] Graphics3D 800, 600, 0, 2 SetBuffer BackBuffer() SeedRnd MilliSecs () Global VSYNC = CreateTimer(60) Global Nummer = 0 Type TSpieler Field ID Field x, y End Type Global Spieler.TSpieler ; Hauptschleife Repeat Cls WaitTimer (VSYNC) ; Neuen Spieler erstellen mit Leertaste If KeyHit(57) Nummer = Nummer + 1 Create_Spieler(Nummer, Rand(50, 750), Rand(50, 550)) EndIf Update_Spieler() Spieler_Dead() Flip Until KeyHit(1) End Function Create_Spieler(Nummer, x, y) Spieler.TSpieler = New TSpieler Spieler\ID = CreateImage (32, 32) Spieler\x = x Spieler\y = y Color Rand(1,255), Rand(1,255), Rand(1,255) Rect x, y, 32, 32, 1 GrabImage Spieler\ID, x, y End Function Function Update_Spieler() For Spieler.TSpieler = Each TSpieler DrawImage Spieler\ID, Spieler\x, Spieler\y, 0 Next End Function Function Spieler_Dead() For Spieler.TSpieler = Each TSpieler For Spieler2.TSpieler = Each TSpieler If Spieler <> Spieler2 If ImagesOverlap (Spieler\ID, Spieler\x, Spieler\y, Spieler2\ID, Spieler2\x, Spieler2\y) Delete Spieler Delete Spieler2 Exit EndIf EndIf Next Next End Function Ich war so nett, also hier ein Beispiel! Wem die Coordinaten zu weit auseinanderliegen für den Test, der kann den Bereich in der Create_Spieler ändern... aber nur in der Hauptschleife lg. Jamagin ![]() NB: Ich hoffe das es verständlich ist, natürlich in einem Spiel nimmt man Grafiken aber für ein Beispiel reicht es vollkommen! |
||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
*edit* 3 Minuten zu spät*
Ich würde einfach das Exit raus lassen, was soll das bringen, außer eben dass die anderen Einträge missachtet werden? Andernfalls könnte man ein zusätzliches Field in das Type "TSpieler" einfügen (Field loeschen), falls man in dem Schleifendurchlauf noch etwas mit dem Objekt machen möchte nach der Feststellung, dass es gerlöscht werden soll (z.b. eine gewisse Zeit später löschen). BlitzBasic: [AUSKLAPPEN] Function SpielerDead() *edit2* Mein Gott wozu das Exit verdammt nochmal Jamagin???!!!! |
||
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@NightPhönix
Wozu eine Schleife zu Ende prüfen wenn es nix mehr zum prüfen gibt. Also Exit ist berechtigt!! lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@jamagin
wenn es in der Schleife nur etwas zu prüfen gäbe, wäre das EXIT vertretbar. Schließlich ist anzunehmen, dass pro Durchlauf nur 1 Gegner getötet wurde. Nach 1/60-sec gäbe es dann ja eh die nächste Gelegenheit auch andere Gegner zu entfernen. Aber in der Schleife von Chrissa befinden sich auch Bewegungs- und Zeichenroutinen für alle Elemente die in der Typ-Auflistung hinter dem sterbenden noch drankommen. Die würden bei einem EXIT in dieser 1/60-sec nicht weiterbewegt und gezeichnet. Das könnte ruckeln. Nach 1/60-sec wäre natürlich auch das ausgestanden, kommt doch dann die nächste Gelegenheit alle wieder zu bewegen. @alle Letzendlich ist es eine Philosophie-Frage, weil es auf beide Arten zu keinen schwerwiegenden Fehlern kommt. Chrissa jedenfalls wird die Diskussion in seinem Thread nicht helfen! Was Chrissa wirklich will, ist das ein Gegner mit Energie 0 nicht gleich verschwindet, sondern noch einen schönen Tot stirbt. Da wäre die Lösung mit einem Gegner1\Loeschen% nicht schlecht, die vorhin einer (EDIT: ah! es war NighPoenix) vorgeschlagen hat. Dann kam man diesen Gegner für einige Sekunden "sonderbehandeln". |
||
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Midimaster
Nun, wenn die Bewegungsroutine auch in einer eigenen Funktion stünde wäre es kein Problem oder? Andernfalls kommt eben das Sterben des Spielers nach der Bewegung dran mit If then else... Und ja, man kann ja zusätzlich einen Sterbetimer einbauen, wo man halt ein paar hübsche I AM DEAD Animationen ablaufen lassen kann und danach eben den Spielertype löscht und mit Exit die Schleife verlässt. Dazu braucht man nicht wirklich eine zusätzliche Löschvariable... Ist ja alles keine große Hexerei!! Das Exit zwingt ja keinem es zu verwenden, es kommt eh immer drauf an wie man programmiert. Ich habe alles strikt getrennt und daher sauberen Code. Werde mich wieder zurückziehen, sonst landen meine Beiträge im Trash...! So long... lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
so jetzt sag ich auch mal wieder was ![]() @midimaster Hab dein Beispiel mal mit dem shuttle fire getestet. Jetzt wird es nicht mehr gezeichnet. Warum weiß ich auch(hab ein Probelm gefunden *stolz* ![]() Oder hab ich da jetzt nen Denkfehler drin?? Auf jeden Fall hier die zwei betroffenen Funktionen: BlitzBasic: [AUSKLAPPEN] ;Funtkion Spielerbewegung BlitzBasic: [AUSKLAPPEN] ;Funktion Screen malen Die anderen Varianten test ich jetzt dann aus ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst sie natürlich gerne GLOBAL setzen, denn das ist sie ja auch! Du brauchst sie schließlich an mehreren Stellen: Also GLOBAL. (Es geht auch anders, aber das würde dir jetzt nicht viel bringen....
Außerdem fehlen die Schüsse noch in der Draw() |
||
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, aber wenn ich die Variable Global setzen will, kann ich das nicht in der Funktion (Error: Global can only appaer in Main Programm). Setze ich sie in der amin hat das nichts mehr mit dem Punkt zu tun, an dem ich Key 200 gedrückt habe... oder wie meinst soll ich das machen? | ||
![]() |
DaysShadow |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst globale Variablen außerhalb jeglicher Funktionen, Schleifen etc. definieren.
Wenn du eine Variable in zwei Funktionen brauchst wird es schon Sinn machen sie global zu setzen, denn in deiner Funktion move() erstellst du sie als lokale Variable und gibst ihr einen Wert und bei draw() fragst du sie ab, das geht halt nicht, da lokale Variablen nur innerhalb der Funktion, Schleife etc. existieren in der sie erstellt werden. Sobald deine Funktion move() zu Ende ist wird die Variable SchuttleFireZeit gelöscht. MfG DaysShadow Edit: Verdammt, da scheint wohl doch mehr anders zu sein als ich dachte ![]() |
||
Blessed is the mind too small for doubt |
- Zuletzt bearbeitet von DaysShadow am Sa, Jan 16, 2010 20:21, insgesamt einmal bearbeitet
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm hab die Variable jetzt mal außerhalb jeglicher Schleifen, Funktionen etc. deklariert. (also: Global ShuttleFireZeit ; ohne Wertzuweisung) allerdings geht es so auch nicht...
@midimaster: Das Zeichnen des Schusses ist nun auch in einer eigenen Funktion. Der Grund dafür ist, dass ich den Schuss ja auch löschen können will, wenn er mit dem Enemy kollidiert... ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zu "lokale Variablen existieren nur in ihren Schleifen":
DaysShadow scheint da etwas mit BlitzMax+Strict/Superstrict / vielen anderen Sprachen verwechselt zu haben. In BlitzBasic gilt jede lokale Variable für die Funktion, in der sie erstellt wurde. Wenn sie in einer Schleife erstellt wurde, existiert sie immer noch außerhalb der Schleife. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@chrissa
Die Variable gehört GLOBAL. das ist schon richtig so. GLOBAL heißt ja nur, dass du sie überall im Code verwenden kannst. Das Schüsse-Zeichnen gehört auch in die Draw(). Alles Zeichnen gehört in die Draw(). Vertrau mir! Das Schüsse-Ändern, -Bewegen, -Losschicken kann ruhig in anderen Funktionen erfolgen. Alle Typen-Elemente sind auch immer GLOBAL, daher kannst du sie überall verwenden und ansprechen. Du schreibst gar nicht, was nicht geht... Bitte genaue Beschreibung. Vielleicht kannst auch mal den Code wieder reinwerfen. Am besten in deinen Beitrag vom 28.12 da stand der Code schon mal, ist ja nun aber überholt . Einfach mit EDIT alten Beitrag öffnen, alten Code raus und neuen Code rein. Und vielleicht noch eine Bemerkung [EDIT 16.01.2010] dazu! noch was zu: Zitat: Das Zeichnen des Schusses ist nun auch in einer eigenen Funktion. Der Grund dafür ist, dass ich den Schuss ja auch löschen können will, wenn er mit dem Enemy kollidiert...
Du glaubst immer noch nicht an den Vergleich mit den Film-Bildern, die ich oben beschrieben habe. Das Schuss Zeichnen hat rein gar nichts damit zu tun, ob du die Schüsse auf Kollision testen willst. In der Logik eines BB-Spiels sind die Schüsse auch dann da, wenn du sie nicht gezeichnet hast. Da ist eine Welt in BB in der die Akteure leben. Und auch kollidieren können auch wenn du sie gar nicht gezeichnet hast., Das Zeichnen ist wie das Fotografieren der Scene mit einer Kamera zu sehen. Und auch ohne dass jemand ein Foto macht, existieren die Akteure und machen ihr Ding! z.b. weiterfliegen, Kollisionen, etc. bis gleich |
||
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
So der Code is im aller ersten Post drinn.
Meine Probleme sind jetzt: 1. Kein ShuttleFire mehr 2. Es spawnen nur noch aliens wobei ich da nichts geändert habe... 3. Der Spieler kann nicht mehr sterben 4. Die alien death animation ist etwas versetzt zum eigentlichen Standort des aliens... @midimaster: du meinst ich soll das kollidieren nicht auf die grafiken basieren, sondern das "kollidieren" der koordinaten der Objekte? alles unabhängig der bilder? Die Bilder zeigen also nur was passiert? |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
hier mal meine Kritik am aktuellen code (wenn ich darf?)
Bei aller Kritik, die gleich kommt...Ein Lob vorneweg. Du hast das mit dem Kollidieren schon ganz gut verstanden. Das ganze basiert tatsächlich nicht auf den gemalten Bildern, sondern virtuell. Aber umgesetzt hast Du es nicht. Es sind immer noch viele Mal-Befehle mitten in Aktionen. Die Aktionen brauchen keine Bilder um zu funktionieren. Wenn du Pech hast, erhältst Du durch sowas sogar "Doppelbilder" eines Objekts. Die Draw() sollte die letzte gerufene Funktion vor dem FLIP sein. Ist aber erst sinnvoll, wenn ALLE DrawImage aus den Aktionen verschwunden sind. WIE FEHLER FINDEN? Nun zeig ich dir mal, wie ich bei der Fehlersuche am Beispiel ShuttleFire vorgehe: Du beobachtest, dass ShuttleFire nicht kommt. Also prüfen wir, ob Key200 überhaupt die ShuttleFireZeit setzt. Ich mach das mit DEBUGLOG und füge zwei Zeilen ein: BlitzBasic: [AUSKLAPPEN] If KeyDown(200)ebugLog "setze " + ShuttleFireZeit EndIf Danach starten und bei Druck auf Key200 wird im Debugger das erwartete Ergebnis angezeigt. Probier es mal! Den gleichen Test mach ich jetzt in der Draw() bei: BlitzBasic: [AUSKLAPPEN] DebugLog "shuttle fire" + ShuttleFireZeit Dieser Test zeigt, dass ShuttleFireZeit immer noch gesetzt ist, aber nicht in die IF gesprungen wird. Der Fehler muss in der If-Zeile sein. Na? Siehst Du ihn? SchuttleFireZeit UFO-Spawn Die Fehlersuche ist die gleiche wie beim ShuttleFire. Du fügst je zwei DEBUGLOG bei der Geburt und bei dem Zeichnen der Ufos ein: BlitzBasic: [AUSKLAPPEN] Function UfoSpawn() BlitzBasic: [AUSKLAPPEN] DebugLog "vor ufos malen" Und schon wird klar. Die Ufos laufen perfekt! Der Spieler stirbt nicht mehr? Zitat: If TPlayer\health <=0 Then
DrawImage Gameover,1280/2,1024/2 over=CreateTimer(1000) WaitTimer over End EndIf Die roten Zeilen sind totaler Quatsch. Die 5 Zeilen sind wirklich totaler Quark. Du solltest meine Texte besser lesen. Über das GameOver hab ich schon was geschrieben, aber du solltest es auch umsetzen oder nachfragen. das GameOver-Bild ist auch ein Akteur, also gehört die Zeichenroutine samt IF in die Draw(). Dort wo du sie zeichnest, gibt es gar kein FLIP, um sie zu sehen! Vergiß das mal das mit dem Timer, oder lies es erstmal richtig nach! Hier jedenfalls hat er nichts zu suchen! Nimm beide Timer-Zeilen und das End raus und dann teste mal. Außerdem heisst die Figur Spieler und nicht TSpieler! Wie dann eine Ende ausgelöst wird? Na an der Stelle, wo dem Player die Health abgezogen wird: BlitzBasic: [AUSKLAPPEN] If Player.Health <=0 Then |
||
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also:
es spawnen wieder ufos. Das Problem war, dass die Variable count_en nicht über 100 gegangen ist. warum auch immer, da sie doch eignentlich lokal sein sollte... Das S(c)huttlefire wird wieder gemalt (scheiß Schreibfehler ![]() Aber der Player stirbt immer nocht nicht. Das musst du mir noch einmal erklären... 2 weitere Probleme sind nun: 1. Das Spiel hängt sich auf, wenn man zu wild ballert ![]() 2. Sporadisch kommt die Meldung Object does not exist. Der Debugger markiert da die Zeile: If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,ufo,Enemy2\x,Enemy2\y,0) Then PS: Das kollidieren ohne Bilder muss ich noch machen. Da schau ich mir noch ein paar Tutorials an, wie man Imagescollide ersetzen kann ![]() |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,ufo,Enemy2\x,Enemy2\y,0) Then Kann es sein, dass TSchuss oder Enemy2 schon gelöscht wurden? Kann ich bitte noch mal den ganzen Code haben ![]() |
||
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 |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: PS: Das kollidieren ohne Bilder muss ich noch machen. Da schau ich mir noch ein paar Tutorials an, wie man Imagescollide ersetzen kann Wink
So ganz traust Du mir noch nicht, gell? Du kannst ImageCollide getrost verwenden, ohne die Bilder mit Drawimage() in diesem Block zu zeichnen. Es hat das Eine echt nichts mit dem Anderen zu tun! ImageCollide() malt sich die Bilder selbst in einen eigenen Buffer. Es wird also auch funktionieren, wenn dort kein DrawImage steht! Verwende weiterhin ImageCollide() Den sporadischen Fehler kannst Du mit diesem Trick besser einkreisen. Schreibe vor die Problemzeile Diese beiden DEBUG-Zeilen. Dann wird der DEBUGGER dir das fehlende Objekt verraten: BlitzBasic: [AUSKLAPPEN] .... Noch was fällt mir auf: muss es wirklich Tschuss heißen? |
||
- Zuletzt bearbeitet von Midimaster am Mo, Jan 18, 2010 20:08, insgesamt 2-mal bearbeitet
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Verwende weiterhin ImageCollide()
Das einzige, was dagegend spricht sind gelegentliche MAVs (Errors) auf manchen Computern. Aber Midimaster hat Recht, verwende ImagesCollide ![]() ![]() |
||
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 |
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
@nicdel:
Der neue Code is gepostet (in meinem allerersten Beitrag). Is zwar nich viel anders als der vorherige, aber der Fehler muss ja im neuen sein ![]() @all: also es geht ja immer für ne gewisse zeit. schüsse werden gemalt und das kollidieren funktioniert auch. nur kommt die meldung dann, wenn der gegner auf dem player ist, der gerade schießt. Auch da funktioniert es manchmal und manchmal nicht... @midimaster: so meintest du das^^ ich dachte das ImagesCollide basiert auf den Bildern und nicht mit einem eigenen Buffer ^^ Und ja der Type heißt: BlitzBasic: [AUSKLAPPEN] Type schuss ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
das ist aber verwirrend für andere, die den Code lesen sollen. Das T vorneweg wird immer für die Typbeschreibung verwendet. Siehe Namens-Tutorial https://www.blitzforum.de/foru...050#354014 .
Wenn's nicht zuviel Aufwand macht, schreibs um! BlitzBasic: [AUSKLAPPEN] Type TSchuss Außerdem ist ja recht wenig passiert in dem Code, seit ich das letzte Mal geschrieben habe. Du könntest alle Fehler finden, wenn Du dir meinen letzten Beitrag mehr zu Herzen nimmst. z.b. Raus mit den CREATETIMER() . Hältst du dich aber nicht dran: Zitat: If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,ufo,Enemy2\x,Enemy2\y,0) Then
Enemy2\health=Enemy2\health-TSchuss\strength Delete TSchuss.schuss If Enemy2\health<=0 Then Local timer=CreateTimer(58) Wenn wir dir hier einen Fehler nennen, wäre es schon angebracht, dass du dann den gesamten Code dann nach Fehlern des gleiches Types durchsuchst! |
||
Gehe zu Seite Zurück 1, 2, 3, 4, 5 Weiter
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group