Space Shooter
Übersicht

Gehe zu Seite Zurück 1, 2, 3 Weiter
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier habe ich noch was rausgesucht, in bezug auf die explosionenCode: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() Timer=CreateTimer(50) Dim Knall(20,9) Repeat Cls If KeyHit(57) Then Freie_Explosi_suchen(Rand(10,750),Rand(10,750) ) End If Explosionen() WaitTimer(Timer) Flip Until KeyDown(1) End Function Freie_Explosi_suchen(x,y) For Zaehler1 = 0 To 20 If Knall(Zaehler1,0) = 0 Then ; wenn nicht aktiv Knall(Zaehler1,0) = 1 ; aktivieren Knall(Zaehler1,1) = x ;koordinaten übergeben Knall(Zaehler1,2) = y Knall(Zaehler1,3) = 0 ; raufzählen für explosionFrames Exit ; schleife verlassen da eine leere gefunden wurde End If Next End Function Function Explosionen() For Zaehler = 0 To 20 If Knall(Zaehler,0) = 1 Then ; hier kannste die frame Bremse einbauen Knall(Zaehler,3)=Knall(Zaehler,3)+1 If Knall(Zaehler,3)=20 Then Knall(Zaehler,0) = 0 End If Oval Knall(Zaehler,1) - Knall(Zaehler,3) ,Knall(Zaehler,2) -Knall(Zaehler,3),Knall(Zaehler,3)*2,Knall(Zaehler,3) *2 ,1 End If Next End Function einfach mal ausprobieren mit Space erstellst du an eine zufälligen Stelle eine |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das problem bei diesem lösungsansatz ist allerdings, das er auf einem Compi genauso funktioniert-nämlich deinem.
Wenn du konstante Rates haben willst, mußt du mit millisecs() arbeiten, damit du unabhängig von der Geschwindigkeit des Rechners bist. @Freeman: bin jetzt etwas in zeitdruck- ich melde mich wohl heut abend nommal. Dann schaun wir mal, okay? |
||
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 ![]() |
---|---|---|
Also ich hab ma die methode von Rallimen versucht aber die funst nicht, und ich kann mir gluab'ch auch schon denken warum weil immer wenn der gegner zerstört wird geht die variable eins hoch also sieht man bei jedem gegner kurz ein frame ![]() @bladerunner Also ich hab schon verstanden was du meinst aber wo soll jetzt die andre funcktion hin ??? die die gebremst werden soll ??? 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") global explosion = loadanimimage("kaboom.bmp",60,48,0,6) dim rakete(20,2) dim enemy(5,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 global v = 0 global frame = 0 repeat cls hintergrund() steuerung() schiesen() gegner() kollisionen() spieler() punkte() repeat until millisecs() mod 33 = 0 ;<------------hab hier die verzögerung ;<------------Muss hier jetzt die funktion hin ?? 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 sin_x = sin(i) * hoehe for h = 1 to 5 enemy(h,0) = 1 enemy(h,1) = sin_x enemy(h,2) = pos_y if enemy(h,0) = 1 then enemy(h,2) = enemy(h,2) + 3 enemy(h,1) = enemy(h,1) + 300 drawimage monster, enemy(h,1), enemy(h,2) if enemy(h,2) > 641 then enemy(h,0) = 0 punkte = punkte - 10 hoehe = rnd(200,300) endif endif next end function function kollisionen() for k = 1 to 20 for t = 1 to 5 if rakete(k,0) = 1 and imagesoverlap(monster, enemy(t,1), enemy(t,2), schussbild, rakete(k,1), rakete(k,2)) then rakete(k,0) = 0 treffer = treffer + 1 endif next next if treffer = 3 then for g = 1 to 5 enemy(g,0) = 0 treffer = 0 punkte = punkte + 10 hoehe = rnd(200,300) enemy(t,2) = -10 next endif for z = 1 to 5 if imagesoverlap(monster, enemy(z,1), enemy(z,2), player, x, y) then punkte = 0 endif next end function function spieler() drawimage player, x, y end function function punkte() text 400,10, "Du hast "+punkte+" Punkte" end function |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du repeat until verwendest wird der ganze Code gebremst. Nur einzelne teile bremsen klappt nur mit dem Vorgehen welches ich als Letztes in Erwägung gezogen hab.
Ach ja: die 2.te methode vergiß besser- da hatte ich nen denkfehler drin. wäre allenfals adaptiert benutzbar, und selbst dann nur unzuverlässig. EDIT: Habs mal provisorisch reigeschraubt: 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") global explosion = loadanimimage("kaboom.bmp",60,48,0,6) dim rakete(20,2) dim enemy(5,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 global v = 0 global frame = 0 Zeitgeber=millisecs() repeat cls hintergrund() steuerung() schiesen() gegner() kollisionen() spieler() punkte() if (millisecs()-Zeitgeber)>33 then Zeitgeber=millisecs() ;hier deine Explosionsfunction, oder besser: den Counter für ;die Frames um eines erhöhen und die Function welche die Explosion ;zeichnet oben in der schleife ausführen (zB explo(frame)) ;-->hat den vorteil das die explo immer gezeichnet wird und nicht ;verschwinden kann. end if flip until keydown(1) end ;<--verhindert das leidige "program has ended" 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 sin_x = sin(i) * hoehe for h = 1 to 5 enemy(h,0) = 1 enemy(h,1) = sin_x enemy(h,2) = pos_y if enemy(h,0) = 1 then enemy(h,2) = enemy(h,2) + 3 enemy(h,1) = enemy(h,1) + 300 drawimage monster, enemy(h,1), enemy(h,2) if enemy(h,2) > 641 then enemy(h,0) = 0 punkte = punkte - 10 hoehe = rnd(200,300) endif endif next end function function kollisionen() for k = 1 to 20 for t = 1 to 5 if rakete(k,0) = 1 and imagesoverlap(monster, enemy(t,1), enemy(t,2), schussbild, rakete(k,1), rakete(k,2)) then rakete(k,0) = 0 treffer = treffer + 1 endif next next if treffer = 3 then for g = 1 to 5 enemy(g,0) = 0 treffer = 0 punkte = punkte + 10 hoehe = rnd(200,300) enemy(t,2) = -10 next endif for z = 1 to 5 if imagesoverlap(monster, enemy(z,1), enemy(z,2), player, x, y) then punkte = 0 endif next end function function spieler() drawimage player, x, y end function function punkte() text 400,10, "Du hast "+punkte+" Punkte" end function |
||
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 ![]() |
---|---|---|
Warum schlagt ihr euch mit millisec() rum,
Viel einfacher ist das um die Programmgeschwindigkeit festzulegen! Timer = CreateTimer(50) hiermit sagts du wie viele Bilder pro sekunde maximal angezeigt werden sollen sollte im Anfang des Code stehen Für Testzwecke setzte ich die auch schon mal auf 10 WaitTimer(Timer) hier wird gewartet bis 1/50 Sekunde um ist und steht normalerweise direkt vor flip Code: [AUSKLAPPEN] ....
Timer = CreateTimer(50) .... repeat ... .... .... WaitTimer(Timer) Flip until keyhit(1) Damit läuft dein Programm auch gleich schnell auf anderen Rechnern |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Rallimen:
Julz sucht nach einem Weg, nur einen Teil des Programms zu bremsen- dafür muß man eben millisecs() verwenden, da timer den kompletten code pausiert. hab ich aber schon mehrfach erklärt...(s.o.) |
||
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 |
Alu-FolieGast |
![]() Antworten mit Zitat |
|
---|---|---|
Freeman hat Folgendes geschrieben: 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?
In seinem Code-Abschnitt macht er kein Scrolling. Aber ich will dir mal kurz erklären wie du das ganze einfacher lösen kannst. Du kannst ein Bild nehmen, das Beispielsweise 200x200 Pixel groß ist, sagen wir mal auf dem Bild sind sterne. Dann schreibst du im Code Code: [AUSKLAPPEN] Tileimage Background, 0, Scroll
Scroll = Scroll + 1 If Scroll > ImageHeight(Background) then Scroll = 0 Du kannst das ganze auch mit Tilemaps machen, nur das würde dann auch etwas komplizierter sein. Wenn du weißt, wie man eine Map zeichnet, dann kannst du von den Positionen der Tiles ScrollX und ScrollY abziehen. Code: [AUSKLAPPEN] Drawblock Tileset, CountX*32-ScrollX, CountY*32-ScrollY, Map(CountX, CountY)
Wenn du noch mehr fragen hast, dann gibbet auf der robsite ein paar übsche Tutorials zum Thema Tilemaps. |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab das ganze jetzt eingebaut aber irgenwie funst das immer noch nicht so ganz:
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") global explosion = loadanimimage("kaboom.bmp",60,48,0,6) dim rakete(20,2) global treffer = 0 global hoehe = 200 global schuss = 0 global punkte = 0 global boom = 0 global pos_y = 10 global sin_x = 0 global x = 300 global y = 300 global bg = 0 global i = 0 zeitgeber=millisecs() repeat cls hintergrund() steuerung() schiesen() gegner() kollisionen() spieler() punkte() explo(frame) if (millisecs()-zeitgeber)>33 then zeitgeber=millisecs() frame = frame + 1 if frame = 6 then frame = 1 explo(frame) end if flip until keydown(1) function explo(frame) if boom = 1 then drawimage explosion, sin_x+300, pos_y, frame boom = 0 endif end function 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 boom = 1 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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmmm...
du setzt in explo(frame) die var boom auf 0, das darf aber erst geschehen, wenn alle frames durch sind. also: if frame=5 then boom=0 kanns nit richtig testen, da ich deine artworks nit hab, der Fehler is mir aber mal ins auge gesprungen. EDIT: du rufst in der Hauptschleife explo() auf und in der Bremse auch. einmal genügt. (am besten in der Hauptschleife). Es kann sein, das dann das erste anim.bild nit zu sehen ist, dann müsste frame auf 0 gesetzt werden zu beginn (da es ja automatisch erhöht wird). Ausserdem erhöhst du frame unabhängig vom vorhandensein einer explo, d.h. alle Explos werden immer in der selben Phase sein (und mit Pech beginnt eine Explosion im letzten frame). Hier wäre es günstiger in der Bremse auf boom=1 zu prüfen bevor du frame änderst- das ist dann aber nur ein Anfang. Ändere die Sachen und sag mir wie es dann geht, ok? |
||
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 ![]() |
---|---|---|
Hab da mal in unzähligen Stunden ![]() 3 neue Functionen eingebaut 1x mit Bladerunners version Millisecs 1x mit variable 1x ohne pause, also ganz normal Code: [AUSKLAPPEN] AppTitle "Shooter"
Graphics 640, 480 SetBuffer BackBuffer() frameTimer=CreateTimer(50) ;--<<<<< neu Global monster = LoadImage("monster.bmp") Global player = LoadImage("player.bmp") Global schussbild = LoadImage("schuss.bmp") Global background = LoadImage("bg.bmp") Global explosion = LoadAnimImage("kaboom.bmp",60,48,0,5) Dim Knall(20,4) ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu 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() ;Hier kannste dir aussuchen welche du nimmst, mußt nur in der ersten funktion millisecs durch 0 ersetzen ;Explosionen_Variable() ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu Explosionen_Zeit() ;So wie BladeRunner beschrieben--<<<<<<<<<< neu ;Explosionen_malen() ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu punkte() WaitTimer(frameTimer) ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu Flip Until KeyDown(1) Function Freie_Explosi_suchen(x,y) ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu For Zaehler = 0 To 20 If Knall(Zaehler,0) = 0 Then ; wenn nicht aktiv Knall(Zaehler,0) = 1 ; aktivieren Knall(Zaehler,1) = x ;koordinaten übergeben Knall(Zaehler,2) = y Knall(Zaehler,3) = 0 ; raufzählen für explosionFrames Knall(Zaehler,4) = MilliSecs() ; Wichtig Wichtig Wichtig Wichtig Wichtig Wichtig Wichtig , ;hier muß = 0 stehen wenn eine der beiden anderen Function benutzt wird Exit ; schleife verlassen da eine leere gefunden wurde End If Next End Function Function Explosionen_malen() ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu For Zaehler = 0 To 20 ; maximal 20 verschiedene explosionen möglich If Knall(Zaehler,0) = 1 Then DrawImage explosion,Knall(Zaehler,1),Knall(Zaehler,2),Knall(Zaehler,3) Knall(Zaehler,3)=Knall(Zaehler,3) + 1 ;Frame raufzählen If Knall(Zaehler,3) = 5 Then ; den Frame gibt es nicht ,bzw die Bilder sind durchgelaufen Knall(Zaehler,0) = 0 ; abschalten End If End If Next End Function Function Explosionen_Variable() ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu For Zaehler = 0 To 20 ; maximal 20 verschiedene explosionen möglich If Knall(Zaehler,0) = 1 Then ; wenn aktiv dann zeichnen DrawImage explosion,Knall(Zaehler,1),Knall(Zaehler,2),Knall(Zaehler,3) If Knall(Zaehler,4) = 3 Then; 3 x gleiches Frame zeichnen und dann wechseln ; wenn der wert sehr hoch ist siehst du auch mehrere Explosionen ; da Knall(Zaehler,4)= 0 Knall(Zaehler,3)=Knall(Zaehler,3) + 1 Else Knall(Zaehler,4)= Knall(Zaehler,4)+1 End If If Knall(Zaehler,3) = 5 Then ; den Frame gibt es nicht ,bzw die Bilder sind durchgelaufen Knall(Zaehler,0) = 0 ; abschalten End If End If Next End Function Function Explosionen_Zeit() For Zaehler = 0 To 20 ; maximal 20 verschiedene explosionen möglich If Knall(Zaehler,0) = 1 Then DrawImage explosion,Knall(Zaehler,1),Knall(Zaehler,2),Knall(Zaehler,3) If (MilliSecs()-Knall(Zaehler,4))>33 Then ; jedes Frame wird min. 33Millisekunden gezeigt Knall(Zaehler,4)=MilliSecs() Knall(Zaehler,3)=Knall(Zaehler,3) + 1 End If If Knall(Zaehler,3) = 5 Then ; den Frame gibt es nicht ,bzw die Bilder sind durchgelaufen Knall(Zaehler,0) = 0 ; abschalten End If End If Next End Function 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 Freie_Explosi_suchen(sin_x, pos_y) ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu 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 natürlich ohne Pistole, sollte aber funzen im Code hab ich noch einige Komenmtare reingetippt zum besseren verständnis |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Rallimen dein source funs allerdings ist das ganze spiel ziemlich gebremst, alles ruckelt, dafür läuft die explosion schön ab
@bladerunner bin grad dabei deins zu testen wollte nur schon mal sagen das ich schon dick am testen bin ...hihihi..... Also bi njetzt fertig mit testen ich habs fast allerdings noch ein problem wenn ich jetzt den ersten gegner kille dann erscheint bei allen gegnern ne explosion, d.h. es sind zwei images übernander der gegner und die explosion: 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") global explosion = loadanimimage("kaboom.bmp",60,48,0,6) dim rakete(20,2) global treffer = 0 global hoehe = 200 global schuss = 0 global punkte = 0 global boom = 0 global pos_y = 10 global sin_x = 0 global x = 300 global y = 300 global bg = 0 global i = 0 zeitgeber=millisecs() repeat cls hintergrund() steuerung() schiesen() gegner() kollisionen() spieler() punkte() explo(frame) if (millisecs()-zeitgeber)>33 then zeitgeber=millisecs() if boom = 1 then frame = frame + 1 if frame = 6 then frame = 1 endif endif flip until keydown(1) function explo(frame) if boom = 1 then drawimage explosion, sin_x, pos_y, frame if frame = 6 then frame = 1 boom = 0 endif endif end function 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 treffer = 0 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 boom = 1 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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Fehlerteufel hat wieder zugeschlagen ... ![]() ![]() Ersetze in explo(frame): Code: [AUSKLAPPEN] if frame = 5 then ;wichtig: bei frame=6 wird in der bremse eine 1 draus....
das sollte helfen. Bislang hast du nur einen Gegner aufm Bildschirm, das seh ich richtig, oder ? Kannst du mir deine Pics mal senden, damit ich den Code richtig testen kann? |
||
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 |
![]() |
dominik |
![]() Antworten mit Zitat ![]() |
---|---|---|
also wenn wir hier schon grad bei space shooter problemen sind dann hab ich da auch mal noch nen paar fragen also:
1. funzt meine collisionsabfrage von meinen raketen mit den gegnern nich obwohl ich des einfach mit imageoverlap gemacht hab. der pc prüft irgentwie jeden durchlauf ob eine rakete mit einem gegner zusammengestoßen is aber wenn kein gegner nich da is dann bricht des programm mit "images does not exsist ab". also es startet eigentlich garnicht erst weil es ja schon beim ersten durchaluf passiert. aber eigentlich sollte dess programme doch ganznormal weiterlaufen wenn die beiden vilder nicht collidieren. tun es aber nicht.????????????????Ü ![]() |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Blade Runner, ich hab leider kein web space wenn du mir allerdings deine e-mail geben würdest dann könnte ich es dir senden
@dominik wenn du uns dein source zeigst dann könnten wir dir eher helfen sonst ist das en bisschen schwierig |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@dominik:
Lade dein gegner/raketenimage vor der Hauptschleife, nicht erst wenn es im spiel erzeugt wird. dann funktioniert auch die Abfrage (imagescollide erwartet daß beide zu prüfenden Bilder existent sind). Ansonsten hat julz recht- es ist schwierig code zu verstehen/verbessern wenn man ihn nit sieht 8) @julz: meine addy ist andreas.brennecke@planet-interkom.de , müßte aber auch in meinem profil sein.. ![]() EDIT: nö isse wohl 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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
So... habs n bissl verschlimmbessert- frame ist zur erleichterung des Geschehens jetzt global, nun funzt die Sache soweit:
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") Global explosion = LoadAnimImage("kaboom.bmp",60,48,0,6) Dim rakete(20,2) Global treffer = 0 Global hoehe = 200 Global schuss = 0 Global punkte = 0 Global boom = 0 Global pos_y = 10 Global sin_x = 0 Global x = 300 Global y = 300 Global bg = 0 Global i = 0 Global Frame Global zeitgeber=MilliSecs() Repeat Cls hintergrund() steuerung() schiesen() gegner() kollisionen() spieler() punkte() explo( ) If (MilliSecs()-zeitgeber)>100 Then zeitgeber=MilliSecs() If boom = 1 Then frame = frame + 1 EndIf EndIf Flip Until KeyDown(1) Function explo() If boom = 1 Then DrawImage explosion, sin_x, pos_y, frame If frame >= 5 Then frame = 1 boom = 0 EndIf EndIf End Function 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 treffer = 0 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 boom = 1 treffer = 0 punkte = punkte + 30 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 Hab mir erlaubt das Ganze etwas übersichtlicher zu Gestalten. Bezüglich der Email: np- ich lern ja auch was dabei, bin selbst noch n00b. |
||
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 ![]() |
---|---|---|
Zitat: @Rallimen dein source funs allerdings ist das ganze spiel ziemlich gebremst, alles ruckelt, dafür läuft die explosion schön ab
das liegt an der Speedbremse die ich eingebaut habe Begrenzung auf 50 x Flip pro sekunde das bedeutet das das Programm auf jeden Rechner gleich schnell ist, außer der Rechner ist so lahm das er es nicht schafft die Bilder anzuzeigen in der eingestellten Geschwindigkeit ersetzte zum testen den Code: [AUSKLAPPEN] Timer=CreateTimer(50) durch Code: [AUSKLAPPEN] Timer=CreateTimer(150) dann
rennt das Spiel wieder läuft dann aber nur so schnell auf anderen rechnern die diese Geschwindigkeit halten können du kannst das auch auf Millisecs basis machen so wie Bladerunner das schon mal alles beschrieben hat |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Ralimen großes thx an dich dein code funst einwandfrei ![]() @ bladerunner, also der code funst immer noch nich so ganz weil wenn die position der explosion übergeben wird dann wird die so schnell erneuert dass die explosion mit dem nächsten monster das erscheint mitfliegt....... ![]() und noch ne frage mit millisecs() was bekomm ich da für en wert ??? was bringt mir das und wie kann ich damit mein programm bremsen ?? Code: [AUSKLAPPEN] If (MilliSecs()-zeitgeber)>100 Then zeitgeber=MilliSecs() If boom = 1 Then frame = frame + 1 EndIf EndIf Cool wäre wenn du den code hier en bisschen dokumentieren könntest damit ich genauer verstehe was da eigentlich passiert ![]() |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
mit Millisecs() liest du die interne StoppUhr aus
Diese startet mit dem rechner und liefert dir die Zeit in millisekunden die der rechner schon läuft z.B.: 3600000 was genau 1Stunde wäre MilliSecs()-zeitgeber ; ist die Zeitspanne , die vergangen ist seit dem aufruf von zeitgeber = MilliSecs() ;dieses bedeutet einfach If (MilliSecs()-zeitgeber)>100 Then wenn die zeitspanne größer 100 Millisekunden ist dann If boom = 1 Then ; wenn der boom aktiv ist frame = frame + 1 EndIf kannste aber auch unter www.blitzbase.de nachsehen |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach so danke für die erklärung ![]() |
||
Gehe zu Seite Zurück 1, 2, 3 Weiter
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group