Zugriff auf bestimmte Objekte in Types

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Pakzor

Betreff: Zugriff auf bestimmte Objekte in Types

BeitragSa, Aug 29, 2009 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich bin es wieder Confused

Ich würde gerne wissen ob man auf ganz bestimmte Objekte in Types zugreifen kann?

Würde gerne das meine Raumschiffe in meinem Space-Shooter sich in Formation bewegen.
Mein alter Code (mit DIM-Feldern) sieht folgendermaßen aus (ist aber nur ein Auszug):

Code: [AUSKLAPPEN]

If I < 8 Then
   Gegner(I,1) = E + Sin( Gegner(I,2) ) * Gegner(I,0)      ; Sinus-Kurve für die Bewegung berechnen
ElseIf I > 7 Then
   Gegner(I,1) = Gegner((I-7),1)      ; den X-Wert auf den Wert von der Reihe darüber setzen, damit sie sich in Formation bewegen
   Gegner(I,2) = Gegner((I-7),2) + 50
EndIf


Mein aktueller Code sieht so aus:

Code: [AUSKLAPPEN]

Function MoveEnemies()
   For TEnemies = Each TEnemy

   E = E + 90
   If E >= 720 Then E = 90
   
      Select TEnemies\ID
         Case 1
            If TEnemies\Number < 8 Then
               TEnemies\X = E + Sin( TEnemies\Y) * TEnemies\Existence
            ElseIf TEnemies\Number > 7 Then
               TEnemies\X = E + Sin( TEnemies\Y) * TEnemies\Existence
            EndIf
            If TEnemies\Y > 400 Then Direction = -1 ElseIf TEnemies\Y < 21 Then Direction = 1
            TEnemies\Y = TEnemies\Y + Direction
         Case 2
         Default
      End Select
   
   If TEnemies\Existence < 1 Or TEnemies\X < 0 Or TEnemies\X > ScreenX Or TEnemies\Y < 0 Or TEnemies\Y > ScreenY Then Delete TEnemies
   ; wenn der Gegner nicht existiert oder der Bildschirm verlässt, dann lösche ihn
   Next
End Function


Bei dem ElseIf in Case 1 hapert es...
Ich würde also gerne den X-Wert ab der zweiten Reihe (eine Reihe hat 7 Raumschiffe), also
ab dem 8. Raumschiff auf den X-Wert des Raumschiffes darüber setzen, damit sich die Schifflein
in Formation bewegen.

Geht das, oder gibt es gar eine bessere Lösung?

Danke schonmal.

MFG
Pakzor

Xeres

Moderator

BeitragSa, Aug 29, 2009 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Zähler aus dem Dim-Code kannst du so doch auch bei den Types verwenden.

Code: [AUSKLAPPEN]
Function MoveEnemies()
   Local i
   For TEnemies = Each TEnemy
      i=i+1   
      E = E + 90
      If E >= 720 Then E = 90
      
      Select TEnemies\ID
         Case 1
            If i < 8 Then


Gesetzt dem Fall, die Gegner werden in der richtigen Reihenfolge erstellt versteht sich.
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)
 

Pakzor

BeitragSa, Aug 29, 2009 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mich wohl schlecht ausgedrückt.

Den Zähler brauch ich so nicht, habe ja TEnemies\Number in der korrekten Reihenfolge.

Ich möchte sagen:
If TEnemies\Number > 7 Then
TEnemies\X = TEnemies\X von der Reihe darüber

Also das Pendant zu:
Code: [AUSKLAPPEN]
Gegner(I,1) = Gegner((I-7),1)      ; den X-Wert auf den Wert von der Reihe darüber setzen, damit sie sich in Formation bewegen


Jetzt klar was ich meine?

MFG
Pakzor

Xeres

Moderator

BeitragSo, Aug 30, 2009 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Da gibt es mehrere Möglichkeiten. Die einfachste wäre es die Gegner - wenn sie sich gleichförmig bewegen - gleich beim erstellen in Formation zu setzten und nur noch weiter zu bewegen.

Oder du verwendest eine Kurze Funktion um N Einträge zurück zu gehen:

Code: [AUSKLAPPEN]
Function MoveEnemies()
   Local Enemy.Tenemy, OtherEnemy.TEnemy
   For Enemy = Each TEnemy
      
      E = E + 90
      If E >= 720 Then E = 90
      
      Select Enemy\ID
         Case 1
            If Enemy\Number < 8 Then
               Enemy\X = E + Sin( Enemy\Y) * Enemy\Existence
            ElseIf Enemy\Number > 7 Then
               OtherEnemy = AfterEnemy(Enemy, 7)
               Enemy\X = OtherEnemy\x
;[...]
               
               
Function AfterEnemy.TEnemy(E.TEnemy, n%=1)
   Local i
   For i=1 To n
      E = After E
   Next
   Return E
End Function


Und bitte: Nenne die Zugriffsvariable nicht gleich dem Typenamen. Es gibt zwar keinen Fehler, aber das vorangestellte T ist eben dazu da den Type zu bezeichnen.
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)

FireballFlame

BeitragSo, Aug 30, 2009 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Und eigentlich stehen Typenamen in der Einzahl Razz
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Pakzor

BeitragSo, Aug 30, 2009 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Da gibt es mehrere Möglichkeiten. Die einfachste wäre es die Gegner - wenn sie sich gleichförmig bewegen - gleich beim erstellen in Formation zu setzten und nur noch weiter zu bewegen.

[...]

Und bitte: Nenne die Zugriffsvariable nicht gleich dem Typenamen. Es gibt zwar keinen Fehler, aber das vorangestellte T ist eben dazu da den Type zu bezeichnen.


Das würde ich ja auch gerne so machen, aber mit meiner aktuellen Funktion klappt das leider nicht,
hat schon mit den DIM-Feldern so nicht geklappt und deshalb hab ich sie beim bewegen gleich gesetzt.

Dann sieht es nämlich so aus:
user posted image

Würde es aber gerne so haben:
user posted image

Aktuelle Funktion "CreateEnemies()":
Code: [AUSKLAPPEN]

Function CreateEnemies()
   If Stage = 1 And EnemiesCreated = 0 Then

      For I = 1 To 42
      
         EX = EX + 90
         If EX >= 720 Then EX = 90
         
         If I > 0 And I < 8 Then
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = I
            Enemy\Existence = 80
            Enemy\X = EX
            Enemy\Y = 20
            Enemy\Energy = 20
         ElseIf I > 7 And I < 15 Then
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = I
            Enemy\Existence = 80
            Enemy\X = EX
            Enemy\Y = 70
            Enemy\Energy = 20
         ElseIf I > 14 And I < 22 Then
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = I
            Enemy\Existence = 80
            Enemy\X = EX
            Enemy\Y = 120
            Enemy\Energy = 20      
         ElseIf I > 21 And I < 29 Then
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = I
            Enemy\Existence = 80
            Enemy\X = EX
            Enemy\Y = 170
            Enemy\Energy = 20
         ElseIf I > 28 And I < 36 Then
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = I
            Enemy\Existence = 80
            Enemy\X = EX
            Enemy\Y = 220
            Enemy\Energy = 20      
         ElseIf I > 35 And I < 43 Then
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = I
            Enemy\Existence = 80
            Enemy\X = EX
            Enemy\Y = 270
            Enemy\Energy = 20
            Enemy\Approval = 1
         EndIf

      Next
      EnemiesCreated = 1
   EndIf
End Function


Habe die Zugriffsvariablen nun umbenannt, ist mir so auch lieber, hab wohl die Ratschläge mit dem
benennen nicht ganz richtig verstanden.

Wenn ich deine Funktion so übernehme kommt in der Zeile
"Enemy\X = OtherEnemy\x "
Object does not exist!

Mach ich da was falsch?

Vielen Dank für die Zeit die du in mein Projekt investierst!

Gruß
Pakzor

Tankbuster

BeitragSo, Aug 30, 2009 1:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Pakzor hat Folgendes geschrieben:

Wenn ich deine Funktion so übernehme kommt in der Zeile
"Enemy\X = OtherEnemy\x "
Object does not exist!

Mach ich da was falsch?


Wenn die Aliens in der letzten Reihe geprüft werden, dann findet "E=After E" keinen Typeeintrag mehr und gibt eine Fehlermeldung aus. Das könntest du einfach umgehen, indem du die Aliens in der letzten Spalte nichtmehr prüfst.

Das Prinzip funktioniert wirklich, hier der Beweiß:
Code: [AUSKLAPPEN]
Type TEnemy
Field lol
End Type

Local Enemy.Tenemy, OtherEnemy.TEnemy
SeedRnd(MilliSecs())
For i=1 To 200
E.TEnemy=New TEnemy
E\lol=i
Next
a=Rnd(150)
For Enemy.TEnemy=Each TEnemy
If Enemy\lol=a Then
Print Enemy\lol
OtherEnemy=AfterEnemy(Enemy,7)
Print OtherEnemy\lol
EndIf
Next

Function AfterEnemy.TEnemy(E.TEnemy, n%=1)
   Local i
   For i=1 To n
      E = After E
   Next
   Return E
End Function


(1 Min Code)
Twitter
Download Jewel Snake!
Windows|Android

Xeres

Moderator

BeitragSo, Aug 30, 2009 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst die Gegner dann doch im Block erstellen?

Code: [AUSKLAPPEN]
Function CreateEnemies()
   If Stage = 1 And EnemiesCreated = 0 Then
      
      Local x,y   
      
      For x=0 To 7
         For y=0 To 6
            Enemy = New TEnemy
            Enemy\ID = 1
            Enemy\Number = y+(7*x)
            Enemy\Existence = 80
            Enemy\X = 100 + x*90
            Enemy\Y = -300 + y*50
            Enemy\Energy = 20
         Next
      Next
      
      EnemiesCreated = 1
   EndIf
End Function

Mit den passenden Parametern bei den Koordinaten bekommt jeder Gegner die passende Position und du musst sie später dann nur noch im Gleichtakt bewegen.
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)
 

Pakzor

BeitragSo, Aug 30, 2009 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja stimmt.

Nur komme ich nicht (oft) auf solche Gedanken, wenn man es dann sieht fragt man sich auch
warum man darauf nicht selbst gekommen ist.

Das macht eben die Erfahrung aus.

Das Forum hier ist aber super, sehr hilfsbereit und reichhaltig Information vorhanden Wink

Vielen Dank nochmal.

Gruß und gute Nacht Laughing
Pakzor

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group