Mehrere Objekte eines Typs

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

relentless92

Betreff: Mehrere Objekte eines Typs

BeitragMo, Jun 28, 2010 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu,
Ich habe einen Gedankenfehler bei Types so wie es aussieht. Ich möchte gerne zwei unterschiedliche Spieler des Typs Mann erschaffen. Problem bei meinem Code: Die Spieler bewegen sich nicht unabhängig. Jemand eine Ahnung, wieso?

MfG
Relentless

Code: [AUSKLAPPEN]
Graphics 800,600,32
SetBuffer BackBuffer()
timer=CreateTimer(60)

;// CONST //;

Const KEY_RIGHT = 205
Const KEY_LEFT = 203
Const KEY_D = 32
Const KEY_A = 30

;// TYPE //;

Type bubble
   Field x,y
End Type

Type mann
   Field x,y
   Field kopfwidth,kopfheigth
   Field life
End Type

;// GLOBAL //;

Global b.bubble
Global bubblemenge

Global spielr1.mann
Global spielr2.mann

;// FALLS NOTWENDIG: EIGENSCHAFTSZUWEISUNG //;

spielr1 = New mann
   spielr1\x = 300
   spielr1\y = 475
   spielr1\kopfwidth=30
   spielr1\kopfheigth = 30
   spielr1\life = 100

spielr2 = New mann
   spielr2\x = 600
   spielr2\y = 475
   spielr2\kopfwidth=30
   spielr2\kopfheigth = 30
   spielr2\life = 100
   
;// MAINLOOP //;
Repeat

WhiteBG(800,600)
BGAllg()
Bubbles(1)
Mann(1)
Collision()

Text 700,0,bubblemenge   
Flip
Cls
WaitTimer timer
Until KeyHit(1)

;///////////////;
;// FUNCTIONS //;
;///////////////;

[...]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function Mann(Active)   ; Die Spieler, zeichnen und bewegen
If Active = 1 Then
For spielr1.mann = Each mann
   If KeyDown(KEY_D) Then
      spielr1\x=spielr1\x+3
   EndIf
   If KeyDown(KEY_A) Then
      spielr1\x=spielr1\x-3
   EndIf
   
   Oval spielr1\x,spielr1\y,spielr1\kopfwidth,spielr1\kopfheigth
   Line spielr1\x+spielr1\kopfwidth/2,spielr1\y+spielr1\kopfheigth/2,spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)+10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)-10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Text spielr1\x+2,spielr1\y+80,spielr1\life
Next

For spielr2.mann = Each mann
   If KeyDown(KEY_RIGHT) Then
      spielr2\x=spielr2\x+3
   EndIf
   If KeyDown(KEY_LEFT) Then
      spielr2\x=spielr2\x-3
   EndIf
   
   Oval spielr2\x,spielr2\y,spielr2\kopfwidth,spielr2\kopfheigth
   Line spielr2\x+spielr2\kopfwidth/2,spielr2\y+spielr2\kopfheigth/2,spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50
   Line spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50,(spielr2\x+spielr2\kopfwidth/2)+10,((spielr2\y+spielr2\kopfheigth/2)+50)+10
   Line spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50,(spielr2\x+spielr2\kopfwidth/2)-10,((spielr2\y+spielr2\kopfheigth/2)+50)+10
   Text spielr2\x+2,spielr2\y+80,spielr2\life
Next
EndIf
End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[...]
~
Fussball spielen viele, Kart fahren nur die Besten.
~

skey-z

BeitragMo, Jun 28, 2010 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
spielr1 und spielr2 sind nur instanzen vom Type mann, indem du

Code: [AUSKLAPPEN]
For spielr1.mann = each mann
... next
for spielr2.mann = each mann
...next


schreibst, gesht du jedes mal beide instanzen durch, hier müsstest du unterscheiden, welchen spieler du wie ansprichst, zb mit einem "field id" so dass du spielr1 = 1 und spielr2 = 2 zuweist und unterschiedlich bewegst
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

relentless92

BeitragMo, Jun 28, 2010 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Sprich

Type mann
[..]
Field nr
end type

und dann halt

Code: [AUSKLAPPEN]
for m.mann = each mann
 if mann\nr = 1 then
       sp1_move
 if mann\nr = 2 then
       sp2_move

Pseudocode Wink

Müsste man das dann so realisieren? Dann stellt sich mir die Frage wofür die Typenvariable for dem Punkt eigentlich gut ist?
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Neoxit

BeitragMo, Jun 28, 2010 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Um quasi die gleichen Variablen unter einer anderen "Kategorie" anzusprechen.

Nehmen wir mal ein einfaches Beispiel:

BlitzBasic: [AUSKLAPPEN]

Type fahrzeug
Field name$,geschwindigkeit#
End Type

land.fahrzeug = New fahrzeug
land\name$ = "Jeep"
lang\geschwindigkeit# = 0.93

flug.fahrzeug = New fahrzeug
flug\name$ = "Jet"
flug\geschwindigkeit# = 4.32



somit hast du als programmierer ebenfalls noch eine gute übersicht über kategorien und kannst sehen, was womit zusammenhängt und ob es in diesem fall im spiel nachher ein fluggerät oder ein landgerät ist. beides findet sich schließlich in der unterkategorie "Fahrzeug".

Ich selber benutze allerdings auch für alles und jeden ein eigenes Type Razz

NACHTRAG:
Und ja, genau so kann man soetwas realisieren, bei Types solltest du bei einer einzelnen "ansprechmöglichkeit" jeweils eine ID vergeben und wenn du genau diesen Type haben willst, kannst du mit der ID den entsprechenden Type in einer if abfrage abfragen ^^

relentless92

BeitragMo, Jun 28, 2010 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank!
Bedeutet das, um auf mein Beispiel zurückzukommen, dass ich zwar Spieler1.mann und spieler2.mann nehmen kann und durch die abfrage for spieler1.mann = each mann auch spieler2.mann anspreche? also bspweise:

Code: [AUSKLAPPEN]

For Spieler1.Mann = Each Mann
     If Spieler1\ID = 1 then       ; Spieler 1
          [...]
     Endif

     If Spieler1\ID = 2 then      ; Spieler 2
          [...]
     Endif
next


So?

P.S.: Kann man also daraus schließen das die Variable vor dem Punkt einfach nur für die Übersicht da ist und keinerlei Einfluss auf den Programmcode hat?
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Noobody

BeitragMo, Jun 28, 2010 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht, warum du hier überhaupt Each nimmst - du hast ja Spieler1 und Spieler2 schon in jeweils einer globalen Variable, da musst du nicht mehr Each benutzen, um auf die Variablen zuzugreifen.
Each verwendet man nur, wenn man auf alle Types zugreifen will.

BeispielCode: [AUSKLAPPEN]
For spielr1.mann = Each mann ;<--- Das hier wegnehmen
   If KeyDown(KEY_D) Then
      spielr1\x=spielr1\x+3
   EndIf
   If KeyDown(KEY_A) Then
      spielr1\x=spielr1\x-3
   EndIf
   
   Oval spielr1\x,spielr1\y,spielr1\kopfwidth,spielr1\kopfheigth
   Line spielr1\x+spielr1\kopfwidth/2,spielr1\y+spielr1\kopfheigth/2,spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)+10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)-10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Text spielr1\x+2,spielr1\y+80,spielr1\life
Next ;<--- Das hier auch

...und dasselbe dann für alle anderen Stellen in deinem Code.

An die anderen Helfer: Vor dem Posten doch erst mal den Code durchlesen, dann vermeidet man solche Missverständnisse Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neoxit

BeitragMo, Jun 28, 2010 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]

For Spieler1.Mann = Each Mann
If Spieler1\ID = 1 Then ; Spieler 1
[...]
EndIf

If Spieler1\ID = 2 Then ; Spieler 2
[...]
EndIf
Next


Fast genau so würde ich es machen nur würde ich es in deinem Beispiel:

BlitzBasic: [AUSKLAPPEN]

For Spieler.Mann = Each Mann
If Spieler\ID = 1 Then ; Spieler 1
[...]
;Beispiel für eine bewegung
spieler\x = spieler\x + spieler\speed
EndIf

If Spieler\ID = 2 Then ; Spieler 2
[...]
;Beispiel für eine bewegung
spieler\x = spieler\x + spieler\speed
EndIf
Next


Ich würde deinem Type wie gesagt nicht direkt den Namen "Spieler1" geben da du ja dem anscheinen nach beide Spieler die gleichen ARTEN an werte haben. Und durch diese IF abfrage kannst du in der schleife dann die einzelnen ansprechen und ab dem zeitpunkt dann auch die einzelnen anderen werte wie x und y koords z.b. wie in meinem beispiel gezeigt.

Also Quasi:

Spreche ALLE Werte aus dem Type spieler.mann an. (Die schleife)
danach konkretisiere den type den du verändern möchtest (if ID = )
in dieser konkretisierung können nun die einzelnen werte des objekts der dazugehörigen ID verändert werden (position, speed, x , y etc. pp)

Hoffe ich konnte dir helfen Wink

@ Noobody
Ja habs auch gerade gesehen ^^
Aber es führen ja bekanntlicherweise viele wege nach Rom Wink
Natürlich wenn er direkt 2 Types für die jeweiligen Spieler angelegt hat kann er sie auch direkt ansprechen ohne dafür eine for each abfrage zu nutzen, da er ja die einzelnen spieler schon im Type deklaiert hat. Aber gut habe nur mal die Variante gepostet die ich bevorzugen würde Wink

relentless92

BeitragMo, Jun 28, 2010 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt verwirrt ihr mich aber Very Happy

Ich habe EINEN Type:

Code: [AUSKLAPPEN]
Type mann
 field x,y, usw.
End Type


Von welchem ich 2 Objekte unabhängig steuern will - und zwar

Code: [AUSKLAPPEN]
Global spielr1.mann
Global spielr2.mann

;// FALLS NOTWENDIG: EIGENSCHAFTSZUWEISUNG //;

spielr1 = New mann
   spielr1\ID = 1
   spielr1\x = 300
   spielr1\y = 475
   spielr1\kopfwidth=30
   spielr1\kopfheigth = 30
   spielr1\life = 100

spielr2 = New mann
   spielr2\ID = 2
   spielr2\x = 600
   spielr2\y = 475
   spielr2\kopfwidth=30
   spielr2\kopfheigth = 30
   spielr2\life = 100


Diese beiden. Nun will ich die Ansprechen. Dazu brauch ich ja so eine For Schleife, sonst meckert er "Object does not exist"
Daher habe ich diese For Schleife, weil dann sagt er das nicht.
Kann es sein das ich diese Types zu sehr in Richtung Objektorientiertes Programmieren schiebe? Oder habe ich das schlicht noch nicht durchgeblickt? Weil jeder von euch sagt ja irgendwie was anderes... ^^

Trotzdem vielen Dank! Wink
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Noobody

BeitragMo, Jun 28, 2010 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
relentless92 hat Folgendes geschrieben:
Dazu brauch ich ja so eine For Schleife, sonst meckert er "Object does not exist"

Nein, du brauchst keine For-Schleife.

Schau mal hier, da greifst du ja auch auf den Type zu, ganz ohne For-Schleife Code: [AUSKLAPPEN]
   spielr1\ID = 1
   spielr1\x = 300
   spielr1\y = 475
   spielr1\kopfwidth=30
   spielr1\kopfheigth = 30
   spielr1\life = 100

Du musst jetzt einfach die beiden For-Each-Schleifen in deiner Funktion 'Mann' entfernen, dann sollte es gehen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

relentless92

BeitragMo, Jun 28, 2010 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function Mann(Active)   ; Die Spieler, zeichnen und bewegen
If Active = 1 Then
;For spielr1.mann = Each mann
   If KeyDown(KEY_D) Then
      spielr1\x=spielr1\x+3
   EndIf
   If KeyDown(KEY_A) Then
      spielr1\x=spielr1\x-3
   EndIf
   
   Oval spielr1\x,spielr1\y,spielr1\kopfwidth,spielr1\kopfheigth
   Line spielr1\x+spielr1\kopfwidth/2,spielr1\y+spielr1\kopfheigth/2,spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)+10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)-10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Text spielr1\x+2,spielr1\y+80,spielr1\life
;Next

;For spielr2.mann = Each mann
   If KeyDown(KEY_RIGHT) Then
      spielr2\x=spielr2\x+3
   EndIf
   If KeyDown(KEY_LEFT) Then
      spielr2\x=spielr2\x-3
   EndIf
   
   Oval spielr2\x,spielr2\y,spielr2\kopfwidth,spielr2\kopfheigth
   Line spielr2\x+spielr2\kopfwidth/2,spielr2\y+spielr2\kopfheigth/2,spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50
   Line spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50,(spielr2\x+spielr2\kopfwidth/2)+10,((spielr2\y+spielr2\kopfheigth/2)+50)+10
   Line spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50,(spielr2\x+spielr2\kopfwidth/2)-10,((spielr2\y+spielr2\kopfheigth/2)+50)+10
   Text spielr2\x+2,spielr2\y+80,spielr2\life
;Next
EndIf
End Function


Programm läuft nicht an, Fehlermeldung: "Object does not exist"
Was eigentlich keinen Sinn macht, da es jawohle da ist... Das sagt er übrigends bei dem ersten Oval, wo ich das erste mal spielr1\x benutze...
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Neoxit

BeitragMo, Jun 28, 2010 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Quasi

BlitzBasic: [AUSKLAPPEN]

spielr1\ID = 1
spielr1\x = 300
spielr1\y = 475
spielr1\kopfwidth=30
spielr1\kopfheigth = 30
spielr1\life = 100

spielr2\ID = 1
spielr2\x = 300
spielr2\y = 475
spielr2\kopfwidth=30
spielr2\kopfheigth = 30
spielr2\life = 100

;ansprechen :

spielr2\x = spielr2\x + speed



Allerdings verwundert auch mich das nun ein wenig da wenn das so geschrieben wird, ja alle types die mit spielr2.mann definiert sind (falls es mehrere geben soll) den x wert verändern. Wenn es nun allerdings um einheiten geht (z.b. bei einem strategiespiel) werden alle einheiten (.mann) doch um den speed wert in verändert? Allerdings nehme ich mal an, das die Types die hier definiert werden zu einem spiel gehören, wo mehrere Einheiten von 2 Spielern genutzt werden (d.h. Guter Spieler - Böser Spieler o.ä).

Und da für jeden spieler ja jede einheit unterschiedlich agieren sollen, müssen sie doch zuerst "gefiltert" werden oder irre ich da?

Oder meinst du das nun wie folgt @ Noobody
BlitzBasic: [AUSKLAPPEN]

spielr1\ID = 1
spielr1\x = 300
spielr1\y = 475
spielr1\kopfwidth=30
spielr1\kopfheigth = 30
spielr1\life = 100

spielr2\ID = 1
spielr2\x = 300
spielr2\y = 475
spielr2\kopfwidth=30
spielr2\kopfheigth = 30
spielr2\life = 100

;ansprechen :

;Für die Erste Einheit (ID 1) des zweiten spielers (spielr2\)
If spielr2\ID = 1 Then spielr2\x = spielr2\x + speed
;Für die Zweite Einheit (ID 2) des zweiten spielers (spielr2\)
If spielr2\ID = 2 Then spielr2\x = spielr2\x + speed


Wenn du die 2te Variante meinst, die eigentlich durchaus funktionieren sollte (wo ich mir jetzt nicht 100 % sicher bin) dann ist diese variante auch für mich neu und sollte sie mal so nutzen anstatt alle types dauernt mit for - each anzusprechen und dann zu filtern xD

Noobody

BeitragMo, Jun 28, 2010 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
relentless92 hat Folgendes geschrieben:
Programm läuft nicht an, Fehlermeldung: "Object does not exist"

Dann musst du den ganzen Code posten. Scheinbar setzt du in irgendeiner anderen Funktion die Variablen zurück, löschst einen Spieler oder verwendest in einer For-Each-Schleife wieder die spielr1/spielr2-Variablen.

Neoxit hat Folgendes geschrieben:
Allerdings verwundert auch mich das nun ein wenig da wenn das so geschrieben wird, ja alle types die mit spielr2.mann definiert sind (falls es mehrere geben soll) den x wert verändern.

Du hast an Types glaube ich etwas falsch verstanden. Wenn ich mehrere Types erstelle und sie alle in eine Variable stecke, dann ist nur der als letztes erstellte Type noch in der Variable BlitzBasic: [AUSKLAPPEN]
A = 3
A = 5
A = 6
A = 2 ;Welcher Wert ist jetzt noch drin? Richtig, 2

B$ = "Hallo"
B$ = "Helas"
B$ = "Hello"
B$ = "Konichiwa" ;Welcher String ist jetzt noch drin? Richtig, "Konichiwa"

Type TFoo
Field Name$

Field X, Y ;etc. etc.
End Type

C.TFoo = New TFoo
C.TFoo = New TFoo
C.TFoo = New TFoo
C.TFoo = New TFoo ;So, und welcher Type ist jetzt noch in der Variable?

C\X = 3 ;X ändert sich NUR für den letzten Type, den wir hier hineingesteckt haben.

Du kannst jetzt im ganzen Programm über die Variable C diesen Type ansprechen, ganz ohne Each.

Each wird nur gebraucht, wenn man alle bereits erstellten Types durchlaufen will BlitzBasic: [AUSKLAPPEN]
Type TFoo
Field Name$

Field X, Y ;etc. etc.
End Type

C.TFoo = New TFoo
C\Name$ = "1"

C.TFoo = New TFoo
C\Name$ = "2"

C.TFoo = New TFoo
C\Name$ = "3"

C.TFoo = New TFoo
C\Name$ = "4"

C.TFoo = New TFoo
C\Name$ = "5"

;In C ist jetzt nur der TFoo mit Namen "5" drin. Wollen wir jetzt alle Types ablaufen, benutzen wir Each:
For D.TFoo = Each TFoo
Print "Each-Schleife. Aktueller Type hat den Namen: " + D\Name$
Next

;Auf C können wir aber ganz ohne Each zugreifen
C\X = 3

Print "Einzelzugriff auf Type namens " + C\Name$

WaitKey()
End

Ich hoffe, das hat es ein wenig erklärt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

relentless92

BeitragMi, Jun 30, 2010 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay vielen Dank!
Das ist soweit klar. Dann hab ich ja doch richtig gedacht - nur falsch programmiert. Very Happy

Hier nochmal mein Code.

Code: [AUSKLAPPEN]
Graphics 800,600,32
SetBuffer BackBuffer()
timer=CreateTimer(60)

;// CONST //;

Const KEY_RIGHT = 205
Const KEY_LEFT = 203
Const KEY_D = 32
Const KEY_A = 30

;// TYPE //;

Type bubble
   Field x,y
End Type

Type mann
   Field ID
   Field x,y
   Field kopfwidth,kopfheigth
   Field life
End Type

;// GLOBAL //;

Global b.bubble
Global bubblemenge

Global spielr1.mann
Global spielr2.mann

;// FALLS NOTWENDIG: EIGENSCHAFTSZUWEISUNG //;

spielr1 = New mann
   spielr1\ID = 1
   spielr1\x = 300
   spielr1\y = 475
   spielr1\kopfwidth=30
   spielr1\kopfheigth = 30
   spielr1\life = 100

spielr2 = New mann
   spielr2\ID = 2
   spielr2\x = 600
   spielr2\y = 475
   spielr2\kopfwidth=30
   spielr2\kopfheigth = 30
   spielr2\life = 100
   
   
;// MAINLOOP //;
Repeat

WhiteBG(800,600)
BGAllg()
Bubbles(1)
Mann(1)
Collision()

Text 700,0,bubblemenge   
Flip
Cls
WaitTimer timer
Until KeyHit(1)

;///////////////;
;// FUNCTIONS //;
;///////////////;


Function WhiteBG(w,h)      ; Der Weiße Hintergrund
Color 255,255,255
Rect 0,0,w,h
Color 0,0,0
End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;

Function Bubbles(Active)   ; Die Bubbles, zeichnen und bewegen
If Active = 1 Then
If bubblemenge<50 Then
b = New bubble
   b\x=0
   b\y=0
   bubblemenge=bubblemenge+1
EndIf
      
   
For b = Each bubble
   b\x=b\x+Rnd(1,5)
   b\y=b\y+Rnd(1,5)
   
      Oval b\x,b\y,10,10,0
   
   If b\x>800 Or b\y>600 Then
      Delete b.bubble
      bubblemenge=bubblemenge-1
   EndIf
   
Next
EndIf
End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function Mann(Active)   ; Die Spieler, zeichnen und bewegen
If Active = 1 Then

   If KeyDown(KEY_D) Then
      spielr1\x=spielr1\x+3
   EndIf
   If KeyDown(KEY_A) Then
      spielr1\x=spielr1\x-3
   EndIf
   
   Oval spielr1\x,spielr1\y,spielr1\kopfwidth,spielr1\kopfheigth
   Line spielr1\x+spielr1\kopfwidth/2,spielr1\y+spielr1\kopfheigth/2,spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)+10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Line spielr1\x+spielr1\kopfwidth/2,(spielr1\y+spielr1\kopfheigth/2)+50,(spielr1\x+spielr1\kopfwidth/2)-10,((spielr1\y+spielr1\kopfheigth/2)+50)+10
   Text spielr1\x+2,spielr1\y+80,spielr1\life
   
   ;-

   If KeyDown(KEY_RIGHT) Then
      spielr2\x=spielr2\x+3
   EndIf
   If KeyDown(KEY_LEFT) Then
      spielr2\x=spielr2\x-3
   EndIf
   
   Oval spielr2\x,spielr2\y,spielr2\kopfwidth,spielr2\kopfheigth
   Line spielr2\x+spielr2\kopfwidth/2,spielr2\y+spielr2\kopfheigth/2,spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50
   Line spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50,(spielr2\x+spielr2\kopfwidth/2)+10,((spielr2\y+spielr2\kopfheigth/2)+50)+10
   Line spielr2\x+spielr2\kopfwidth/2,(spielr2\y+spielr2\kopfheigth/2)+50,(spielr2\x+spielr2\kopfwidth/2)-10,((spielr2\y+spielr2\kopfheigth/2)+50)+10
   Text spielr2\x+2,spielr2\y+80,spielr2\life

EndIf
End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function Collision()   ; Kollision Spieler / Bubbles
For b = Each bubble
      
      If RectsOverlap(b\x,b\y,10,10,spielr1\x,spielr1\y,spielr1\kopfwidth,spielr1\kopfheigth) Then
         spielr1\life = spielr1\life - 1
            If spielr1\life<=0 Then
                  Spieler_Tod();1)
            EndIf
          Delete b.bubble
         bubblemenge=bubblemenge-1
      EndIf
      
   
      If RectsOverlap(b\x,b\y,10,10,spielr2\x,spielr2\y,spielr2\kopfwidth,spielr2\kopfheigth) Then
         spielr2\life = spielr2\life - 1
            If spielr2\life<=0 Then
                  Spieler_Tod();2)
            EndIf
         Delete b.bubble
         bubblemenge = bubblemenge-1
      EndIf

Next
End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function Spieler_Tod()    ; Wenn Einer Stirbt
WhiteBG(800,600)

   Text 200,200,"Ende."
   
   Flip
   
   Delay 2000
   
   End
   
End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function BGAllg()       ; Background Zeichnen und so Zeuch

Line 0,550,800,550

End Function


Problem: Die Function Collision. Wenn ich mit Spieler 2 mit den Bubbles kollidiere, funktioniert alles super. Wenn ich es mit Spieler 1 machen will, bricht das Programm bei der Abfrage "von Spieler 2" ab mit dem Begriff "Object does not exist."

Das macht für mich keinen Sinn, weil er dann doch auch, wenn Spieler 2 kollidiert, bei der Abfrage von Spieler 1 damit terminieren müsste oder nicht? Denkfehler?
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Noobody

BeitragMi, Jun 30, 2010 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist hier, dass, wenn Spieler 1 kollidiert, er die Bubble auch löscht. Ein paar Zeilen untendrunter versucht aber Spieler 2 wieder auf die Bubble zuzugreifen, was dann natürlich zu einem Absturz führt. Du musst also die Kollisionsabfrage bei Spieler 2 mit einer zusätzlichen Abfrage versehen, ob die Bubble noch existiert BlitzBasic: [AUSKLAPPEN]
	If b <> Null Then
If RectsOverlap(b\x,b\y,10,10,spielr2\x,spielr2\y,spielr2\kopfwidth,spielr2\kopfheigth) Then
spielr2\life = spielr2\life - 1
If spielr2\life<=0 Then
Spieler_Tod();2)
EndIf
Delete b.bubble
bubblemenge = bubblemenge-1
EndIf
EndIf
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

relentless92

BeitragMi, Jun 30, 2010 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Klingt logisch Very Happy

Vielen Dank Noobody!
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group