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

Gehe zu Seite Zurück 1, 2, 3, 4, 5 Weiter
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Chrissa
ich kann dir nur raten Analyse und Spielanzeige strikt voneinander zu trennen. Eine Kollison ist eine Anlyse eines Spielmomentes. Die einzige Reaktion sollte sein, ein "Zeichen" zu setzen. z.b. SpielerGetroffen=1, oder zur Not noch Pl\Health=P\Health-100 oder sowas. Ein Delay oder ein END gehören da nicht hinein. Lass doch zunächst das Programm einfach die Kollisons-Routine beenden und reagiere dann in der Main-Schleife auf das Ereignis. Dort könnte man eben so auch "Sterben über mehrere Frames" verwirklichen. Hast Du gelesen, was ich Dir heute Nacht um 0:11 Uhr geschrieben habe? @Tankbuster Auch wenn es nur einen Player gibt, lohnt sich ein Typ dafür. Schließlich hat er ja doch einige Eigenschaften und es liest sich schön. (Natürlich nicht, wenn man ihn immer nur "Pl" nennt. Hier denken ja viele ein wenig verkehrt herum. Eigentlich sollte die Namensgebung so ablaufen: BlitzBasic: [AUSKLAPPEN] Type TPlayer @Chrissa Ich bin ja immer noch dafür, dass Du die Namern noch einmal vernünftig überarbeitest. Ich bin 100% davon überzeugt, das Du TYPES viel besser verstehst, wenn du nicht alle ForEachNext-Types immer Typ\x.. etc nennen würdest. Angenommen der Spieler-Type heißt TPlayer und der Schuss-Typ heißt TSchuss: BlitzBasic: [AUSKLAPPEN] Type TSchuss dann wäre Dein globaler Spieler BlitzBasic: [AUSKLAPPEN] Spieler.TSpieler = New TSpieler und jetzt könntest Du überall z.B. das Spieler-X so ansprechen BlitzBasic: [AUSKLAPPEN] Spieler\X=12
dann sieht man doch immer gleich, was gemeint ist. Das ist sehr wohltuend für die Augen und hilft beim Fehler suchen. Die Waffen-Routine würde dann so aussehen: BlitzBasic: [AUSKLAPPEN] Function waffe() |
||
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
So jetzt ist alles so wie du gemeint hast:
Code: [AUSKLAPPEN] AppTitle "Space Shooter"
Graphics 1280,1024,32,1 SetBuffer BackBuffer() AutoMidHandle(True) ;Globals Global count_en=0 Global count_ufo=0 Global waffe = 1 Type schuss Field x Field y Field s_type Field strength Field speed End Type Type alien Field x Field y Field health End Type Type ufo Field x Field y Field health End Type Type player Field x Field y Field health End Type Global TPlayer.player=New player TPlayer\x=1280/2 TPlayer\y=800 TPlayer\health=1000 ;Images Global space=LoadImage("space.png") Global alien=LoadImage("alien.png") Global shuttle=LoadImage("shuttle.png") Global ufo=LoadImage("ufo.png") Global kugel=LoadImage("schuss_2.png") Global laser=LoadImage("schuss_1.png") Global rocket=LoadImage("schuss_3.png") Global shuttle_fire=LoadImage("rocket fire.png") Global e1_death=LoadAnimImage("alien death anim.png",203,118,0,3) Global e2_death=LoadAnimImage("ufo death anim.png",239,118,0,3) Global gameover=LoadImage("Game Over.png") ;Game .main While Not KeyDown(1) Cls DrawImage space,1280/2,1024/2 DrawImage shuttle,TPlayer\x,TPlayer\y move() AlienSpawn() UfoSpawn() waffe() e1_dies() e2_dies() pl_dies() If TPlayer\health <=0 Then DrawImage Gameover,1280/2,1024/2 WaitKey EndIf Flip Wend End ;Funtkion Spielerbewegung Function move() If KeyDown(203) TPlayer\x=TPlayer\x-8 EndIf If KeyDown(205) TPlayer\x=TPlayer\x+8 EndIf If KeyDown(208) TPlayer\y=TPlayer\y+8 EndIf If KeyDown(200) TPlayer\y=TPlayer\y-8 DrawImage shuttle_fire,TPlayer\x-4,TPlayer\y+55 EndIf If TPlayer\x <= 80 Then TPlayer\x = 80 EndIf If TPlayer\x >= 1220 Then TPlayer\x=1220 EndIf If TPlayer\y <= 80 Then TPlayer\y=80 EndIf If TPlayer\y >= 944 Then TPlayer\y=944 EndIf End Function ;Funktion Alienspawn Function AlienSpawn() count_en = count_en +1 If count_en >=100 Then count_en=0 Enemy1.alien=New alien Enemy1\x=Rnd(20,1260) Enemy1\y=-50 Enemy1\health=100 EndIf For Enemy1.alien = Each alien Enemy1\y=Enemy1\y+5 DrawImage alien,Enemy1\x,Enemy1\y Next End Function ;Funktion Ufospawn Function UfoSpawn() count_ufo = count_ufo +1 If count_ufo >=300 Then count_ufo=0 Enemy2.ufo=New ufo Enemy2\x=Rnd(20,1260) Enemy2\y=-50 Enemy2\health=300 EndIf For Enemy2.ufo = Each ufo Enemy2\y=Enemy2\y+3 DrawImage ufo,Enemy2\x,Enemy2\y Next End Function ;Funktion Select Weapon und schießen Function waffe() If KeyHit(56) Then waffe=waffe+1 If waffe=4 Then waffe=1 Select waffe Case 1 If KeyHit(57) Then TSchuss.schuss = New schuss TSchuss\x=TPlayer\x-10 TSchuss\y=TPlayer\y+20 TSchuss\s_type= kugel TSchuss\speed = 10 TSchuss\strength = 10 DrawImage kugel,TSchuss\x,TSchuss\y-40 EndIf Case 2 If KeyHit(57) Then TSchuss.schuss = New schuss TSchuss\x=TPlayer\x-10 TSchuss\y=TPlayer\y+20 TSchuss\speed = 20 TSchuss\s_type= laser TSchuss\strength=50 DrawImage rocket,TSchuss\x,TSchuss\y-40 EndIf Case 3 If KeyHit(57) TSchuss.schuss = New schuss TSchuss\x=TPlayer\x-10 TSchuss\y=TPlayer\y+20 TSchuss\s_type= rocket TSchuss\speed=6 TSchuss\strength=100 DrawImage rocket,TSchuss\x,TSchuss\y-40 EndIf End Select For TSchuss.schuss = Each schuss TSchuss\y=TSchuss\y-TSchuss\speed DrawImage TSchuss\s_type,TSchuss\x,TSchuss\y-40 Next End Function ;Funktion Alien Dies Function e1_dies() For TSchuss.schuss=Each schuss For Enemy1.alien=Each alien If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,alien,Enemy1\x,Enemy1\y,0) Then Enemy1\health=Enemy1\health-TSchuss\strength TSchuss\x=-100000 If Enemy1\health <= 0 Then Local Timer=CreateTimer(58) Local Frame1Count Local Frame1Wait Local MS MS=MilliSecs() If MS>Frame1Wait Then Frame1Count=(Frame1Count+1) Mod 4 Frame1Wait=MS+500 DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count EndIf Enemy1\x=-1000000 Enemy1\health=0 EndIf EndIf Next Next End Function ;Funktion Ufo Dies Function e2_dies() For TSchuss.schuss=Each schuss For Enemy2.ufo=Each ufo If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,ufo,Enemy2\x,Enemy2\y,0) Then Enemy2\health=Enemy2\health-TSchuss\strength TSchuss\x=-10000 If Enemy2\health <=0 Then Local timer=CreateTimer(58) Local Trame2Count Local Frame2Wait MS=MilliSecs() If MS>Frame1Wait Then Frame2Count=(Frame2Count+1) Mod 4 Frame2Wait=MS+500 EndIf DrawImage e2_death,Enemy2\x,Enemy2\y,Frame1Count WaitTimer timer Enemy2\health=0 Enemy2\x=-100000 EndIf EndIf Next Next End Function ;Funktion Player Dies Function pl_dies() For Enemy1.alien=Each alien If ImagesCollide(shuttle,TPlayer\x,TPlayer\y,0,alien,Enemy1\x,Enemy1\y,0) Then TPlayer\health=TPlayer\health-50 EndIf Next For Enemy2.ufo=Each ufo If ImagesCollide(shuttle,TPlayer\x,TPlayer\y,0,ufo,Enemy2\x,Enemy2\y,0) Then TPlayer\health=TPlayer\health-100 EndIf Next End Function Nun funktionieren auch die death Animationen einigermaßen nur etwas zu schnell... Das zweite Problem: Nach einer gewissen Zahl von "getöteten" Gegner zeigt das Spiel keine Rückmeldung... Liegt das vielleicht an den vielen ImagesCollide? Wenn ja wie und wodurch muss ich diese ersetzen? PS: Wie machst du deine Codes im Forum immer so schön bunt? Das Gäbe euch noch einen besseren Überblick^^ |
||
- Zuletzt bearbeitet von Chrissa am Do, Dez 31, 2009 11:48, insgesamt einmal bearbeitet
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mir den Code noch nicht so genau angeschaut, aber löschst du die Gegner auch mit Delete![]() |
||
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 ![]() |
---|---|---|
Nein. Da habe ich dann immer das Problem, dass dann nachdem man einen Gegner "getötet" hat, die Meldung kommt "Object does not exist". Das liegt daran, dass der ganze Type dann gelöscht wird... Deshalb "beame" ich sie aus dem Spielfeld.
Zu Beginn hat das Spiel nur angefangen zu laggen und seit heute "hängt" es sich auf ... |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann solltest du dir eine Möglichkeit überlegen die Types etwas später zu löschen... | ||
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 |
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
eine variable auf 1 setzen.
Am ende der for schleife schauen, ob die auf 1 steht und dann delete machen, sonst versucht er noch was aus dem type zu lesen, jedoch ist es eben gelöscht. Am ende der schleife kann das nicht passieren... |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Tempo des Sterbens änderst Du mit dem Frame1Wait=MS+500. Die 500 sind 500msec, also eine halbe Sekunde. Höhere Werte und deine Figuren "leben " länger.
Das Hervorheben des Textes hier im Forum ist ganz leicht. Du nimmst immer den [Code]-Tag, um Code freizustellen. Wir nehmen immer den [BB]-Tag. Alles andere geht automatsich. Außerdem mal ein Riesenlob an Chrissa: Der Code sieht jetzt sowas von professionell aus!!! Behalte Dir diesen Stil bei! ![]() Veränderungen und Erweiterungen werde jetzt leichter möglich sein als vorher. |
||
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab ich jetzt mal probiert. Aufhängen tut es sich immer noch... Außerdem werden dann alle anderen aliens, die "gespawnt" sind ebenfalls gelöscht... Das gleich bei den Ufos... | ||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
bitte neuesten code!!!
und ich bleib dabei: bei der Kollision sollten keine Sterbeszenen erfolgen. Das muss, wenn überhaupt dort, nach dem ForNext-Schleifen sein. Merk Dir bei der Kollision irgendwie, dass eine Kollision stattgefunden hat und greife später auf diese Information zu. schau mal, was ich dir heute nacht 22:54 noch geschrieben hatte. ich werfe dann gleich mal einen Blick auf deinen code, hätte aber weiterhin gerne, dass alles "Zeichnen auf den Bildschirm" in eine eigene Routine kommt: Function MaleScreen - Hintergrund zeichnen - alle Alien zeichnen - Ufos zeichnen - Spieler zeichnen End Function Auf die DRAWIMAGE in den Geburts- und Sterbe-Momenten kannst Du dann 100% verzichten. Probiers! |
||
![]() |
Chrissa |
![]() Antworten mit Zitat ![]() |
---|---|---|
sry dass ich so lange nich da war. aber ich hatte einfach nich mehr die Lust gehabt weiter zu machen ![]() Aber jetzt bin ich ja wieder da und ich kann eure Hilfe iummer noch gut gebrauchen ![]() ich hab jetzt deinen Rat befolgt Midimaster. Es gibt jetzt die Funktion Draw. Nur weiß ich nicht ganz was mir das dann bringen soll. is ja immer noch das selbe... BlitzBasic: [AUSKLAPPEN] ;Funktion Screen malen So richtig? |
||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du solltest lieber nicht dein Typ "alien" und dem Bild "alien" gleiche Namen geben!
Zeichne die Bilder innerhalb des Types selbst, oder bleibt es für alle Typeinträge bei dem einen Bild eine feste Variable. Also entweder innerhalb des Types: BlitzBasic: [AUSKLAPPEN] Alienbild=LoadImage(...) oder eben ohne ein Typ-Field extra für das Bild. BlitzBasic: [AUSKLAPPEN] Alienbild=LoadImage(...) |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, was bringt es, wenn ich Malen und Aktionen voneinander trenne?
Zunächst verstehst Du mehr den Ablauf von Computerspielen. Die Dinge, die du da gerade trennst sind nur logisch getrennt, nicht aber zeitlich. Das heißt alles passiert weiterhin in einer 1/60 sec : Geburten - Leben - Veränderungen - Bewegungen - Schüsse -Sterben - alles in der selben 1/60-sec. Alle die beteiligt sind nennen wir mal Akteure. Und am Ende kommt die große Zeichenroutine Draw(), die die neue Situation auf den Bildschirm bringt. Bis dahin sieht der User den alten Zustand von vor einer 1/60-sec. Von den Veränderungen in den Action-Routinen bekommt er zunächst nichts mit und plötzlich ist der neue Zustand (von allen Akteuren) da. Aber in diese Zeichenroutine gehört alle hinein. Wo sind die Schüsse? Auch sie wollen gezeichnet werden! Ja, auch Schüsse leben! Filmtechnisch gesehen sind sie Akteure wie die Aliens. Streng genommen shuttle_fire auch! Und DeinGameOver ist auch nur eines der Akteure in dem Spiel. Es ist wie ein Film. Der läuft und läuft und wenn sich nichts ändert siehtst Du immer das selbe Bild. Aber jede 1/60-sec neu. Wenn Du das verstanden hast, kannst Du nun anfangen, Dinge geschehen zu lassen und Ihnen einen zeitlichen Rahmen vorgeben. Die Technik ist dabei immer die gleiche: Ein Akteuer kann von der Draw() nicht gezeichnet werden weil seine Zeitvariabe Null ist. Beispiel ShuttleFire: BlitzBasic: [AUSKLAPPEN] If ShuttleFireZeit > MilliSecs() Thenkein Zeichnen, weil ja ShuttleFireZeit leider 0 ist. Eine Aktion setzt nun diese Zeitvariable auf Millisecs() +300. Und schon lebt der Akteuer für 0.3 sec in der Draw()-Routine. BlitzBasic: [AUSKLAPPEN] If KeyDown(200) Drückst Du nun dauerhaft Key200 wird ShuttleFireZeit immer wieder auf Millisecs()+300 erhöht und das Zeichnen hört nicht auf. Lässt du nun Key200 los, brennt das ShuttleFire 300msec nach. z.B Die Geburt neuer Gegner. Regle sie durch einen Timer. Du schreibst: Zitat: Function AlienSpawn()
count_en = count_en +1 If count_en >=100 Then count_en=0 Enemy1.alien=New alien ... besser wäre aber: BlitzBasic: [AUSKLAPPEN] Function AlienSpawn() Ebenso kannst Du das GameOver zum Leben erwecken: du schreibst: Zitat: If TPlayer\health <=0 Then
DrawImage Gameover,1280/2,1024/2 WaitKey EndIf besser so 2-teilig: in der PlayerDies: BlitzBasic: [AUSKLAPPEN] If TPlayer\health <=0 Then und in der Zeichenroutine Draw(): BlitzBasic: [AUSKLAPPEN] If GameOverZeit > MilliSecs() Then du schreibst: Zitat: If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,alien,Enemy1\x,Enemy1\y,0) Then
.... If Enemy1\health <= 0 Then Local Timer=CreateTimer(58) Local Frame1Count Local Frame1Wait Local MS MS=MilliSecs() If MS>Frame1Wait Then Frame1Count=(Frame1Count+1) Mod 4 Frame1Wait=MS+500 DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count EndIf besser so: BlitzBasic: [AUSKLAPPEN] If Enemy1\health <= 0 Then und in der Draw() BlitzBasic: [AUSKLAPPEN] For Enemy1.alien = Each alien Jetzt zu den SystemTimern: Zitat: Local Timer=CreateTimer(58)
Da hast du was total falsch verstanden. Diesen Timer setzt du ein, damit das Spiel auf jedem Rechner immer gleich schnell läuft und wenig Systemperformance verbraucht. Fürs erste lässt du ihn weg und erreichtst eine Gleichmäßgikeit auch durch ein FLIP 1 wo jetzt in der Hauptschleife ein FLIP steht. Jetzt noch was zu dem "Object does not exist" In einer Schleife FOR/EACH/NEXT rufst du alle Enemys auf: BlitzBasic: [AUSKLAPPEN] For Enemy1.alien=Each alien Die Variable Enemy1 steht während dieser Zeit immer für den einen Enemy, der gerade dran ist. BlitzBasic: [AUSKLAPPEN] For Enemy1.alien=Each alien Wenn Du den mitten in der Schleife mit DELETE entfernst, darfst du ihn natürlich in den Zeilen danach (bis NEXT) nicht mehr verwenden: BlitzBasic: [AUSKLAPPEN] For Enemy1.alien=Each alien |
||
- Zuletzt bearbeitet von Midimaster am So, Jan 17, 2010 0:02, insgesamt einmal bearbeitet
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] For Enemy1.alien = Each alien Enemy1\health = Enemy1\health-TSchuss\strength If Enemy1\health <= 0 Then Delete Enemy1 EXIT ;<<<< Zauberwort Exit else DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count endif Next Ein Exit bewirkt Wunder... lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Exit ist da komplett Falsch.
Wenn man 100 aliens hat, und das erste wird gelöscht, wird der gesamte Rest weder bearbeitet noch gezeichnet. Continue - also zum Kopf der Schleife Springen - bräuchte man; Da das in BB nicht geht, benutzt man halt ein paar Bedingungen. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Xeres!
Okay, in diesem Fall hast du Recht. Dann eben zwei Funktionen - eine fürs Deleten inkl. des Exites und eine für das Neuzeichnen...! Code: [AUSKLAPPEN] Function SpielerDead() For Spieler.TSpieler = Each TSpieler If ImagesOverlap oder ImagesCollide... Delete Spieler Exit endif next End Function Function UpdateSpieler() For Spieler.TSpieler = Each TSpieler Drawimage blabla... Next End Function lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist doch meine Rede: Genau das habe ich ihm geraten und deshalb dieses schreckliche Beispiel hergenommen. Keine Tricks! Das beste ist, er trennt Aktionen und Zeichnen. | ||
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Midimaster
Jep! Genau so ist es und nicht anders!! lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Exit passt aber immernoch nicht ganz. Wenn jetzt der erste Spieler kollidiert, wird der Rest nicht mehr überprüft... | ||
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 |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Nicdel
Welcher Rest?? Die Schleife wird permanent aufgerufen und das Exit veranlasst ja nur die Funktion zu verlassen. Was soll denn nach dem Exit noch geprüft werden?? Da es eine Typeliste ist, betrifft es ja immer den Spieler der die Collision auslöst, also wenn 50 Spieler kollidieren, dann wird das eben 50x geprüft... lg. Jamagin ![]() NB: Soll ich einen Spielcode posten wo ich das so gemacht hab? |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Jamagin
Wenn aber dann zwei Spieler gleichzeitig sterben müssten, stirbt nur einer und die anderen überleben bis zum nächsten Frame. Wenn es dann viele Spieler gibt und entsprechend viele Tote pro Sekunde gibt, kann es im Ernstfall passieren, dass es "unsterbliche" Spieler, die hinten in der Liste sind, gibt. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Gehe zu Seite Zurück 1, 2, 3, 4, 5 Weiter
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group