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:

Code: Alles auswählen

Sprite_setzen(AnzKanone, Kanone(), 15, 10)

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

Code: Alles auswählen

Was.Kanone_sprite(1)

stehen, und nicht

Code: Alles auswählen

Was(1).Kanone_sprite

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.