Space Shooter
Übersicht

![]() |
JulzBetreff: Space Shooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also wusste nicht so ganz wie ich mein Thema nennen sollte also ich hab en problem bei meinem spaceshooter:
Code: [AUSKLAPPEN] APPTITLE "Shooter" graphics 640, 480 setbuffer backbuffer() monster = loadimage("monster.bmp") player = loadimage("player.bmp") rakete = loadimage("schuss.bmp") dim bumm(20,2) hoehe = 200 pos_y = 10 x = 300 y = 300 da = 1 punkte = 0 rechts = 205 links = 203 hoch = 200 runter = 208 repeat cls text 400,10, "Du hast "+punkte+" Punkte if keydown(rechts) then x = x + 4 if keydown(links) then x = x - 4 if keydown(hoch) then y = y - 4 if keydown(runter) then y = y + 4 drawimage player, x, y if x > 600 then x = 600 if x < 0 then x = 0 if y > 440 then y = 440 if y < 0 then y = 0 if keyhit(57) then schuss = schuss + 1 if schuss = 21 then schuss = 1 bumm(schuss,0) = 1 bumm(schuss,1) = x bumm(schuss,2) = y endif for l = 1 to 20 if bumm(l,0) = 1 then drawimage rakete, bumm(l,1), bumm(l,2) bumm(l,2) = bumm(l,2) - 20 endif next i = i + 1 pos_y = pos_y + 1 sin_w = sin(i) * hoehe if da = 1 then drawimage monster, sin_w + 200, pos_y endif if i = 641 then i = 1 hoehe = rnd(300) endif for k = 1 to 20 if imagesoverlap(monster, sin_w+200, pos_y, rakete, bumm(k,1), bumm(k,2)) then bumm(k,0) = 0 pos_y = 0 punkte = punkte + 10 endif next flip until keydown(1) Irgenwie zählt der die punkte ziemlich schnell hoch und auserdem bleibt der gegner irgenwann oben hängen wenn ich ganz oft auf ihn schieße vielleicht kann sich das mal einer anschauen. |
||
![]() |
Shadow of the night |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn er die Punkte zu schnell hoch zählt musst du bloss...
Code: [AUSKLAPPEN] punkte = punkte + 10 ...durch... Code: [AUSKLAPPEN] punkte = punkte + 5 ...ersetzen. MFG Shadow of the Night |
||
User posted image |
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok meine beschreibung war en bisschen dumm musst das programm mal ausführen erst dann verstehst du den bug den es hat (kann es leider nicht so gut beschreiben ![]() |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,.
ich glaube das der fehler darin liegt das du jede Rakete abfragst und nicht nur die die aktiv ist Code: [AUSKLAPPEN] APPTITLE "Shooter"
graphics 640, 480 setbuffer backbuffer() monster = loadimage("monster.bmp") player = loadimage("player.bmp") rakete = loadimage("schuss.bmp") dim bumm(20,2) hoehe = 200 pos_y = 10 x = 300 y = 300 da = 1 punkte = 0 rechts = 205 links = 203 hoch = 200 runter = 208 repeat cls text 400,10, "Du hast "+punkte+" Punkte if keydown(rechts) then x = x + 4 if keydown(links) then x = x - 4 if keydown(hoch) then y = y - 4 if keydown(runter) then y = y + 4 drawimage player, x, y if x > 600 then x = 600 if x < 0 then x = 0 if y > 440 then y = 440 if y < 0 then y = 0 if keyhit(57) then schuss = schuss + 1 if schuss = 21 then schuss = 1 bumm(schuss,0) = 1 bumm(schuss,1) = x bumm(schuss,2) = y endif for l = 1 to 20 if bumm(l,0) = 1 then drawimage rakete, bumm(l,1), bumm(l,2) bumm(l,2) = bumm(l,2) - 20 endif next i = i + 1 pos_y = pos_y + 1 sin_w = sin(i) * hoehe if da = 1 then drawimage monster, sin_w + 200, pos_y endif if i = 641 then i = 1 hoehe = rnd(300) endif for k = 1 to 20 if bumm(k,0) = 1 then ;--------------------------------------<<<<< if imagesoverlap(monster, sin_w+200, pos_y, rakete, bumm(k,1), bumm(k,2)) then bumm(k,0) = 0 pos_y = 0 punkte = punkte + 10 endif end if -----------------------------------------------<<<<<<< next flip until keydown(1) so sollte es gehen habe die Stellen markiert |
||
![]() |
Shadow of the night |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst nicht gut beschreiben und ich nicht gut begreifen, aber Gott sei dank gibt's noch andere Leute im Forum. | ||
User posted image |
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Och man...............ich bin beleidigt so en einfacher fehler super thx du bist en STAR ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ich nicht das ganze forum voll spammen will schreib ich mein problem immer hier rein ist doch ne gute idee, und bitte nicht gereizt sein....
Also ich hab nä(h)mlich schon wieder en problem also: Code: [AUSKLAPPEN] APPTITLE "Shooter" graphics 640, 480 setbuffer backbuffer() monster = loadimage("monster.bmp") player = loadimage("player.bmp") schussbild = loadimage("schuss.bmp") background = loadimage("bg.bmp") explosion = loadanimimage("kaboom.bmp",60,48,0,5) dim rakete(20,2) hoehe = 200 pos_y = 10 x = 300 y = 300 bg = 0 repeat cls bg = bg + 1 if bg = 200 then bg = 0 tileblock background, 0, bg text 400,10, "Du hast "+punkte+" Punkte if keydown(205) then x = x + 4 if keydown(203) then x = x - 4 if keydown(200) then y = y - 4 if keydown(208) then y = y + 4 drawimage player, x, y if x > 600 then x = 600 if x < 0 then x = 0 if y > 440 then y = 440 if y < 0 then y = 0 if keyhit(57) then schuss = schuss + 1 if schuss = 21 then schuss = 1 rakete(schuss,0) = 1 rakete(schuss,1) = x + 8 rakete(schuss,2) = y - 16 endif for l = 1 to 20 if rakete(l,0) = 1 then drawimage schussbild, rakete(l,1), rakete(l,2) rakete(l,2) = rakete(l,2) - 5 endif next i = i + 1 pos_y = pos_y + 1 sin_x = sin(i) * hoehe drawimage monster, sin_x + 300, pos_y if pos_y > 641 then punkte = punkte - 10 pos_y = 0 hoehe = rnd(200,300) endif for k = 1 to 20 if rakete(k,0) = 1 and imagesoverlap(monster, sin_x+300, pos_y, schussbild, rakete(k,1), rakete(k,2)) then rakete(k,0) = 0 pos_y = -50 punkte = punkte + 10 hoehe = rnd(200,300) for e = 0 to 5 drawimage explosion, sin_x+300, pos_y, e ;<-----------------Hier next endif next if imagesoverlap(monster, sin_x+300, pos_y, player, x, y) then end endif flip until keydown(1) Also ich will dass wenn der gegner von nem schuss getroffen wird eine explosion erscheint, aber immer wenn ich den gegner jetzt abschieße dann kommt memory access violation, woran liegt das ??? ![]() |
||
![]() |
Slayer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du lädst 5 Frames bei der explosion und zeichnen willst Du 6.
die for schleife nicht 0 to 5 sonder 0 to 4 ![]() |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja baer ich dachte beim laden wird der 0te frame als der erste gezählt deshalb hab ich nur 5 angegeben und als startframe den 0ten....ok ![]() |
||
![]() |
Freeman |
![]() Antworten mit Zitat ![]() |
---|---|---|
na eigentlich ist es doch ganz einfach, ich weiß jetz nich genau wie du das machst aber das ist ja eigentlich auch egal. es gibt auf jeden FaLL bei BB 2 Befehle die dir da helfen könnten, einmal die normale Kollisionsabfrage(würd ich nich nehmen , aba das wär dann ImagesOverlap )
oder du nimmst ne Pixelgenaue Kollisionsabfrage, was ich auch immer empfehlen würde , das wär dann ImagesCollide code beispiel : Code: [AUSKLAPPEN] If ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2) Then Print "Pixelgenaue Kollision!!! (!)"
Code: [AUSKLAPPEN] If ImagesOverlap(bild1, x1, y1, bild2, x2, y2) Then Print "Einfache Kollison!"
ich hoffe ich konnte dir etwas helfen |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Axo ok aber was soll ich bei den frames eingeben ich will ja nur das wenn das monster gekilled wurde ne explosion erscheint
Denn mein raumschiff besteht nur aus einem frame...nur die explosion hat mehrere frames |
||
![]() |
Freeman |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja du wolltest doch wissen wie man das macht, das wenn ne Rakete oda sonst was fürnen geschoß nen enemy trifftm das der dann explodiert, und das macht man doch mit Kolliesionsabfragen oda? oda meintest du jetzt die Explosion? ![]() arrgg, ich hab nochne Frage an dich , is das nen weltraum shooter mit scrollen oda ohne? Und wenn ja, sind die maps dann so gemacht das du jedes Bild einzeln reinlädst oder per data 1,0,1......... Wenn das so is, dann wärs nett wennde mir ma verraten könntest wie man nen vernünftiges mapscrolling hinbekommt, achso, wo hastn das schießen her? |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja ![]() Ich speichere die Koordianten des gegners in zwei neuen variablen dann kann der gegner schon neu erscheinen und trotzdem die explosion an der alten stelle statfinden, weil.....hhhmmm....naja.....ich hab nur ein gegner. aber mein prblem liegt darin dass die explosion nach weniger als einer sekunde weg ist...hmmm...ja |
||
![]() |
Freeman |
![]() Antworten mit Zitat ![]() |
---|---|---|
Julz hat Folgendes geschrieben: ja
![]() Ich speichere die Koordianten des gegners in zwei neuen variablen dann kann der gegner schon neu erscheinen und trotzdem die explosion an der alten stelle statfinden, weil.....hhhmmm....naja.....ich hab nur ein gegner. aber mein prblem liegt darin dass die explosion nach weniger als einer sekunde weg ist...hmmm...ja na wenn die explosion länger gehn soll, dann bau noch nen DELAY ein, das is ne wartezeit. Und wenn nich wiederhohlste die explosion noch 1 - 2 mal, das würd auch ganz gut aussehn, kannste ma auf meine Fragen schaun? |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
also das schießen hab ich mir ausgedacht und die map ist nur sozusagen en fake, die läuft immer im kreis hab ich mit dem befehl gemacht:
bg = bg + 1 if bg = 200 then bg = 0 tileblock background, 0, bg Hat mir ma jemand im forum erklärt schon länger her Also mit delay is doch kagge wenn ich ne wartezeit einbaue dann bleibt doch das ganze spiel stehen |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lagere alles was geschehen soll in functionen aus und mach in der Hauptschleife des Games eine FPS-Bremse, das dürfte schon viel helfen. (Vorallem wird der Code Recht übersichtlich...)
Wahlweise halte beim ersten Frame deiner Explosion mit millisecs() die systemzeit fest und prüfe bei späteren durchläufen, ob genügend Zeit verstrichen ist, um ein neues Frame zu setzen. @Freeman: hast du renés buch? da steht ein Grundgerüst für tilescrolling drin. Es gibt dutzende Möglichkeiten sowas zu lösen, ich hab für meine tile-engine einiges an kopfweh investiert, aber jetzt hab ich butterweiches scrolling in beliebiger richtung. das grundprinzip bei mir ist daß ich einen größeren Ausschnitt als den sichtbaren berechne und diesen dann einkopiere. wenn in einer richtung ein Grenzwert unterschritten wird, berechne ich alles neu. geht so fix daß es keine aussetzer gibt (auch bei mehreren ebenen nicht) |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
ahhh ok thx das war mir schon mal ne große hilfe werde mein code mal umstrukturieren 8)
Code: [AUSKLAPPEN] APPTITLE "Shooter" graphics 640, 480 setbuffer backbuffer() global monster = loadimage("monster.bmp") global player = loadimage("player.bmp") global schussbild = loadimage("schuss.bmp") global background = loadimage("bg.bmp") dim rakete(20,2) global treffer = 0 global hoehe = 200 global schuss = 0 global punkte = 0 global pos_y = 10 global sin_x = 0 global x = 300 global y = 300 global bg = 0 global i = 0 repeat cls hintergrund() steuerung() schiesen() gegner() kollisionen() spieler() punkte() flip until keydown(1) function hintergrund() bg = bg + 1 if bg = 200 then bg = 0 tileblock background, 0, bg end function function steuerung() if keydown(205) then x = x + 4 if keydown(203) then x = x - 4 if keydown(200) then y = y - 4 if keydown(208) then y = y + 4 if x > 600 then x = 600 if x < 0 then x = 0 if y > 440 then y = 440 if y < 0 then y = 0 end function function schiesen() if keyhit(57) then schuss = schuss + 1 if schuss = 21 then schuss = 1 rakete(schuss,0) = 1 rakete(schuss,1) = x + 8 rakete(schuss,2) = y - 16 endif for l = 1 to 20 if rakete(l,0) = 1 then drawimage schussbild, rakete(l,1), rakete(l,2) rakete(l,2) = rakete(l,2) - 5 endif next end function function gegner() i = i + 1 pos_y = pos_y + 3 sin_x = sin(i) * hoehe sin_x = sin_x + 300 drawimage monster, sin_x, pos_y if pos_y > 641 then punkte = punkte - 10 pos_y = 0 hoehe = rnd(200,300) endif end function function kollisionen() for k = 1 to 20 if rakete(k,0) = 1 and imagesoverlap(monster, sin_x, pos_y, schussbild, rakete(k,1), rakete(k,2)) then rakete(k,0) = 0 treffer = treffer + 1 endif next if treffer = 3 then treffer = 0 punkte = punkte + 10 hoehe = rnd(200,300) pos_y = -10 endif if imagesoverlap(monster, sin_x, pos_y, player, x, y) then end endif end function function spieler() drawimage player, x, y end function function punkte() text 400,10, "Du hast "+punkte+" Punkte" end function So hab jetzt alles in functionen gepackt wie soll ich das jetzt mit der frame bremse bewerkstelligen ?? |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da hast du 2 möglichkeiten:
entweder fügst du ans ende der schleife (oder als eigene func) ein: Code: [AUSKLAPPEN] repeat until millisecs() mod 33 = 0
Nur als Beispiel, die 33 sorgt dafür dass die Schleife ca 1/30 sec. hält (da 1000ms/33 ~30) -->hier kannst du mit den Werten etwas spielen. Ansonsten mit Createtimer und waittimer (siehe onlinehilfe). beide Methoden pausieren allerdings das Prg. Sollte jedoch bei kleineren Programmen kein ernsthaftes Problem darstellen. Wenn du unbedingt ohne Zeitverlust arbeiten willst, mußt du mit Code: [AUSKLAPPEN] if millisecs() mod 33 = 0 then ...(erhöhe das frame oder setze statusvariable)
oder was ähnlichem arbeiten. Die obige Routine hat einen schweren Haken- je nachdem wie lang deine Hauptschleife zur abarbeitung benötigt, kann es durchaus passieren, dass du den fall "0" ständig verpasst --> dein Prg wird also buggy. Bei kleinen (=nicht zeitintensiven) Routinen müsste es aber funktionieren. Bei längeren Geschichten empfiehlt sich das Vorgehen aus meinem letzten post: Lese millisecs() aus (zb: time= millisecs()).(aber vor der Hauptschleife !) dann prüfe in der Hauptschleife, ob millisecs()-time> meine Verzögerungszeit. ist dies der Fall, setze time nochmal auf millisecs und rufe die Funcs auf, die nur gebremst laufen sollen... Code: [AUSKLAPPEN] if millisecs()-time>33 then time=millisecs():exploframe=exploframe+1 ...etcetc
|
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
am einfachsten wäre es wenn du anstatt 5 Frames 20 hast und diese bei jedem 3. durchlauf erhöhst, dann ist das ca. 1 sec zB. Code: [AUSKLAPPEN] variable = variable +1
if variable > 2 then Frame = Frame +1 variable = 0 end if Drawimage x,y,frame oder wenn das hier besser gefällt Code: [AUSKLAPPEN] if variable > 2 then Frame = Frame +1 variable = 0 else variable = variable +1 end if Drawimage x,y,frame |
||
![]() |
Freeman |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ BladeRunner, ne hab ich noch nich, weil ich erst vor 3 Tagen mit BB angefangen hab...naja hab davor PB gemacht. Aba ich werds mir zulegen. Asso, könnteste ma nen paar Schlagworter in den raum werfen die mir weiter helfen? ich weiß das das Topic eigentlich anders ist, sorry | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group