Space Shooter

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

Julz

Betreff: Space Shooter

BeitragMo, Dez 15, 2003 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 15, 2003 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 15, 2003 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused )

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Dez 15, 2003 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 15, 2003 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 15, 2003 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Och man...............ich bin beleidigt so en einfacher fehler super thx du bist en STAR Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy juhu

Julz

BeitragMi, Dez 17, 2003 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ??? Confused

Slayer

BeitragMi, Dez 17, 2003 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Du lädst 5 Frames bei der explosion und zeichnen willst Du 6.


die for schleife nicht 0 to 5
sonder 0 to 4 Wink

Julz

BeitragMi, Dez 17, 2003 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed

Freeman

BeitragMi, Dez 17, 2003 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 17, 2003 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 17, 2003 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Rolling Eyes


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

BeitragMi, Dez 17, 2003 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ja Embarassed eigentlich meinte ich wie man die explosion dann macht hab da auch ne idee
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

BeitragMi, Dez 17, 2003 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Julz hat Folgendes geschrieben:
ja Embarassed eigentlich meinte ich wie man die explosion dann macht hab da auch ne idee
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

BeitragMi, Dez 17, 2003 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragMi, Dez 17, 2003 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 17, 2003 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ??

BladeRunner

Moderator

BeitragMi, Dez 17, 2003 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Dez 17, 2003 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 17, 2003 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group