Zugriff auf bestimmte Objekte in Types
Übersicht

PakzorBetreff: Zugriff auf bestimmte Objekte in Types |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
ich bin es wieder ![]() 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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Pakzor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und eigentlich stehen Typenamen in der Einzahl ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: ![]() Würde es aber gerne so haben: ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Pakzor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Vielen Dank nochmal. Gruß und gute Nacht ![]() Pakzor |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group