Player soll schießen können

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Darthshoot

Betreff: Player soll schießen können

BeitragMo, Dez 25, 2006 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Also erstmal schön hier zu sein Very Happy

Da ich schon länger mit dem Gedanken gespielt habe, Spiele zu programmieren, habe ich mir auch schon überlegt wie das erste Game aussehen sollte. Am besten das einfachste überhaupt zur Übung und so.
Ein 1D (von oben wenn ich mich net irre) Raumschiffshooter wie Chickeninvaders. Bis jetzt habe ich ein Bild, dass ich mit den Pfeilen bewegen kann, das aber nicht über den Bildschirmrand hinaus kann.

Mein eigendliches Problem ist das Schießen. Es muss irgendwie möglich sein, ein neues Bild zu erstellen, wenn die Leertaste gedrückt wird, dass dann einfach gerade hoch "läuft". Ich komm aber irgendwie nicht mit dem Buffering zurecht. Im Moment ist es so, dass er in einer Sekunde einfach nur kurz bis zum oberen Bildschirmrand lauter Bilder im Abstand von 5 Pixeln setzt, die alle sofort wieder verschwinden. (Ich nehme an nach einem Buffersflip oder so.)

Hier mal der Code: (Hab probiert das ganze mit GoSub zu machen)

Code: [AUSKLAPPEN]

; Standart-Schuss von Player1
If KeyHit(57) Then
Gosub SchussBlock
EndIf

.SchussBlock
Schuss1 = LoadImage("Schuss1.bmp")
XS = X + 24
YS = Y - 5

Repeat
YS = YS - 25
DrawBlock Schuss1, XS, YS
Until YS <= 0
Return


X und Y sind die Koordinaten vom Player. Ich muss diese leicht modifizieren, damit der Schuss auch in der spitze mit dem Lasergewehr startet. Wie geht das was ich vorhab? Ich glaub ich bin total falsch rangegangen, oder? Razz

Danke im Voraus.
MfG Darthshoot

Hagbard

BeitragMo, Dez 25, 2006 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Abfrage für den Tastendruck muss mit in die Schleife, weil sonst nur davor kurz überprüft wird.
 

Todeskop

BeitragMo, Dez 25, 2006 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
du muss dafür (um deinen player schießen beizubringen) ne komplette function machen....
les dir das demo bsp im ordner:

Blitz3D\Samples\Blitz 3D Samples\Open DNA\Artic Runner

durch dann verstehste dat vielleicht...
 

Darthshoot

BeitragMo, Dez 25, 2006 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehm ja danke erstmal für die Antworten. Ich verstehe allerdings den Grund nicht so recht, warum die Tastenabfrage mit in die Schleife soll? Die Schleife soll ja nur ausgeführt werden, wenn die Taste gedrückt wurde.

Ich bin noch ein totaler Anfänger; das Beispiel hat mir leider nicht richtig weitergeholfen :/

Hab schon einige Games und Sources im Internet durchstöbert.. aber auch noch nichts richtiges gefunden. Im Grunde muss ja erstmal nur ein Bild einfach gerade nach vorne "gehen".

NightPhoenix

BeitragMo, Dez 25, 2006 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal herzlich willkommen in unserer Community! Smile
1D Spiele gibts nicht Razz
solche spiele sind nicht 1D sondern 2D Wink
1D=1Dimensional= 1 Achse... kann ich mir grade irgend wie nicht vorstellen Very Happy
Bei 2D hast du also 2 Achsen wie im Matheunterricht Sek.1 beim Koordinatensystem (x und y) bei 3D hast du 3 Achsen (x,y,z) bei 4D gibts dann noch die Zeit... so sagt man, ist aber für programmieren völlig irrelevant

x = rechts links
y = hoch runter
z = vor zurück (in Tiefe)

MfG.
 

Darthshoot

BeitragMo, Dez 25, 2006 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehm ja stimmt ^^ aber was ist denn jetzt mit den Schüssen? Ich hab jetzt auch endlich mal ein anderes Raumschiffshooter Game gefunden, aber da ist alles viel zu kompliziert für mich. Ist es nicht irgendwie leicht möglich einen Schuss zu programmieren? Razz oder ist das eher was für Fortgeschrittene?
 

Todeskop

BeitragMo, Dez 25, 2006 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
mach erst ma die anfangs-turtrail usw....
gibt gute in www.robseite.de
oder www.blitztbase.de

ohh gemerkt das du 2d willst.... Embarassed Embarassed
geht aber fast genauso....
 

snörkl

BeitragMo, Dez 25, 2006 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
2. seite tutsection von bb --> weltraumshootertutorial.

Gut verständlich.

Bitte lern aber erst wie gesagt wurde die basics und programmiere dann erst mal was ganz simples. Ansonsten macht man die schüsse mit typs.


Ungefähr so, ist ausm kopf geschrieben:

Code: [AUSKLAPPEN]
type schuss
field x,y
end type

repeat

 if keyhit(57)
 s.schuss=new schuss
  schuss\x=playerx
  schuss\y=playery
 endif 

 for schuss=each schuss
   schuss\y=schuss\y - 3
   drawimage schussimage,schuss\x,schuss\y
   if schuss\y<1 then delete schuss
 next

until keyhit(1)
end


Bitte kopiere diesen code nicht einfach in dein spiel, du solltest erst verstehen was er überhaupt macht. Mach also auf z.B. robsite.de type-tuts, das beginner tut usw.
 

Darthshoot

BeitragMo, Dez 25, 2006 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok vielen Dank für die Hilfe. Wenn ich nicht weiter komm, melde ich mich nochmal.

EDIT: Also ich hab jetzt noch ein paar Probleme. Den Beispielcode habe ich soweit komplett verstanden. Wenn ich ihn jetzt außerhalb des Buffers hinpacke, meint er, dass Type eine Variable sein muss. Wenn ich ihn innerhalb des BufferFlip Dings hinpacke, wo auch der Spieler gerendert wird, dann meint er, man könnte das nur im Mainteil des Programms verwenden. So sieht es bis jetzt aus:

Code: [AUSKLAPPEN]
; Standart-Schuss von Player1
Schuss1 = LoadImage("Schuss1.bmp")
XS = X + 24
YS = Y - 5

Type Schuss
Field XS, YS
End Type

If KeyHit(57) Then
S.Schuss = New Schuss
Schuss \ XS = X
Schuss \ YS = Y
EndIf

For Schuss = Each Schuss
Schuss \ YS = Schuss \ YS - 3
DrawImage Schuss1, Schuss \ XS, Schuss \ YS
If Schuss \ y <= 0 Then Delete Schuss
Next


X und Y stellen wie immer die Koordinaten vom Player da und XS bzw. YS die Koordinaten vom Schuss. Was ist jetzt noch falsch? Sorry das ich so nerve, aber mir ist es wichtig schonmal wenigstens die Base für mein kleines Shootergame hinzubekommen Razz das würde mich stark motivieren.
 

FWeinb

ehemals "ich"

BeitragMo, Dez 25, 2006 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ich wolte mal eben off topic fragen

NightPhoenix

Die 4Dimenson ist doch nicht die Zeit soweit ich weis ist die 4Dimension die die mension die nicht von den anderen 3 angesprochen werden kann also z.b.
die dimenson deren achse auf alle 3 andren senkrecht zeigt ohnen gekrümt zu sein hört sich unmöglich an aber es ist möglich

aber egal ich wolte es nur mal loswerden (unser Mathe lehrer meite das auch mit der zeit aber die Mathematiik sagt was anderes )
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Hagbard

BeitragMo, Dez 25, 2006 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, wenn ihr im sagt, dass er erst die Grundlagen lernen soll, ist es doch nicht so sinnvoll ihm gleich Types als Lösungsansatz zu präsentieren.

Die Abfrage muss in die Schleife, damit bei jedem Schleifendurchgang abgefragt wird, ob ein Tastendruck vorliegt.
Wenn du erst nach dem tastendruck diese Schleife beginnen lässt, muss das auch als Bedingung machen, also

If Tastendruck = 1 Then
Gehe Schleife durch... blablabla
EndIf

Doch dies an sich muss wegen den oben genannten Gründen auch in eine Schleife.
Doch hier einfach erstmal ein einfaches Beispiel.

Graphics 640, 480, 16, 2
Setbuffer Backbuffer()

objekt = LoadImage("objekt.bmp")

Repeat
Cls

DrawImage objekt, x, y

If KeyDown(57) Then
Y = Y + 1
EndIf


Flip
Until KeyHit(1)
End


Das ist der erste Schritt.
Du willst aber nicht nur 1 Torpedo abschießen, sondern bestimmt eine ganze Menge.
Dies lässt sich erstmal gut mit Feldern lösen.

also erstellst du es vor der Hauptschleife:
Dim torpedo(10, 3) ; die beiden Zahlen fragst du in einer For ... Next Schleife ab:

Code: [AUSKLAPPEN]
For I = 1 To 10

If KeyDown(57) Then

  torpedo(I, 1) = 1          ; der Zustand wird auf 1, True gesetzt, abschuss
  torpedo(I, 2) = x + 10   ; 2 sind die x werte
  torpedo(I, 3) = y - 10    ; 3 sind die y werte

EndIf

  If torpedo(I, 1) = 1 Then ; Wenn der Zustand True ist wird sie nach vorne bewegt
    torpedo(I, 3) =     torpedo(I, 3) + 2    ;dafür die werden die y werte addiert
  EndIf

Next


Schau dir dafür einfach mal Dim-Felder an!
 

Darthshoot

BeitragMo, Dez 25, 2006 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank! Das hat mich wirklich weiter gebracht. Jetzt weiß ich auch wofür Mehrdimensionale Arrays gut sind. Very Happy

Es ging alles viel besser als ich gedacht hätte! Nur noch ein Problem: Ich kann trotz allem nur einen Schuss abgeben. Wenn ich einen zweiten abgeben will, wird der erste "zerstört" und sozusagen als zweiter neu gestartet. Woran liegt das? Ich weiß nicht ob ich dafür Code zeigen muss, denn im Grunde habe ich nichts großes verändert, außer ein

Code: [AUSKLAPPEN]
DrawBlock Schuss1, Schuss(I, 2), Schuss(I, 3)


zwischen

Code: [AUSKLAPPEN]
Schuss(I, 3) = Schuss(I, 3) - 7
DrawBlock Schuss1, Schuss(I, 2), Schuss(I, 3)
EndIf


gesetzt. Damit der Schuss auch gerendert wird Razz hmm naja um ganz sicher zu gehen:

Code: [AUSKLAPPEN]

; Standart-Schuss von Player1
Dim Schuss(10, 3)
Schuss1 = LoadImage("Schuss1.bmp")


; Initialisiere Bufferschleife
Repeat
Cls


; Schuss1 aktivieren

XS = X + 24
YS = Y - 5

For I = 1 To 10

If KeyDown(57) Then
Schuss(I, 1) = 1
Schuss(I, 2) = XS
Schuss(I, 3) = YS
EndIf

If Schuss(I, 1) = 1 Then
Schuss(I, 1) = 1
Schuss(I, 3) = Schuss(I, 3) - 7
DrawBlock Schuss1, Schuss(I, 2), Schuss(I, 3)
EndIf

Next

; Render Player1
Player1 = LoadImage("Player1.bmp")
MaskImage Player1, 255, 0, 255
DrawImage Player1, X, Y

Flip
Until KeyHit(1)


Woran liegts?

P.S. Ich hab den Player1 mitgepostet, weil ich mal fragen wollte, ob man das LoadImage nicht über die Bufferschleife anbringen kann?

EDIT: Hab gerade die For Schleife entfernt und sah, dass es keinen Effekt hatte. Das bedeutet die Schleife tut nicht das was sie soll. Aber so weit bin ich noch nicht in BB, dass ich so einen Fehler erkennen könnte. Werde mich auf jedenfall weiter dahinter setzen, aber wenn ihr mir das sagen könntet wär ich total dankbar Razz

EDIT2: Ehm halt. Ich wollte einen Schuss pro Drücken haben. Also KeyHit und nicht KeyDown. Das Problem besteht aber weiterhin.

Hagbard

BeitragMo, Dez 25, 2006 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, kein wunder, wenn du

Drawimage schuss1, schuss(I, 2), schuss(I, 3) schreibst.

Hier zeichnest du ja nur den schuss eins...
Du musst schuss(I, 1) zeichnen...
 

Darthshoot

BeitragDi, Dez 26, 2006 8:52
Antworten mit Zitat
Benutzer-Profile anzeigen
schuss(I, 1) hat nur den Wert 1. Da gibts nicht viel zu zeichnen. Oder hab ich das nur falsch verstanden?

EDIT: Also ich hab jetzt schon sehr viel rumprobiert und ich glaube es handelt sich hier einfach nur um einen Denkfehler. Ich hab ja nur EINEN Schuss, der in der Variable Schuss1 gespeichert ist. Ich kann also garnicht unendlich viele Schüsse abgeben, wenn ich nur einen einzigen habe. Aber wie geht das denn jetzt was ich will? Sad Ich komm nicht weiter.

EDIT: ICH HABS JUHU!!! Very Happy DANKE AN ALLE! Aber kann man diesen Code nicht noch ein wenig optimieren? Er ist nämlich ehm ziemlich improvisiert...

Code: [AUSKLAPPEN]
; Standart-Schuss von Player1
Dim SchussB(20, 3)
For S = 1 To 20
SchussB(S, 1) = LoadImage("Schuss1.bmp")
Next
Dim Schuss(20, 3)
I = 0

...

; Initialisiere Bufferschleife
Repeat
Cls

...

; Schuss1 aktivieren
If KeyHit(57) Then
PlaySound(Schuss1Sound)
If I = 20 Then I = 0
I = I + 1
Schuss(I, 1) = 1
Schuss(I, 2) = X + 24
Schuss(I, 3) = Y - 5
EndIf

For T = 1 To 20
If Schuss(T, 1) = 1 Then
Schuss(T, 3) = Schuss(T, 3) - 8
DrawBlock SchussB(T, 1), Schuss(T, 2), Schuss(T, 3)
EndIf
Next

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group