Seite 2 von 2
Verfasst: 28.11.2007 01:20
von NicTheQuick
Du musst nicht mein ganzes Post zitieren, wenn es direkt vor deinem steht.
Ersetz einfach 'StrukturvonWas' durch 'Kanone_Sprite'. Dann sollte es
funktionieren. Was war daran schwer zu verstehen?
Verfasst: 28.11.2007 07:25
von obar
Das funktioniert nicht. Compiler gibt immer einen Syntax-Error aus. Keine Ahnung wieso.
Procedure:
Code: Alles auswählen
Procedure Sprite_setzen(AnzWas.l, Was(1).Kanone_sprite, SpriteNr1.l, SpriteNr2.l)
Protected i.l
For i = 1 To AnzWas
If Was(i)\treffer = 1
DisplayTransparentSprite(SpriteNr1, Was(i)\x, Was(i)\y)
Else
DisplayTransparentSprite(SpriteNr2, Was(i)\x, Was(i)\y)
EndIf
Next
EndProcedure
Aufruf:
Verfasst: 28.11.2007 10:46
von NicTheQuick
Da ich den ganzen Code nicht habe, kann ich das gerade nicht
nachvollziehen. Und ich welcher Zeile der Debugger meckert, hast du auch
nicht gesagt.
Verfasst: 28.11.2007 11:01
von ZeHa
Du versuchst, ein Array zu übergeben. Das funktioniert allerdings nicht, Du kannst nur die Objekte einzeln übergeben, z.B. über einen Pointer.
Code: Alles auswählen
Procedure Sprite_setzen(*Was.Kanone_sprite, SpriteNr1, SpriteNr2)
If Was\treffer = 1
DisplayTransparentSprite(SpriteNr1, *Was\x, Was\y)
Else
DisplayTransparentSprite(SpriteNr2, *Was\x, Was\y)
EndIf
EndProcedure
Und dann der Aufruf z.B. so:
Code: Alles auswählen
For i = 1 to AnzWas
Sprite_setzen(Was(i), 1, 2)
Next i
Ich bin mir jetzt grad nicht sicher ob Du vor das Was(i) im Aufruf evtl. noch ein @ schreiben mußt - und ich kann es leider grad nicht testen. Aber probier's einfach mal aus. Der Grund, warum Du Pointer verwenden mußt, ist der, daß Du eben eine komplexe Datenstruktur übergibst (vom Typ Kanone_sprite) und nicht nur eine einzelne Zahl oder sowas.
Übrigens @NicTheQuick: Ich würde vorerst nur mit Procedures arbeiten und nicht mit Macros. Seit Macros in PB da sind, hab ich das Gefühl, daß alle geil drauf sind, sie zu verwenden, aber solange man sie eh nur wie eine normale Procedure verwendet, bringt es meist kaum Vorteile. Meiner Meinung nach ist es besser, erstmal das Programmieren normal zu erlernen, und nicht mit Macros rumzutricksen - das kann man immer noch machen, wenn man genau weiß, wann und warum man sie einsetzen will.
Verfasst: 28.11.2007 13:14
von NicTheQuick
@ZeHa:
Natürlich kann man Arrays übergeben. Man kann sogar LinkedLists als Parameter
übergeben: Dokumentation zu
Procedures
Da steht auch, dass Arrays und LinkedLists als Referenz und nicht als Wert übergeben
werden.
Und warum mit Makros rumtricksen? Makros sind sehr praktisch. Leider noch nicht so
dynamisch wie z.B. in C. Aber sie haben z.B. sehr zur Übersichlichkeit einiger meiner
Programme beigetragen, ohne dabei Geschwindigkeit zu verlieren.
Während bei Procedures alle Parameter zuerst einmal auf den Stack gepushed werden,
bevor sie genutzt werden, wird ein Makro schon während dem Kompilieren an Ort und Stelle
ersetzt.
Natürlich sollte man zuerst mal verstehen, wie sie funktionieren, wenn man sonst nur
Procedures gewohnt ist. Aber wenn man selbst von Procedures noch keine Ahnung hat,
kann man mit Makros niemanden verwirren.
Verfasst: 28.11.2007 13:31
von obar
Ich sende euch mal die definitionen.
Code: Alles auswählen
AnzSpeicher = 5
AnzKanone = 5
kanonen = 5
AnzSchiffe = 7
mxg = 300
myg = 150
mxs = 350
mys = 550
pos = 0
Count1 = 1
Count2 = 1
a = 1
b = 1
Schuss1 = 0
Schuss2 = 0
FlipFlop = 0
AbzugKanone = 0
AbzugSchiffe = 0
AbzugSpeicher = 0
Structure Schiffe_sprite
x.l
y.l
treffer.l
EndStructure
Structure Kanone_sprite
x.l
y.l
treffer.l
EndStructure
Structure Speicher_sprite
x.l
y.l
treffer.l
EndStructure
Dim Schiff.Schiffe_sprite(AnzSchiffe)
Dim Kanone.Kanone_sprite(AnzKanone)
Dim Speicher.Speicher_sprite(AnzSpeicher)
; Kanone gesetzt
For i = 1 To AnzKanone
If Kanone(i)\treffer = 1
DisplayTransparentSprite(15, Kanone(i)\x, Kanone(i)\y)
Else
DisplayTransparentSprite(10, Kanone(i)\x, Kanone(i)\y)
EndIf
Next
;Schiff gesetzt
For i = 1 To AnzSchiffe
If Schiff(i)\treffer = 1
DisplayTransparentSprite(14, Schiff(i)\x, Schiff(i)\y)
Else
DisplayTransparentSprite(13, Schiff(i)\x, Schiff(i)\y)
EndIf
Next
;Speicher gesetzt
For i = 1 To AnzSpeicher
If Speicher(i)\treffer = 1
DisplayTransparentSprite(17, Speicher(i)\x, Speicher(i)\y)
Else
DisplayTransparentSprite(16, Speicher(i)\x, Speicher(i)\y)
EndIf
Next
Da hab ich nun 3 mal eine FOR NEXT Schleife. Ich würde dies gerne in eine Procedur packen. Der Syntax Fehler kommt hier
Code: Alles auswählen
Procedure Sprite_setzen(AnzWas.l, Was(1).Kanone_sprite, SpriteNr1.l, SpriteNr2.l)
[/code]
Verfasst: 28.11.2007 13:40
von edel
da muss auch
stehen, und nicht
Verfasst: 28.11.2007 13:40
von NicTheQuick
Ja, ich seh's grad.
So ist es richtig:
Code: Alles auswählen
Procedure Sprite_setzen(AnzWas.l, Was.Kanone_sprite(1), SpriteNr1.l, SpriteNr2.l)
Die Klammer mit der 1 muss auch hinter die Struktur.
Aber mit einem beherzten Blick in die Dokumentation wäre dir das sicherlich auch
aufgefallen. Dazu ist sie da.
Allgemein sind Syntaxfehler eigentlich die Fehler, die man mit der Dokumentation leicht
beheben kann.
Verfasst: 28.11.2007 13:47
von obar
Ok, jetzt läufts. Sorry
Aber sehe ich das richtig, dass ich die 3 Schlaufen gar nicht vernünftig in eine Procedure packen kann?
Verfasst: 29.11.2007 00:03
von ZeHa
@ NicTheQuick:
Trotzdem kann es anfangs für einen Anfänger verwirrend sein, daß es Prozeduren UND Makros gibt. Und wenn man dann noch sagt, daß Makros "schneller" sind, ist es gut möglich, daß viele nur noch mit Makros arbeiten, was aber nicht unbedingt empfehlenswert ist. Und auch der Geschwindigkeitsvorteil ist in vielen Fällen gar nicht spürbar.
Zur Strukturierung eines Programms sind Prozeduren erstmal das Richtige. Später, wenn jemand mehr Wissen besitzt, kann man auch erklären, was es mit Makros auf sich hat, und in welchen Situationen man sie einsetzen kann/soll/darf, aber jemandem von Anfang an Makros beizubringen ist meiner Meinung nach so ähnlich, wie wenn man jemandem sofort beibringt, daß man bestimmte Multiplikationen durch Bitshifting ersetzen kann.