Spiel Fragen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Elias0111

Betreff: Spiel Fragen

BeitragSa, Jan 05, 2013 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich habe noch ein paar Fragen zu einem Spiel welches ich gerade programmiere.
Es ist mein erstes Spiel, deshalb ist ist es noch sehr einfach strukturiert und ist auch nicht so spannend.. Wink
Aber man fängt ja klein an!

Na ja: Der Sinn des Spiels ist es mit zwei Panzern die sich links und rechts hinundher bewegen abzuschießen wenn man nicht trifft bleibt der Ball im Spiel und Prallt von den Wänden ab. Falls einer der Panzer getroffen werden sollte, soll die Kugel selbstverständlich verschwinden und die Punkteanzeige um eins erhöht werden.

Bisher bin ich soweit:


BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

SetBuffer BackBuffer()

;y-werte
y1= 300 ;kanonenrohr Panzer1
y2= 300 ;kanonenrohr Panzer2
p1= 275 ;Panzer 1
p2= 275 ;Panzer 2
k1= 295 ;Kugel

;x-werte
x1= 85 ;kugel

;Geschwindigkeiten
gx= 5
gy= 0

SeedRnd MilliSecs ()
v= Rnd(-2,2)


While Not KeyHit(1)
Cls

;Panzer 1
Rect 10, p1, 50, 50, 2
Line 60, y1, 80, y1

;Panzer 2
Rect 740, p2, 50, 50, 2
Line 720, y2, 740, y2

;Aussenbegrenzung
Rect 0, 0, 800, 5, 2 ;oben
Rect 0, 0, 5, 600, 2 ;links
Rect 0, 595, 800, 5, 2 ;unten
Rect 795, 0, 5, 600, 2 ;rechts

;Panzer 1
If KeyDown (208) And y1=<570 Then
y1=y1+1
p1=p1+1
End If

If KeyDown(200) And y1=>25 Then
y1=y1-1
p1=p1-1
EndIf

;Panzer 2
If KeyDown(2) And y2=<570 Then
y2=y2+1
p2=p2+1
EndIf

If KeyDown(3) And y2=>25 Then
y2=y2-1
p2=p2-1
EndIf

Oval x1, k1, 10, 10
x1=x1 + gx
k1=k1 + gy

;kollision vom ball mit Blöcken
If k1 > 590 Then
gy = -5
EndIf
If k1 < 10 Then
gy = +5
EndIf
If x1 > 790 Then
gx = -5
gy = v
EndIf
If x1 < 10 Then
gx= +5
EndIf


Flip

Wend


End


Könnt ihr mir bitte Tipps geben wie ich das mit dem losschicken der Kugel mache und mit dem Auflösen.

Vielen dank schonmal im voraus!

Edit durch BladeRunner: Habe mir erlaubt deine ColorTags durch Syntaxtags zu ersetzen. Macht das Posting wesentlich übersichtlicher, nutz besser die.

BladeRunner

Moderator

BeitragSa, Jan 05, 2013 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir auf jeden Fall direkt ins Auge springt ist das deine Variablennamen recht nichtssagend sind. Es ist zwar ein wenig mehr Tipparbeit, aber ein längerer, aussagekräftiger Name hilft einem beim Fehlersuchen enorm.
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

ZEVS

BeitragSa, Jan 05, 2013 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktionsweise des Spiels ist mir nicht ganz klar: Du schreibst, es gibt eine Kugel. Diese ist, wie es scheint, die ganze Zeit irgendwo vorhanden. Die Panzer sollen diese aber - irgendwie - beeinflussen können. Meiner intuitiven Vorstellung nach schießen die Panzer unabhängig, d.h., es kann mehrere Kugeln gleichzeitig (oder auch gar keine) geben. In diesem Falle arbeitest du besser mit Types. Oder rate ich falsch?

ZEVS
 

Elias0111

BeitragSa, Jan 05, 2013 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ZEVS hat Folgendes geschrieben:
Die Funktionsweise des Spiels ist mir nicht ganz klar: Du schreibst, es gibt eine Kugel. Diese ist, wie es scheint, die ganze Zeit irgendwo vorhanden. Die Panzer sollen diese aber - irgendwie - beeinflussen können. Meiner intuitiven Vorstellung nach schießen die Panzer unabhängig, d.h., es kann mehrere Kugeln gleichzeitig (oder auch gar keine) geben. In diesem Falle arbeitest du besser mit Types. Oder rate ich falsch?

ZEVS


Ja du hast recht ich möchte das der Panzer unabhängig schießen kann.
 

MCocktail

BeitragSa, Jan 05, 2013 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach Zevs Vorschlag würde der Code für die Kugel so aussehen, vermut ich mal:

Code: [AUSKLAPPEN]

Type TKugel
 Field x
 Field y
 Field def;(op. von wem der schuss kam)
End Type

If Keydown("Schusstaste") then
 Kugel.TKugel = New TKugel
EndIf

For Kugel.TKugel Each TKugel
 ;(durchchecken der kugeln und positionieren)
Next


oder? Wenn ja kannst du dich daran orientieren wenn nötig.
 

Elias0111

Betreff: Re: Spiel Fragen

BeitragSa, Jan 05, 2013 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

SetBuffer BackBuffer()

;y-werte
y1= 300 ;kanonenrohr Panzer1
y2= 300 ;kanonenrohr Panzer2
p1= 275 ;Panzer 1
p2= 275 ;Panzer 2
k1= 295 ;Kugel
pu1= 0
pu2= 0

;x-werte
x1= 85 ;kugel
pax=10
pay= 50

;Geschwindigkeiten
gx= 3
gy= 0

SeedRnd MilliSecs ()
v= Rnd(-2,2)



While Not KeyHit(1)
Cls

;Panzer 1
Rect pax, p1, 50, 50, 2
Line 60, y1, 80, y1

;Panzer 2
Rect 740, p2, 50, 50, 2
Line 720, y2, 740, y2

;Aussenbegrenzung
Rect 0, 0, 800, 5, 2 ;oben
Rect 0, 0, 5, 600, 2 ;links
Rect 0, 595, 800, 5, 2 ;unten
Rect 795, 0, 5, 600, 2 ;rechts

;Panzer 1
If KeyDown (208) And y1=<570 Then
y1=y1+3
p1=p1+3
End If

If KeyDown(200) And y1=>25 Then
y1=y1-3
p1=p1-3
EndIf

;Panzer 2
If KeyDown(2) And y2=<570 Then
y2=y2+3
p2=p2+3
EndIf

If KeyDown(3) And y2=>25 Then
y2=y2-3
p2=p2-3
EndIf

Oval x1, k1, 10, 10
x1=x1 + gx
k1=k1 + gy

;kollision vom ball mit Blöcken
If k1 > 590 Then
gy = -5
EndIf
If k1 < 10 Then
gy = +5
EndIf
If x1 > 790 Then
gx = -5
gy = v
EndIf
If x1 < 10 Then
gx= +5
EndIf

;kollision vom ball mit den Panzern

;Panzer1
If x1 = 60 And k1 > p1 And k1 < p1 + 50 Then ;rechts
pu1= pu1 +1
gx= +3
EndIf
If x1 = 10 And k1 > p1 And k1 < p1 +50 Then ;links
pu1= pu1+1
gx= -3
EndIf
If p1 -1 < k1 < p1 +2 And x1 > 10 And x1 < 60 Then ; oben
pu1 = pu1 +1
gy= -3
EndIf
If p1 + 49 < k1 < p1+52 And x > 10 And x1 < 60 Then ;unten
pu1 = pu1 +1
gy= +3
EndIf

;Panzer2
If x1 = 790 And k1 > p2 And k1 < p2 + 50 Then
pu2= pu2 +1
gx = +3
EndIf
If x1 = 740 And k1 > p2 And k1 < p2 +50 Then
pu2=pu2+1
gx = -3
EndIf
If k1 > p2 And x1 > 740 And x1 < 790 Then
pu2 = pu2 +1
gy = +3
EndIf
If k1= p2 + 50 And x > 740 And x1 < 790 Then
pu2 = pu2 +1
gy=-3
EndIf



Text 400, 50, pu2 + " : " + pu1

Flip

Wend

Sorry hab das mit den type nicht ganz verstanden hab es jetz mal so umgebaut habe unten bei der kollision mit den panzer es einen punkt geben und die kugel abtitscht es funktioniert nur nicht ganz
 

Elias0111

BeitragSa, Jan 05, 2013 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
MCocktail hat Folgendes geschrieben:
Nach Zevs Vorschlag würde der Code für die Kugel so aussehen, vermut ich mal:

Code: [AUSKLAPPEN]

Type TKugel
 Field x
 Field y
 Field def;(op. von wem der schuss kam)
End Type

If Keydown("Schusstaste") then
 Kugel.TKugel = New TKugel
EndIf

For Kugel.TKugel Each TKugel
 ;(durchchecken der kugeln und positionieren)
Next


oder? Wenn ja kannst du dich daran orientieren wenn nötig.


Was meinst du mit def?
 

Elias0111

BeitragSa, Jan 05, 2013 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder kannst du das ganze alles nochmal einwenig genauer erklären wenn es nicht zuviel aufwand ist ?

Xeres

Moderator

BeitragSa, Jan 05, 2013 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
@Elias0111: Bitte zitiere a) nicht den gesamten vorhergehenden Beitrag - es ist ziemlich klar, auf was du dich beziehst und b) vermeide bitte Doppelposts, für zusätzliche Informationen gibt es den Edit Button.
Danke.

Types sind toll und nützlich, aber ich würde sie nicht unbedingt einem blutigem Anfänger empfehlen... Lies ein paar Tutorials dazu, das wird mehr bringen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sir Gauss der III

BeitragSa, Jan 05, 2013 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zuerst mal, was bisher genannt wurde sind wirklich hilfreiche Tipps, z.B. das Kommentieren und die Variablenamen.
Code: [AUSKLAPPEN]
;Panzer 1
If KeyDown (208) And y1=<570 Then
y1=y1+1
p1=p1+1
EndIf

If KeyDown(200) And y1=>25 Then
y1=y1-1
p1=p1-1
EndIf

ist so besser zu verstehen:
Code: [AUSKLAPPEN]
;Steuerung von Panzer 1
If KeyDown(208) And y1=<570 Then ;runterfahren des Panzer 1 mit Pfeiltaste runter
   Rohr_y1=Rohr_y1+1
   Panzer_y1=Panzer_y1+1
EndIf

If KeyDown(200) And y1=>25 Then ;rauffahren des Panzer 1 mit Pfeiltaste rauf
   Rohr_y1=Rohr_y1-1
   Panzer_y1=Panzer_y1-1
EndIf

Durch die Kommentare erkennt nun jeder, was ein in sich geschlossener Codeblock tun soll. Die Variablenamen sind nun eindeutiger, und du verwechselst sie dann seltener.
Dann habe ich noch jeden Codeblock eingerückt. So erkennt man schneller was zusammengehört und wo eine Schleife/If-Satz endet.
Auch wichtig, meiner Meinung nach, dass man bei Keydown() immer dazunotiert welche Taste denn gemeint ist.

Das erst mal vorab.

Wie Xeres gesagt hat, Typen sind ganz nützlich, aber ich würde sie zu beginn nicht verwenden. Verwende Dim-Felder.

Was ist Dim? mit Dim kannst du Variable einfach nummerieren. Anstelle von
Code: [AUSKLAPPEN]
y1=300
y2=300

schreibst du
Code: [AUSKLAPPEN]
Dim y(10)
y(1)=300
y(2)=300

Das schaut jetzt nach mehrarbeit aus. Der Vorteil bei Dimfeldern liegt vor allem darin, dass das Programm selbstständig nie Nummern auswählen kann.
Due willst mehr als eine Kugel. Die Kugelvariable ist K1. Um nun nach deinem System sagen wir mal 20 Kugeln zu produzieren müsstest du 20 mal
K1=..
K2=..
schreiben. mit Dim kannst du das den PC machen lassen:
Code: [AUSKLAPPEN]
Dim k(20)

For i=1 To 20
   k(i)=295
Next

For-Schleifen kennst du hoffentlich? ansonsten: Forschleifen zählen einfach immer in einer Variable eins höher und enden dann bei der angegebenen Größe (in unserem Fall steigt "i" immer um +1 höher und die Schleife weiderholt sich bis i=20.

Mit ein Paar Dim-Variable kannst du so jedem Panzer einige Schuss geben, und diese in jeder Runde durchrechnen lassen.
Ich lebe in meiner eigenen Welt. Das ist OK, man kennt mich dort.

Midimaster

BeitragSo, Jan 06, 2013 4:39
Antworten mit Zitat
Benutzer-Profile anzeigen
zunächst einmal mein erster Tipp:
Befolge die Tipps von den Helfenden, wenn du sie bereits verstanden und eingesehen hast. Du hast Deinen Beitrag zwar ein zweites Mal gepostet. Man kann aber nirgendwo sehen, dass Du das mit den verständlicheren Variablennamen umgesetzt hast.

mein zweiter Tipp:
Befolge den Tipp nicht, wenn du ihn nicht verstanden hast. Also erst mal keine TYPES und auch keine DIM, weil du das sicherlich alles noch gar nicht kennst, oder?

mein dritter Tipp:
Erst mal Lob vorneweg: Dein Spiel läuft schon an!!! Respekt!!! Du machst das genau richtig. Erst mal die Grundfunktionen mit ganz wenig Features zum Laufen bringen!

mein vierter Tipp:
Das Panzerrohr hat ja eine Y-Koordinate (bei dir noch y1). Egal wo nun der Panzer steht, der Panzer-Körper ist doch dann immer genau 25 pixel oberhalb vom Rohr zu malen, oder? Also brauchen wir gar keine extra Variable für den Panzer:

BlitzBasic: [AUSKLAPPEN]
;Panzer I
Rect 10, y1-25, 50, 50, 2
Line 60, y1, 80, Y1


Nun kommt doch so ein Kugel immer aus dem Panzerrohr raus, oder? Also auch genau bei y1

Da die Kugel einen Durchmesser von 10 hat, malen wir sie ab sofort immer 5 zu weit nach links und zu weit nach oben. So ist ihr Mittelpunkt ab jetzt auch ihr Bezugspunkt. Jetzt kommt sie wirklich mit ihrer Mitte aus der Mitte des Rohrs.

BlitzBasic: [AUSKLAPPEN]
     Radius=5
Oval x1-Radius, k1-Radius, 2*Radius, 2*Radius

ja, wir führen eine neue Variable Radius ein. Sie wird uns später nützen!!!



Wenn man eine Taste <K> drückt wird bei y1, also an der Rohrspitze, eine Kugel gestartet:

BlitzMax: [AUSKLAPPEN]

KEY_K=37
If KeyHit(KEY_K) Then
k1=y1
X1=80
gy=0
gx=3
EndIf



Nun die Kollision

Die Kugel soll dann getroffen haben, wenn Sie eines der Panzer-Rechecke berühren kann. Da die Kugel einen Radius von 5 hat, trifft sie also schon, wen sie dem Panzer auf 5 pixel zu nahe gekommen ist.

BlitzBasic: [AUSKLAPPEN]
If x1<50+Radius
If (k1>y1-25-Radius) And (k1<y1+25+Radius)
x1=400
K1=300
gx=0
gy=0
pu1=pu1+1
EndIf
EndIf

durch das 300/400 stellen wir die Kugel zunächst mal ruhig! Später wird uns noch was besseres einfallen....

So nun machst Du das Ganze auch für Panzer II und dabei darfst Du jetzt folgende Variablen umbenennen:

Aus x1 wird bitte KugelX
Aus k1 wird bitte KugelY
Aus y1 wird bitte Panzer_I_Y
Aus gx wird bitte SpeedKugelX
Aus gy wird bitte SpeedKugelY
Aus pu1 wird bitte PunkteSpieler_I


mehr Tipps gibt's, wenn du die Namensänderung durchziehst!


Hier noch was kleines als Nachschlag:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

SetBuffer BackBuffer()
y1= 300
Panzer_I_X%=5
Panzer_I_Y%=300

Panzer_II_X%=705
Panzer_II_Y%=400


While Not KeyHit(1)
ClsColor 5,55,0
Cls


DrawPanzer Panzer_I_X,Panzer_I_Y,1
DrawPanzer Panzer_II_X,Panzer_II_Y,-1

If KeyDown (208) And Panzer_I_Y=<570 Then
Panzer_I_Y=Panzer_I_Y+3
ElseIf KeyDown (200) And Panzer_I_Y=<570 Then
Panzer_I_Y=Panzer_I_Y-3
End If

Flip 1

Wend


Function DrawPanzer(X%,Y%,R%)

; fahrzeug
Color 55,55,55
Rect X, Y-20, 60, 40, 2

Color 99,99,99
Rect X, Y-16, 59, 32, 2

;aufbau
Color 55,55,55
Oval X+9,Y-17,40,30
Color 111,111,111
Oval X+11,Y-15,40,30

;Rohr
If R=-1
X=X-60+30
Else
X=X+30
EndIf
Color 50,50,50
Rect X, Y-3, 60, 7
Color 99,99,99
Rect X, Y-2, 60, 5
Color 150,150,150
Rect X, Y, 60, 3
Color 200,200,200
Rect X, Y, 60, 1
End Function
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

MCocktail

BeitragSo, Jan 06, 2013 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Elias0111 hat Folgendes geschrieben:
Was meinst du mit def?


def ist eine abkürzung von Definition, in diesem Fall von wem der schuss kam.(optional.)
 

Elias0111

BeitragDo, Jan 10, 2013 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen!
Ich bin erst jetzt wieder dazu gekommen da ich im Urlaub war und auch ziemlich viel zu tun hatte.
Hier ist jetzt meine neueste Version wo ich eure Tipps eingebaut. Danke dafür schonmal!
Nur das mit der Graphik habe ich noch nicht angepasst, da ich das einwenig kompliziert fande und das einfach am Schluss mache..

Meine Fragen sind Jetzt:
1. Muss ich Um mehrere Kugeln zuhaben neue Koordinaten machen?
2. Wie schaffe ich es das die Kugel sich löscht und nur aufkommt wenn ich k drücke?
3. Irgendwie hab ich noch ein Problem mit der Geschwindigkeit nach seitenabprall.


BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

SetBuffer BackBuffer()

;y-werte
Panzer_I_Y= 300 ;kanonenrohr Panzer1
Panzer_II_Y= 300 ;kanonenrohr Panzer2
KugelY= 300 ;Kugel

;x-werte
KugelX= 400 ;kugel

;Geschwindigkeiten
SpeedKugelX = 0
SpeedKugelY = 0

;Andere
Radius= 5
PunkteSpieler_I=0
PunkteSpieler_II=0

SeedRnd MilliSecs ()
v= Rnd(-2,2)


While Not KeyHit(1)
Cls

;Panzer 1
Rect 10, Panzer_I_Y-25, 50, 50, 2
Line 60, Panzer_I_Y, 80, Panzer_I_Y

;Panzer 2
Rect 740, Panzer_II_Y-25, 50, 50, 2
Line 720, Panzer_II_Y, 740, Panzer_II_Y

;Aussenbegrenzung
Rect 0, 0, 800, 5, 2 ;oben
Rect 0, 0, 5, 600, 2 ;links
Rect 0, 595, 800, 5, 2 ;unten
Rect 795, 0, 5, 600, 2 ;rechts

;Panzer 1
If KeyDown (208) And Panzer_I_Y=<570 Then ;Taste Pfeiltaste Runter
Panzer_I_Y=Panzer_I_Y+1

End If

If KeyDown(200) And Panzer_I_Y=>25 Then ;Taste Pfeiltaste Raus
Panzer_I_Y=Panzer_I_Y-1

EndIf

;Panzer 2
If KeyDown(2) And Panzer_II_Y=<570 Then
Panzer_II_Y=Panzer_II_Y+1

EndIf

If KeyDown(3) And Panzer_II_Y=>25 Then
Panzer_II_Y=Panzer_II_Y-1

EndIf

;Kugel1

Oval KugelX-Radius, KugelY-Radius, 2*Radius, 2*Radius
KugelX=KugelX+ SpeedKugelX
KugelY=KugelY + SpeedKugelY


;Abschuss
If KeyHit(37) Then ;Taste Für Schuss ist K
KugelY=Panzer_I_Y
KugelX=80
SpeedKugelX = 3
SpeedKugelY= 0
EndIf


;kollision vom ball mit Blöcken
If KugelY > 590 Then
SpeedKugelY = -5
EndIf
If KugelY < 10 Then
SpeedKugelY = +5
EndIf
If KugelX > 790 Then
SpeedKugelX = -5
SpeedKugelY = v
EndIf
If KugelX < 10 Then
SpeedKugelX = +5
EndIf


;Kollision mit Panzer1
If KugelX < 50 + Radius
If (KugelY>Panzer_I_Y-25-Radius) And (KugelY<Panzer_I_Y+25+Radius)
KugelX=400
KugelY=300
SpeedKugelX=0
SpeedKugelY=0
PunkteSpieler_I=PunkteSpieler_I +1
EndIf
EndIf

;Kollision mit Panzer2
If KugelX > 750 + Radius
If (KugelY>Panzer_II_Y-25-Radius) And (KugelY<Panzer_II_Y+25+Radius)
KugelX=400
KugelY=300
SpeedKugelX=0
SpeedKugelY=0
PunkteSpieler_II=PunkteSpieler_II+1
EndIf
EndIf



Text 400, 50, PunkteSpieler_II + " : " + PunkteSpieler_I


;Kollision mit Panzern:

Flip

Wend


End

Sir Gauss der III

BeitragFr, Jan 11, 2013 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Vor ab mal echt ein Lob. Man sieht es selten dass anfänger doch so recht gutlaufende Programme machen.

Dann eine kleine bitte meinerseits, k.A. obs an mir liegt und ich da was falsch mache oder ob es tatsächlich so ist. wenn du statt dem BB code einfach den Codebutten drückst um dein Programm ein zu stellen, taucht bei mir nicht hinter jedem Befehl z.B. so was auf: BackBuffer </help/BackBuffer/>() und ich muss nicht dein ganzen Cod durch gehen und es raus löschen.

Die fragen mal etwas durcheinander, das einfache vorne, und dann immer weiter.

#Frage 2
Wenn du in einer Variablen, z.B. schuss_exist abspeicherst ob der schuss tatsächlich vorhanden ist oder nicht kannst dudas recht einfach handhaben. hat die Variable den wert 1, dann wird der schuss gezeichnet, bewegt und auf kollision geprüft. andernfals eben nicht.

#Frage 3
zuerst mal, einen Fehler zu finden ist die hauptaufgabe eines Programmierers. Bzw. das optimieren. Hört sich traurig an, ist aber leider so. einen Code zu schreiben ist schnell mal gemacht, einen winzigen Fehler zu finden kann schon mal Tage und wochen dauern. Um also die falsche Geschwindigkeit zu korrigieren (ich geh mal davon aus dass der Schuss zu schnell ist) musst du follgendes machen:
1. überleg dir, was alles das aufgetretene Problem beeinflussen kann.
Hier bei dem Beispiel ist es ja noch nicht viel.
Variable: Du hast zum einen die gespeicherte Geschwindigkeiten in X und Y, dann noch eine Zufallsvariable v (übrigens, ganz schlechter Name)
Programmabschnitt: geändert werden diese Variable in den Codabschnitte
Geschwindigkeiten
Abschuss
kollision vom ball mit Blöcken
Kollision mit Panzer1
Kollision mit Panzer2
allso muss in einem Abschnitt davon der Fehler liegen. Streichen wir mal die, von denen wir sicher sein können dass Sie es nicht sind:
Geschwindigkeiten -> wird nur auserhalb der Hauptschleife ausgeführt und setzt die Geschwindigkeit auf null.
Abschuss -> Die Geschwindigkeiten erhalten eine exakte Definition die immer gleich ist.
Kollisionen -> Hier wird die geschwindigkeit auf Null gesetzt, kann es alo nicht sein.
Übrig bleibt: Abschuss
2. Verfolge den Programmvorgang
Das kannst du einmal im Kopf machen in dem du die zeilen liest, dir ausrechnest wann der PC was genau macht. Kann manchmal hilfreich sein und mit etwas Übung findet man auch relativ schnell die unstimmigkeiten.
Oder du lässt dir mittels Text an einer bestimmten Stelle (am besten dort wo der Fehler auftreten muss) den Wert der Variable anzeigen. Also in etwa so:
Code: [AUSKLAPPEN]

;kollision vom ball mit Blöcken
If  KugelY > 590 Then
SpeedKugelY = -5
EndIf 
If  KugelY < 10 Then 
SpeedKugelY = +5
EndIf 
If KugelX > 790 Then
SpeedKugelX = -5
SpeedKugelY = v
EndIf 
If  KugelX < 10 Then 
SpeedKugelX = +5
EndIf
Text 10,10, SpeedKugelX

Oder, manchmal besser: du lässt dir den Wert der Variable im Debugprogramm anzeigen (Haken bei BB unter Program-> Debug Enable? setzen) mittels DebuglogDebuglog schreibt einen Wert oder einen Text auf die Debugausgabe.
Code: [AUSKLAPPEN]
If  KugelX < 10 Then 
SpeedKugelX = +5
EndIf
Text 10,10, SpeedKugelX
DebugLog SpeedKugely

Wenn du es so machst, wirst du schnell sehen, dass deine geschwindigkeit immer maximal 5 ist. MOMENT: Maximal 5 in jede Richtung! Heißt im Klartext wenn der Schuss sich gerade +5 in x bewegt und oben oder unten an den Rand trifft, bewegt er sich zusätzlich +5 in der Y richtung also 10 Pix pro Zug. Und da 10 gleich doppelt so schnell ist wie 5 erkennt man das auch deutlich.

3. Finde eine Lösung
Um das zu vermeiden kannst du die gegebenen Geschwindigkeiten entweder per Hand so einstellen dass Sie gleichmäßig wirken (z.B. nur noch +2 in Y) oder du lässt einen Schuss immer aus der selben Geschwindigkeitsanzahl berechnen. Bsp:
Code: [AUSKLAPPEN]
If  KugelY < 10 Then
   SpeedKugelY =7-SpeedKugelX
EndIf 

So ergibt Speed y+x immer 7, egal wie schnell x im moment ist und der schuss bewegt sich immer 7 Pix weit.
Wie genau du es löst ist geschmackssache.

# Frage 3
So, die ist etwas umfangreicher. Denn ja, für jede neue Kugel brauchst du sämtliche Kugelbetreffende Variable nochmals. Also
Geschwindigkeit (x,y)
Position (x,y)

bei zwei Kugeln schaut es dann so aus
Code: [AUSKLAPPEN]
KugelY1= 300 ;Kugel
KugelY2= 300 ;Kugel

;x-werte
KugelX1= 400 ;kugel
KugelX2= 400 ;kugel

;Geschwindigkeiten
SpeedKugelX1 = 0
SpeedKugelY1 = 0
SpeedKugelX2 = 0
SpeedKugelY2= 0

Auch die berechnungen musst du dann für jede Kugel einzeln übernehmen. (Treffen, erstellen, löschen, Bewegen, Richtung ändern)

Auch wenn ich dafür bin, immer erst einfache Schritte zu machen, so empfehl ich doch dir malDim an zu schauen und damit zu arbeiten. Wenn du hier das Prinzip verstanden hast ist es wirklich einfach.
Mal Bildlich gesprochen:
Eine Variable ist wie ein Schrank. Du legst einen Wert rein, und den kannst du immer wieder ansehen und ändern. Jeder Schrank hat so seine Bezeichnung
(Wohnzimmer). Willst du einen neuen Wert in dein Zimmer stellen, brauchst du einen neuen Schrank (Wohnzimmer_zwei)
Dim erlaubt es dir nun, in einen schrank mehrer Werte ab zu legen, im grund wie Schubladen. Du erstellst deine Variable und sagst ihr gleich wie viele Schubladen sie besitzen soll:
Code: [AUSKLAPPEN]
Dim Schrank(5)

Der Vorteil dabei ist, BB kann nun jede Variable selbst aufrufen, du musst nur die Schubladennummer nennen. Das kannst du durch eine Zählvariable machen
Code: [AUSKLAPPEN]
nr=2
text 10,10,schrank(nr)

Das an sich ist ja nichts tolles. aber wenn du 100 Schubladen hast, kannst du sie alle auflisten lassen mit nur wenig Code:
Code: [AUSKLAPPEN]
nr=0
While nr<100
   nr=nr+1
   Text 10,nr*10,schrank(nr)
whend

Diese 5 zeilen geben dir den Inhalt von 100 Variablen aus. Du kannst diese Variable also beliebig verändern bearbeiten usw.
Das einzige was du nun machen musst, ist eine neue Zählvariabel einfügen. Ideal als schleife eigenet sich hier die For-Schleifen. Diese setzen automatisch den Wert einer Variable um 1 höher. schaut dann so aus:
Code: [AUSKLAPPEN]
For nr=1 To 100
   Text 10,nr*10,schrank(nr)
Next

du gibst an, wo die zählvariable startet und bis wie weit sie zählen soll.
Wenn du es richtig anwendest kannst du mit wenig aufwand aml schnell 100 Schuss rumfliegen lassen. Als Starthilfe mal einen kleinen Teil:
Code: [AUSKLAPPEN]
;Geschwindigkeiten
Dim SpeedKugelX(100)
Dim SpeedKugelY(100)

For i=1 To 100
   SpeedKugelX(i)=0
   SpeedKugely(i)=0
EndIf

....

While Not KeyHit(1)
   
   ...
   
   For i=1 To 100
      
      ...
      
      If kugelx(i)>790 Then
         SpeedKugelX(i)=-5
         SpeedKugelY(i)=v
      EndIf
      
      ...
      
   Next

   ...

whend


Wie du siest ist noch nicht mal viel Änderung nötig um aus deinem bisherigen Code mit nur einem Schuss einen mit einer deutlich höheren Anzahl zu machen. Zugegeben, mit Type hättest du noch den Vorteil dass du die Schussanzahl nicht von vornherein festlegen musst, aber Type ist in der Anwendung etwas komplizierter.

i ist dabei nur eine untergeordnete Variable. Da eine Zählvariable nur innerhalb einer schleife wichtig ist und sie recht häufig verwendet wird sollte Ihr name (im gegensatz zu dauerhaften Variablen) nicht zu groß sein. i.d.R. werden dafür einfache Buchstaben wie i oder (mein Favorit) n genutzt.

Hoffe, das hilft.
Ich lebe in meiner eigenen Welt. Das ist OK, man kennt mich dort.

Midimaster

BeitragFr, Jan 11, 2013 0:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Zunächst eine Frage vorneweg:

Ist das gewünscht von Dir, dass die Kugel (scheinbar grundlos) ein schräge Richtung bekommt, wenn sie gerade auf eine Wand trifft? Normalerweise lässt man sie ja immer gerade zurückprallen.

Oder ist es volle Absicht?

Um die Geschwindigkeit im 2D-Raum immer gleich zu halten, benötigst Du Winkel und Sin() und Cos(). Keine Angst, Du musst es nicht verstehen, sondern nur glauben und benutzen.

Die Funktionen Sin() und Cos() können jeden Winkel so in einen X und einen Y Anteil umrechnen, dass die Geschwindigkeit immer gleich bleibt. Und das wäre genau, was Du bei Computerspielen brauchst. Denn die Kugel wird ja auf dem Bildschirm dadurch bewegt, dass man ihre X und Y Werte verändert.

folgender Zusammenhang:

Code: [AUSKLAPPEN]
Xspeed#=Sin(Winkel)
Yspeed#=Cos(Winkel)


das war's schon

Also angenommen, du willst du eine Kugel im Winkel von 67° über den Bildschirm bewegen, dann mach es so:

Code: [AUSKLAPPEN]
KugelY# = KugelY# + Cos(67)
KugelX# = KugelX# + Sin(67)


Das ganze funktioniert nur mit FLOAT Variablen, weil sowohl Sin() als auch Cos() immer ein Komma-Wert zwischen 0 und 1 ist.

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()

Repeat
   ;zum Test nacheinander einige Winkel:
   Winkel#=Winkel+30
   KugelX#=400
   KugelY#=300
   Cls
   Text 30,30, "Winkel=" + Winkel
   
   Repeat
      KugelY = KugelY + Cos(Winkel)
      KugelX = KugelX + Sin(Winkel)
      Oval KugelX, KugelY, 5,5
      Flip 0
      Delay 1 ;(dieses delay ist nur, damit diese Demo nicht zu schnell läuft)
   Until KugelY<0 Or KugelY>600 Or KugelX<0 Or KugelX>800
   
Until KeyHit(1) Or Winkel>300







So, nun könntest Du den Winkel zu jedem beliebigen Zeitpunkt ändern, und die Kugel würde sofort die neue Richtung einnehmen. Die Geschwindigkeit bleibt wegen Sin() und Cos() und eines Herrn namens Pythagoras immer gleich.

Wenn die Kugel nun irgendwo anprallt, wird der Winkel meist an der Wand "gespiegelt". Beim Anprall an einer der X-Wände passiert rein mathematisch folgendes:

Code: [AUSKLAPPEN]
NeuWinkel=360-AltWinkel


Beim Anprall an der Y-Wände passiert rein mathematisch folgendes:

Code: [AUSKLAPPEN]
NeuWinkel=180-AltWinkel



Daraus ergibt sich folgendes Demo:

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
   ;zum Test nacheinander einige beliebige Winkel:
   Winkel#=40 ;Rnd(36)*10
   KugelX#=400
   KugelY#=300
Repeat
      KugelY = KugelY + Cos(Winkel)
      KugelX = KugelX + Sin(Winkel)

      If KugelX<50 Or KugelX>750
         Winkel=360-Winkel
         KugelY = KugelY + Cos(Winkel)
         KugelX = KugelX + Sin(Winkel)
      EndIf
      If KugelY<50 Or KugelY>550
         Winkel=180-Winkel
         KugelY = KugelY + Cos(Winkel)
         KugelX = KugelX + Sin(Winkel)
      EndIf

      Cls
      Winkel=(Winkel+360) Mod 360
      Text 30,30, "Winkel=" + Winkel
      Rect 50,50,700,500,0
      Oval KugelX, KugelY, 5,5
      Flip 0
      Delay 7 ;(dieses delay ist nur, damit diese demo nicht zu schnell läuft)
   
Until KeyHit(1)
 

Elias0111

Betreff: New

BeitragSa, Jan 12, 2013 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi alle zusammen
bin nun soweit das das Spiel in etwa meinen vorstellungen entspricht.

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

SetBuffer BackBuffer()

;y-werte
Panzer_I_Y= 300 ;kanonenrohr Panzer1
Panzer_II_Y= 300 ;kanonenrohr Panzer2
KugelY1= 300 ;Kugel
KugelY2= 300

;x-werte
KugelX1= 400 ;kugel
KugelX2= 400

;Geschwindigkeiten
SpeedKugelX1 = 0
SpeedKugelY1 = 0
SpeedKugelX2 = 0
SpeedKugelY2 = 0

;Geschwindigkeit_Panzer
Geschwindigkeit_Panzer= 3
;kollision vom ball mit Blöcken Geschwindigkeit
Apprall_Geschwindigkeit= 3

;Andere
Radius= 5
PunkteSpieler_I=0
PunkteSpieler_II=0

SeedRnd MilliSecs ()
v= Rnd(-2,2)


While Not KeyHit(1)
Cls

;Panzer 1
Rect 10, Panzer_I_Y-25, 50, 50, 2
Line 60, Panzer_I_Y, 80, Panzer_I_Y

;Panzer 2
Rect 740, Panzer_II_Y-25, 50, 50, 2
Line 720, Panzer_II_Y, 740, Panzer_II_Y

;Aussenbegrenzung
Rect 0, 0, 800, 5, 2 ;oben
Rect 0, 0, 5, 600, 2 ;links
Rect 0, 595, 800, 5, 2 ;unten
Rect 795, 0, 5, 600, 2 ;rechts



;Panzer 1
If KeyDown (208) And Panzer_I_Y=<570 Then ;Taste Pfeiltaste Runter
Panzer_I_Y=Panzer_I_Y+Geschwindigkeit_Panzer

End If

If KeyDown(200) And Panzer_I_Y=>25 Then ;Taste Pfeiltaste Raus
Panzer_I_Y=Panzer_I_Y-Geschwindigkeit_Panzer

EndIf

;Panzer 2
If KeyDown(2) And Panzer_II_Y=<570 Then ;Taste 1 Runter
Panzer_II_Y=Panzer_II_Y+Geschwindigkeit_Panzer

EndIf

If KeyDown(3) And Panzer_II_Y=>25 Then ;Taste 2 Rauf
Panzer_II_Y=Panzer_II_Y-Geschwindigkeit_Panzer

EndIf

;Kugel1

Oval KugelX1-Radius, KugelY1-Radius, 2*Radius, 2*Radius
KugelX1=KugelX1+ SpeedKugelX1
KugelY1=KugelY1 + SpeedKugelY1


;Abschuss
If KeyHit(37) Then ;Taste Für Schuss ist K
KugelY1=Panzer_I_Y
KugelX1=80
SpeedKugelX1 = 3
SpeedKugelY1= 0
EndIf

;kollision vom ball mit Blöcken
If KugelY1 > 590 Then
SpeedKugelY1 = -Apprall_Geschwindigkeit
EndIf
If KugelY1 < 10 Then
SpeedKugelY1 = +Apprall_Geschwindigkeit
EndIf
If KugelX1 > 790 Then
SpeedKugelX1 = -Apprall_Geschwindigkeit
SpeedKugelY1 = v
EndIf
If KugelX1 < 10 Then
SpeedKugelX1 = +Apprall_Geschwindigkeit
EndIf


;Kollision mit Panzer1
If KugelX1 < 50 + Radius
If (KugelY1>Panzer_I_Y-25-Radius) And (KugelY1<Panzer_I_Y+25+Radius)
KugelX1=400
KugelY1=300
SpeedKugelX1=0
SpeedKugelY1=0
PunkteSpieler_I=PunkteSpieler_I +1
EndIf
EndIf

;Kollision mit Panzer2
If KugelX1 > 750 + Radius
If (KugelY1>Panzer_II_Y-25-Radius) And (KugelY1<Panzer_II_Y+25+Radius)
KugelX1=400
KugelY1=300
SpeedKugelX1=0
SpeedKugelY1=0
PunkteSpieler_II=PunkteSpieler_II+1
EndIf
EndIf


;Kugel2

Oval KugelX2-Radius, KugelY2-Radius, 2*Radius, 2*Radius
KugelX2=KugelX2+ SpeedKugelX2
KugelY2=KugelY2 + SpeedKugelY2

;Abschuss
If KeyHit(45) Then ;Taste Für Schuss ist X
KugelY2=Panzer_II_Y
KugelX2=720
SpeedKugelX2 = -3
SpeedKugelY2= 0
EndIf

;kollision vom ball mit Blöcken
If KugelY2 > 590 Then
SpeedKugelY2 = -Apprall_Geschwindigkeit
EndIf
If KugelY2 < 10 Then
SpeedKugelY2 = +Apprall_Geschwindigkeit
EndIf
If KugelX2 > 790 Then
SpeedKugelX2 = -Apprall_Geschwindigkeit
SpeedKugelY2 = +Apprall_Geschwindigkeit
EndIf
If KugelX2 < 10 Then
SpeedKugelX2 = +Apprall_Geschwindigkeit
SpeedKugelY2 = v
EndIf


;Kollision mit Panzer1
If KugelX2 < 50 + Radius
If (KugelY2>Panzer_I_Y-25-Radius) And (KugelY2<Panzer_I_Y+25+Radius)
KugelX2=400
KugelY2=300
SpeedKugelX2=0
SpeedKugelY2=0
PunkteSpieler_I=PunkteSpieler_I +1
EndIf
EndIf

;Kollision mit Panzer2
If KugelX2 > 750 + Radius
If (KugelY2>Panzer_II_Y-25-Radius) And (KugelY2<Panzer_II_Y+25+Radius)
KugelX2=400
KugelY2=300
SpeedKugelX2=0
SpeedKugelY2=0
PunkteSpieler_II=PunkteSpieler_II+1
EndIf
EndIf






Text 400, 50, PunkteSpieler_II + " : " + PunkteSpieler_I




Flip

Wend


End


Ok wir können jetzt zwei Schüsse abgeben.
Aber optimal ist das noch nicht.
Also versuche ich es jetzt mal mit Dim eure Erklärungen waren sehr hilfreich aber ganz auf dem richtigen weg bin ich immer noch nicht
Hier mal die entscheidenden Zeilen
BlitzBasic: [AUSKLAPPEN]

;Geschwindigkeiten Kugel1
Dim SpeedKugelX1(100)
Dim SpeedKugelY1(100)

For i=1 To 100
SpeedKugelX1(i)=0
SpeedKugely1(i)=0
Next

;Abschuss
If KeyHit(37) Then ;Taste Für Schuss ist K
Then For i=1 To 100 Next
KugelY1=Panzer_I_Y
KugelX1=80
SpeedKugelX1(i) = 3
SpeedKugelY1(i)= 0
EndIf


Und hier noch mal alles mit meinen versuch von dim
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

SetBuffer BackBuffer()

;y-werte
Panzer_I_Y= 300 ;kanonenrohr Panzer1
Panzer_II_Y= 300 ;kanonenrohr Panzer2
KugelY1= 300 ;Kugel
KugelY2= 300

;x-werte
KugelX1= 400 ;kugel
KugelX2= 400

;Geschwindigkeiten Kugel1
Dim SpeedKugelX1(100)
Dim SpeedKugelY1(100)

For i=1 To 100
SpeedKugelX1(i)=0
SpeedKugely1(i)=0
Next

;Geschwindigkeiten Kugel2
Dim SpeedKugelX2(100)
Dim SpeedKugelY2(100)

For n=1 To 100
SpeedKugelX2(n)=0
SpeedKugely2(n)=0
Next

;Geschwindigkeit_Panzer
Geschwindigkeit_Panzer= 3
;kollision vom ball mit Blöcken Geschwindigkeit
Apprall_Geschwindigkeit= 3

;Andere
Radius= 5
PunkteSpieler_I=0
PunkteSpieler_II=0

SeedRnd MilliSecs ()
v= Rnd(-2,2)


While Not KeyHit(1)
Cls

;Panzer 1
Rect 10, Panzer_I_Y-25, 50, 50, 2
Line 60, Panzer_I_Y, 80, Panzer_I_Y

;Panzer 2
Rect 740, Panzer_II_Y-25, 50, 50, 2
Line 720, Panzer_II_Y, 740, Panzer_II_Y

;Aussenbegrenzung
Rect 0, 0, 800, 5, 2 ;oben
Rect 0, 0, 5, 600, 2 ;links
Rect 0, 595, 800, 5, 2 ;unten
Rect 795, 0, 5, 600, 2 ;rechts



;Panzer 1
If KeyDown (208) And Panzer_I_Y=<570 Then ;Taste Pfeiltaste Runter
Panzer_I_Y=Panzer_I_Y+Geschwindigkeit_Panzer

End If

If KeyDown(200) And Panzer_I_Y=>25 Then ;Taste Pfeiltaste Raus
Panzer_I_Y=Panzer_I_Y-Geschwindigkeit_Panzer

EndIf

;Panzer 2
If KeyDown(2) And Panzer_II_Y=<570 Then ;Taste 1 Runter
Panzer_II_Y=Panzer_II_Y+Geschwindigkeit_Panzer

EndIf

If KeyDown(3) And Panzer_II_Y=>25 Then ;Taste 2 Rauf
Panzer_II_Y=Panzer_II_Y-Geschwindigkeit_Panzer

EndIf

;Kugel1

Oval KugelX1-Radius, KugelY1-Radius, 2*Radius, 2*Radius
KugelX1=KugelX1+ SpeedKugelX1(i)
KugelY1=KugelY1 + SpeedKugelY1(i)


;Abschuss
If KeyHit(37) Then ;Taste Für Schuss ist K
Then For i=1 To 100 Next
KugelY1=Panzer_I_Y
KugelX1=80
SpeedKugelX1(i) = 3
SpeedKugelY1(i)= 0
EndIf

;kollision vom ball mit Blöcken
If KugelY1 > 590 Then
SpeedKugelY1(i) = -Apprall_Geschwindigkeit
EndIf
If KugelY1 < 10 Then
SpeedKugelY1(i) = +Apprall_Geschwindigkeit
EndIf
If KugelX1 > 790 Then
SpeedKugelX1(i) = -Apprall_Geschwindigkeit
SpeedKugelY1(i) = v
EndIf
If KugelX1 < 10 Then
SpeedKugelX1(i) = +Apprall_Geschwindigkeit
EndIf


;Kollision mit Panzer1
If KugelX1 < 50 + Radius
If (KugelY1>Panzer_I_Y-25-Radius) And (KugelY1<Panzer_I_Y+25+Radius)
KugelX1=400
KugelY1=300
SpeedKugelX1(i)=0
SpeedKugelY1(i)=0
PunkteSpieler_I=PunkteSpieler_I +1
EndIf
EndIf

;Kollision mit Panzer2
If KugelX1 > 750 + Radius
If (KugelY1>Panzer_II_Y-25-Radius) And (KugelY1<Panzer_II_Y+25+Radius)
KugelX1=400
KugelY1=300
SpeedKugelX1(i)=0
SpeedKugelY1(i)=0
PunkteSpieler_II=PunkteSpieler_II+1
EndIf
EndIf


;Kugel2

Oval KugelX2-Radius, KugelY2-Radius, 2*Radius, 2*Radius
KugelX2=KugelX2+ SpeedKugelX2(n)
KugelY2=KugelY2 + SpeedKugelY2(n)

;Abschuss
If KeyHit(45) Then ;Taste Für Schuss ist X
For n=1 To 100
Next
KugelY2=Panzer_II_Y
KugelX2=720
SpeedKugelX2(n) = -3
SpeedKugelY2(n)= 0
EndIf

;kollision vom ball mit Blöcken
If KugelY2 > 590 Then
SpeedKugelY2(n) = -Apprall_Geschwindigkeit
EndIf
If KugelY2 < 10 Then
SpeedKugelY2(n) = +Apprall_Geschwindigkeit
EndIf
If KugelX2 > 790 Then
SpeedKugelX2(n) = -Apprall_Geschwindigkeit
SpeedKugelY2(n) = +Apprall_Geschwindigkeit
EndIf
If KugelX2 < 10 Then
SpeedKugelX2(n) = +Apprall_Geschwindigkeit
SpeedKugelY2(n) = v
EndIf


;Kollision mit Panzer1
If KugelX2 < 50 + Radius
If (KugelY2>Panzer_I_Y-25-Radius) And (KugelY2<Panzer_I_Y+25+Radius)
KugelX2=400
KugelY2=300
SpeedKugelX2(n)=0
SpeedKugelY2(n)=0
PunkteSpieler_I=PunkteSpieler_I +1
EndIf
EndIf

;Kollision mit Panzer2
If KugelX2 > 750 + Radius
If (KugelY2>Panzer_II_Y-25-Radius) And (KugelY2<Panzer_II_Y+25+Radius)
KugelX2=400
KugelY2=300
SpeedKugelX2(n)=0
SpeedKugelY2(n)=0
PunkteSpieler_II=PunkteSpieler_II+1
EndIf
EndIf






Text 400, 50, PunkteSpieler_II + " : " + PunkteSpieler_I


;Kollision mit Panzern:

Flip

Wend


End

Midimaster

BeitragSa, Jan 12, 2013 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
das läuft so nicht an! Check nochmal bitte CodeBox III, was du da grad reingestellt hast...


Und hier gleich mal meine Kritik:

optisch: Bitte rücke Zeilen nach einer IF-Zeile um 1 TAB nach innen ein, ebenso nach einer FOR-Zeile:
Code: [AUSKLAPPEN]
;Abschuss
   If KeyHit(45) Then ;Taste Für Schuss ist X
      For n=1 To 100
         
         KugelY2=Panzer_II_Y
         KugelX2=720
         SpeedKugelX2(n) = -3
         SpeedKugelY2(n)= 0
         
   EndIf


Das hilft Dir Fehler zu entdecken: Bei jedem Befehl, der immer einen Abschluss-Befehl braucht, wie z.B. FOR und NEXT oder wie IF und ENDIF wird der Code dazwischen um 1 TAB eingerückt.( "verschachtelt"). So fällt sofort auf, wo man das Gegenstück vergessen hat!

In CodeBox I stehen die meisten Zeilen 2x da. Ist das gewollt so?



Verbesserungsvorschläge:

Wenn Du mit so vielen Kugel hantieren willst, kommst Du an TYPEs nicht mehr vorbei. Ist aber nicht so schwer....


TYPEs sind Objekte in deinem Spiel, wie eben z.B. die Kugeln. Zunächst definierst du sie zwischen den Befehlen TYPE und END TYPE. FIELD legt dann eine Eigenschaft dieser Objekte fest.
BlitzBasic: [AUSKLAPPEN]
;Definition:
Type Kugel
Field X#, Y#, XSpeed#, YSpeed#
End Type


Dann erschaffst Du sie.
BlitzBasic: [AUSKLAPPEN]
;Erschaffen beim Abschuss
neu.Kugel = New Kugel
neu\X=720
neu\Y=Panzer_II_Y
neu\SpeedX=3
neu\SpeedY=0


Ab da agieren Sie wie von alleine.
BlitzBasic: [AUSKLAPPEN]


For jede.Kugel = Each Kugel
.....
Next




Zum Schluß entfernen wir sie wieder.
BlitzBasic: [AUSKLAPPEN]
       Delete jede


Hier ein Beispiel für alle drei Situationen

"neu" oder "jede" sind nur Platzhalter-Variablennamen. Erst der Punkt dahinter macht deutlich, das es nicht um eine Zahl oder einen String handelt, sondern um einen TYPE von Typ Kugel.

An die Parameter jeder Kugel kommt du mit dem \-Zeichen.

BlitzBasic: [AUSKLAPPEN]
;Definition:
Type Kugel
Field X#, Y#, XSpeed#, YSpeed#
End Type

;Erschaffen beim Abschuss
neu.Kugel = New Kugel
neu\X=720
neu\Y=Panzer_II_Y
neu\SpeedX=3
neu\SpeedY=0

;Bewegen, Zeichnen, Entfernen:
For jede.Kugel = Each Kugel

;bewegen
jede\X = jede\X + jede\SpeedX
jede\Y = jede\Y + jede\SpeedY

;zeichnen
Oval jede\X, jede\Y, Radius, Radius

;entfernen
;Kollision mit Panzer2
If jede\X > 750 + Radius
If (jede\Y>Panzer_II_Y-25-Radius) And (jede\Y<Panzer_II_Y+25+Radius)
Delete jede
.....

Next




Hierzu gibt es ein Tutorial von mir....

https://www.blitzforum.de/foru...hp?t=33551
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group