probs mit schiess richtung
Übersicht

![]() |
f-codeBetreff: probs mit schiess richtung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich lerne zur Zeit BBplus mit de hilfe des buches "jetzt lerne ich spieleprog mit bb" von rené meyer. Das buch erklärt sich eigentlich wie von selbst, und die sprache ist im gegensatz zu c++ auch einfacher. Sicherlich kommt es auch einfacher rüber weill Meyer alles gut erklärt. Bis jetzt. Ich studiere nämlich schon lange am quellcode vom space shooter das er im buch als einfach bezeichnet. Es ist eigentlich nicht so kompliziert aber ich würde gerne den quellcode komplett verändern denn so verstehe ich besser was ich mache und was dort steht. Im shooter von Meyer schiesst das raumschiff die racketen nach oben. Der quellcode sieht so aus (laut buch) Code: [AUSKLAPPEN] ; Schuß-Test If KeyHit(57) Then Schuss = Schuss + 1 If Schuss = 101 Then Schuss = 1 Rak(Schuss,0) = 1 Rak(Schuss,1) = X+10 Rak(Schuss,2) = Y-19 PlaySound(schusston) EndIf ; ggf. Raketen zeichnen For I=1 To 100 If Rak(I,0) = 1 Then DrawImage rakete, Rak(I,1), Rak(I,2) Rak(I,2) = Rak(I,2) - 10 EndIf Next ich möchte das mein raumschiff aber nach rechts schiesst. Der hintergrund konnte ich durch ein kleines vertuschen von 2 variablen dazu bringen nch links zu scrollen anstatt von oben nch unten. Habe das gleiche (so in etwa) auch bei den racketen versucht. Jedoch kommen zum teil fehlermeldungen weill ich dann us dem Feld Rak(100,2) gehe. Könnte mir jemand den oben erwähnten code beispiel vielleicht ein wenig besser erklären? Nicht umbedingt gleich die lösung sagen aber vielleicht so erklären das ich dan weiss welche variablen veratwortlich sind für die richtung die die rackete geht. Danke im voraus. Die rackete ist eine einfache bmp datei. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit Dim rak(100,2) wird ein Feld angelegt.
Es hat 101*3 Zellen (da Felder ja bei 0 beginnen). Die erste Zahl in diesem feld ist die Indexnummer für die Rakete, d.h. Du kannst maximal 101 Raketen gleichzeitig abgefeuert haben. Die Zweite Zahl ist ein Index auf verschiedene Eigenschaften der Rakete: zB: Code: [AUSKLAPPEN] rak(5,0)=1
rak(5,1)=500 rak(5,2)=300 Die fünf ist wiegesagt die Nummer der Rakete. rak (5,0) enthält dann eine Info ob die Rakete existiert (gefeuert wurde). Wenn 0 drin steht, heisst das nein, wenn 1 steht ja. Rak (5,1) gibt die X-Koordinate der Rakete an und rak(5,2) die ykoordinate. Das Beispiel oben sagt dem Computer also: Rakete 6 (Arrays beginnen bei null ![]() Diese Festlegungen sind natürlich willkürlich- du als Programmierer entscheidest welche Zelle deines Dimfeldes welche Information enthält. Um nun die Rakete von links nach rechts fliegen zu lassen musst du die x-Koordinate der Rakete verändern (anstatt der y-koord. bislang) Hoffe das war verständlich. Nebenbei würde ich empfehlen das Ganze mit types zu machen da sie wesentlich flexibler sind. aber wenn du ja mit RMs Buch lernen willst (welches nicht schlecht ist) denke ich versuch erstmal das Ganze mit den Dims in den Griff zu kriegen. Good luck. |
||
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 |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() Vielen Dank! mal schauen wie schnell ich das ganze nun zu 100% kapiere. Aber super erklärt! Aber was sind types? Danke ber für die schnelle hilfe! |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Steht alles in der Onlinehilfe, die standardgemäß bei Blitz mitgeliefert wird! ![]() grüße |
||
http://bl4ckd0g.funpic.de |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Types sind einmal verstanden eine wunderbare Sache. Gerade für Schüsse und so Zeugs bei denen die Anzahl der Objekte nicht bekannt ist und/oder ständig variiert. Aussehen könnte das ganze so:
Code: [AUSKLAPPEN] ; Das Typefeld anlegen
Der Code ist ungetestet, sollte aber schon funzen.
Type shoot Field x,y End Type ; Hauptschleife Repeat If KeyHit(schiessen) ; Eintrag für Schuss erstellen variable.shoot = New shoot variable\x = start_pos_x variable\y = start_pos_y ; Hinweis: Die Variable 'variable' kann für nichts anderes mehr verwendet werden EndIf For variable.shoot = Each shoot ; Alle vorhandenen Einträge durchgehen DrawImage schussbild , variable\x , variable\y ; Schuss malen variable\x = variable\x + 10 If variable\x > 800 ; Wenn Schuss den Bildschirm verlässt Delete variable.shoot ; wird er gelöscht EndIf Next Until KeyHit(1) ; Jo, das waren auch schon die wichtigsten Befehle |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich versuche es jetzt mal trotzdem mit dim. Auch wenn type scherlich auch gut klingt. Aber jetzt häte ich da noch ne frage. Möchte da nicht noch 1000 threadds aufmachen. Ich verstehe nämlich nicht wieso mir der compiler immer die fehlermeldung 'until' without 'repeat' anzeigt .
Code: [AUSKLAPPEN] Repeat
Cls LoopSound music PlaySound music MaskImage player, 255,253,233 Dim Rak(100,2) x = 305 y = 420 Cls h = h-2 TileImage hinter,h,0 DrawImage player, x,y ;steuerung::::::::::::::::: x=MouseX() y=MouseY() waffe = 0 If KeyHit(31) Then waffe = +2 If KeyHit(30) Then waffe = +1 ; schuss::::::::::::::::::::::::::::::::::::::::::: If GetMouse ()= 1 Then schuss = schuss +1 If schuss = 100 Then schuss = 1 Rak(schuss,0) = 1 Rak(schuss,1) = x+60 Rak(schuss,2) = y+20 EndIf ; Schuss zeichnen:::::::::::::::::::::::::::::::::::::: If waffe = 1 Then For I=1 To 100 If Rak(I,0) = 1 Then DrawImage rakete, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 ElseIf waffe = 2 Then For I=1 To 100 If Rak(I,0) = 1 Then DrawImage rakete2, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 EndIf Next ; rand:::::::::::::::::::::::::::::::::::::::::::: If x<0 Then x=0 If x>985 Then x = 985 If y<0 Then y=0 If y>675 Then y=675 Flip Until KeyDown(1) |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du so eine Fehlermeldung erhälst ist in 99% der Fälle ein For..next oder in if..endif nicht korrekt abgeschlossen worden.
Bei dir ist nun 2 * for angefangen (ohne ein next, dass hast du nach dem endif. Vermute dass du beide forschleifen damit abschliessen wolltest. das geht so aber 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 |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] LoopSound music ; Das hier
PlaySound music MaskImage player, 255,253,233 Dim Rak(100,2) ; bis hierhin hat nichts in der Schleife zu suchen x = 305 ; Das hier vermutlich auch nicht y = 420 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tatsächlich hubsi! Du hattest recht. Aber nun werden die grafiken komischerweise falsch dargestelt. Als wären sie verwischt wenn sie sich bewegen. Sieht zwar toll aus aber war nicht geplannt. Als Programmierer hats man ja wirklich schwer leute. So viele probleme auf einmal. Jetzt verstehe ich endlich warum Duke nukem forever noch nicht fertig gestellt wurde. ![]() |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hört sich danach an als hättest Du kein Doublebuffering initialisiert. Versuch mal Code: [AUSKLAPPEN] Graphics 1024,768,16,1
ganz an den Anfang Deines Codes. Ansonsten kann ich keinen Fehler mehr entdecken. Wenns damit nicht funktioniert poste mal den ganzen Code.
SetBuffer BackBuffer() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] ;----------------------------------------------------------------------------------------------------- ;Space Alpha :: coded by Fortuna :: www.f-code.ch ;----------------------------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------------------------- ;loadings ;----------------------------------------------------------------------------------------------------- Graphics 1024, 768,16,1 SetBuffer BackBuffer() font = LoadFont("Neuropol",35,1,0,0) hinter = LoadImage("gfx\star.jpg") player = LoadImage("gfx\player.bmp") rakete = LoadImage("gfx\shot.bmp") rakete2= LoadImage("gfx\shot2.bmp") music = LoadSound("music.mp3") ;----------------------------------------------------------------------------------------------------- ;vorspann ;----------------------------------------------------------------------------------------------------- Cls SetFont font Text 512,384, "SPACE ALPHA ONE :: DEMO",1,1 Flip Delay 4000 Cls Text 512,384, "CODED BY IVO ALEXANDER ROSA",1,1 Flip Delay 2000 Cls Text 512,384, "special thx to SoH Clan for testing",1,1 Flip Delay 2000 Goto engine ;----------------------------------------------------------------------------------------------------- ; engine ;----------------------------------------------------------------------------------------------------- .engine Cls LoopSound music PlaySound music MaskImage player, 255,253,233 Dim Rak(100,2) x = 305 y = 420 Cls Repeat h = h-2 TileImage hinter,h,0 DrawImage player, x,y ;steuerung:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: x=MouseX() y=MouseY() Local waffe = 1 If KeyHit(31) Then waffe = 2 If KeyHit(30) Then waffe = 1 ; schuss:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: If GetMouse ()= 1 Then schuss = schuss +1 If schuss = 100 Then schuss = 1 Rak(schuss,0) = 1 Rak(schuss,1) = x+60 Rak(schuss,2) = y+20 EndIf ; Schuss zeichnen::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: For I=1 To 100 If Rak(I,0) = 1 Then Select waffe Case 1 DrawImage rakete, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 Case 2 DrawImage rakete2, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 End Select EndIf Next ; rand:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: If x<0 Then x=0 If x>985 Then x = 985 If y<0 Then y=0 If y>675 Then y=675 Flip Until KeyDown(1) Das Problem besteht leider immer noch. usserdem scheint das affenwechsel nicht zu funktionieren. Ausser ich betätige die s taste während ich schiesse. |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hier:Code: [AUSKLAPPEN] Cls
sollte wohl so aussehen:Code: [AUSKLAPPEN] Repeat Repeat
Das Goto engine ist übrigens auch für die Katz Cls ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
I weiss. Ich möchte eben danach noch n menu machen. Habe deshalb schon mal das geschrieben da das menu noch nicht steht und ich das programm oft teste. aber danke für den tip! ![]() |
||
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lol! Du bist gut! Fehler behoben. Das Bild wurde j nie gelöscht. War es deswegen? Aber was kannst du mir für das waffenwechsel empfehlen? funzt einfach nicht. | ||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mir nicht alles angeschaut, aber wenn Du dasCode: [AUSKLAPPEN] Local waffe = 1 in Deiner Hauptschleife hast, wirst Du auch nie eine andere Waffe als die 1 bekommen ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieder überascht. Ich überlege das nächste mal noch 1000 mal mehr bevor ich etwas poste. Nur etwas: Wenn die racketen oder schüsse unterwegs sind und ich da die taste drücke um die waffe zu wechseln, wechseln die schüsse noch während dem flug ihre farbe. Dabei sollten sie die farbe erst nach dem tastendruck wechseln. Aber eigentlich sind dann all meine fragen schon beantwortet. Damit kann ich mich dem rest weiter widmen. | ||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du brauchst einfach nur einen weiteren Parameter:Code: [AUSKLAPPEN] Graphics 1024, 768,16,1
Die geänderten Stellen sind kommentiert.
SetBuffer BackBuffer() font = LoadFont("Neuropol",35,1,0,0) hinter = LoadImage("gfx\star.jpg") player = LoadImage("gfx\player.bmp") rakete = LoadImage("gfx\shot.bmp") rakete2= LoadImage("gfx\shot2.bmp") music = LoadSound("music.mp3") ;----------------------------------------------------------------------------------------------------- ;vorspann ;----------------------------------------------------------------------------------------------------- Cls SetFont font Text 512,384, "SPACE ALPHA ONE :: DEMO",1,1 Flip Delay 4000 Cls Text 512,384, "CODED BY IVO ALEXANDER ROSA",1,1 Flip Delay 2000 Cls Text 512,384, "special thx to SoH Clan for testing",1,1 Flip Delay 2000 Goto engine ;----------------------------------------------------------------------------------------------------- ; engine ;----------------------------------------------------------------------------------------------------- .engine LoopSound music PlaySound music MaskImage player, 255,253,233 Dim Rak(100,3) ; geändert x = 305 y = 420 Local waffe = 1 Repeat Cls h = h-2 TileImage hinter,h,0 DrawImage player, x,y ;steuerung:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: x=MouseX() y=MouseY() If KeyHit(31) Then waffe = 2 If KeyHit(30) Then waffe = 1 ; schuss:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: If GetMouse ()= 1 Then schuss = schuss +1 If schuss = 100 Then schuss = 1 Rak(schuss,0) = 1 Rak(schuss,1) = x+60 Rak(schuss,2) = y+20 rak(schuss,3)=waffe ; eingefügt EndIf ; Schuss zeichnen::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: For I=1 To 100 If Rak(I,0) = 1 Then Select rak(i,3) ; Hier geändert Case 1 DrawImage rakete, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 Case 2 DrawImage rakete2, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 End Select EndIf Next ; rand:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: If x<0 Then x=0 If x>985 Then x = 985 If y<0 Then y=0 If y>675 Then y=675 Flip Until KeyDown(1) |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok! Es funzt und ich habe nun keine fragen mehr................... Aber wenn ich jetzt mit dem raumschiff los düse hat er keine waffe aktiviert bis ich eines der knöpfe drücke.
würde es etwas ändere wenn ich den code so ändere ? Code: [AUSKLAPPEN] If GetMouse ()= 1 Then schuss = schuss +1 If schuss = 100 Then schuss = 1 Rak(schuss,0) = 1 Rak(schuss,1) = x+60 Rak(schuss,2) = y+20 Rak(schuss,3) = waffe +1 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weise waffe einfach vor der Hauptschleife einen Wert zu, dann hast du eine Startwaffe. | ||
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 |
![]() |
f-code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab da wieder n prob....... ![]() Das Spiel läuft eigentlich wie es soll. Nur ein prob gibts. Als es noch keine gegner gab konnte man ohne weiteres schiessen und waffe ändern. Jetzt hbe ich da mal die gegner von meyer's buch (so in etwa) eingebunden und meinem spiel entsprechend verändert. Sie bewegen sich auch . Nur kommen sie nicht wieder wenn sie am linken rand vorbei sind. Und sobald ich den feuer knopf drücke kommt eine fehlermeldung " array index out of bound" oder ähnlich....... Was bedeutet das? Was ist falsch? Code: [AUSKLAPPEN] ;------------------------------------------------------------------- ; engine ;------------------------------------------------------------------- MaskImage player, 255,253,233 MaskImage explosion, 255,0,255 MaskImage alienbild,255,0,255 waffe = 1 Dim Rak(100,3) Dim Alien(5,2) Dim AlienExplodiert(5,1) x = 305 y = 420 Repeat Cls h = h-2 TileImage hinter,h,0 DrawImage player, x,y ;steuerung:::::::::::::::::::::::::::::::::::: x=MouseX() y=MouseY() If KeyHit(31) Then waffe = 1 If KeyHit(30) Then waffe = 2 ; schuss:::::::::::::::::::::::::::::::::::::::::::::::::::::: If GetMouse ()= 1 Then schuss = schuss +1 If schuss = 100 Then schuss = 1 Rak(schuss,0) = 1 Rak(schuss,1) = x+60 Rak(schuss,2) = y+20 Rak(schuss,3) = waffe EndIf ; Schuss zeichnen::::::::::::::::::::::::::::::::::::::::::::::::: For I=1 To 100 If Rak(I,0) = 1 Then Select Rak(I,3) Case 1 DrawImage rakete, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 Case 2 DrawImage rakete2, Rak(I,1), Rak(I,2) Rak(I,1) = Rak(I,1) + 10 End Select EndIf Next ; gegner::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Kollision testen For I=1 To 100 If Rak(I,0) <> 0 Then For J=1 To 6 If ImagesOverlap(alienbild, Alien(J,1), Alien(J,2), rakete, Rak(I,2),Rak(I,1)) Then Alien(J,0) = -1 EndIf Next EndIf Next ; Explosion Alien zeichnen For I=1 To 5 If Alien(I,0) = -1 Then If AlienExplodiert(I,1) + 100 < MilliSecs() Then AlienExplodiert(I,0) = AlienExplodiert(I,0) + 1 AlienExplodiert(I,1) = MilliSecs() If AlienExplodiert(I,0) = 6 Then AlienExplodiert(I,0) = 0 AlienExplodiert(I,1) = 0 Alien(I,0) = 0 EndIf EndIf DrawImage explosion, Alien(I,1), Alien(I,2), AlienExplodiert(I,0) EndIf Next ; Alien-Steuerung For I=1 To 5 If Alien(I,0) = 0 Then Alien(I,0) = Rand(100,400) Alien(I,1) = Rand(+1000,0) Alien(I,2) = Rand(+20,700) EndIf If Alien(I,0) <> -1 Then Alien(I,1) = Alien(I,1) - 1 Alien(I,2) = 320 + Sin( Alien(I,1) ) * Alien(I,0) EndIf If Alien(I,1) > 1024 Then Alien(I,0) = 0 If Alien(I,0) <> -1 Then DrawImage alienbild, Alien(I,1),Alien(I,2) Next ; rand:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: If x<0 Then x=0 If x>985 Then x = 985 If y<0 Then y=0 If y>675 Then y=675 ; ende:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Flip Until KeyDown(1) SetFont font1 Text 512,384, "Danke für das testen!",1,1 Flip Delay 5000 |
||
http://www.f-code.ch/ Schaut doch mal vorbei |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group