Seite 1 von 1

Procedure

Verfasst: 22.05.2006 20:49
von Svking
Hallo, ich hab mal eine Procedure gemacht, die will aber nicht, wisst ihr vieleicht wieso?

Code: Alles auswählen

Procedure stein(sprite,x,y)
If SpriteCollision(2,ball_x,ball_y,sprite,x,y) = 1
If speed_x = 3
speed_x = -3
EndIf
If speed_x = -3
speed_x = 3
EndIf
EndIf
EndProcedure

ball_x und ball_y sind schon vorhanden als variablen

Verfasst: 22.05.2006 21:01
von Macros
ball_x und ball_y sind schon vorhanden als variablen
Aber nicht in der Procedur.
du musst schreiben

Code: Alles auswählen

Shared ball_x
Shared ball_y
(in der Procedur)

Verfasst: 22.05.2006 21:07
von bizzl

Code: Alles auswählen

If speed_x = 3 
speed_x = -3 
EndIf 
If speed_x = -3 
speed_x = 3 
EndIf 
Wenn speed_x 3 ist, wird es auf -3 gesetzt.
Wenn speed_x -3 ist, wird es auf 3 gesetzt.
Das heißt, wenn speed_x 3 ist, dann bleibt es 3.
Versuch mal:

Code: Alles auswählen

If speed_x=3
speed_x=-3
elseif speed_x=-3
speed_x=3
endif
Ich nehme mal an, daß du eine Richtungsumkehr willst.
Dann schreib doch einfach

Code: Alles auswählen

speed_x=-speed_x 

Verfasst: 22.05.2006 21:19
von Svking
@bizzl
lol ja das is noch besser danke :D

@Macros

wie meinst du das, ich habe mal das versucht

Code: Alles auswählen

Procedure stein(sprite,x,y)
If SpriteCollision(2,ball_x,ball_y,sprite,x,y) = 1
If speed_x = speed_x
speed_x = -speed_x
EndIf
If speed_x = -speed_x
speed_x = speed_x
EndIf
EndIf
Shared ball_x 
Shared ball_y
EndProcedure
geht aber auch nicht :(

Verfasst: 22.05.2006 21:23
von Macros
Shared am Anfang:

Code: Alles auswählen

Procedure stein(sprite,x,y)
Shared ball_x
Shared ball_y
If SpriteCollision(2,ball_x,ball_y,sprite,x,y) = 1
speed_x = -speed_x
EndIf
EndProcedure

Verfasst: 22.05.2006 21:28
von bizzl
ähm, Svking, kann das sein, daß du da irgendwas nicht so ganz verstanden hast?
Die shared-Befehle gehören m.W. an den BEGINN der Prozedur, und was soll das

Code: Alles auswählen

If speed_x = speed_x ...
speed_x ist IMMER gleich speed_x.

Wieso eigentlich lol ? Steh ich auf der Leitung, hab ich irgendwas mißverstanden? :(

Verfasst: 22.05.2006 22:09
von Svking
ja irgendwie logich ^^ lol aber dann geht das garnich mit speed_x = -speed_x und so, weil der ja auch abfragen soll, ob speed_x = 3 oder -3 ist x(


@Makro
der code geht so auch nicht:

Code: Alles auswählen

Procedure stein(sprite,x,y)
Shared ball_x 
Shared ball_y
If SpriteCollision(2,ball_x,ball_y,sprite,x,y) = 1
If speed_x = 3
speed_x = -3
EndIf
If speed_x = -3
speed_x = 3
EndIf
EndIf

EndProcedure
wenn ich allerdings das in die repeat schleife mache ohne procedure dann gehts ( also ohne shared etc halt gleich die variablen eingesetzt)

komich... :(

Verfasst: 22.05.2006 22:33
von Kaeru Gaman
1. wenn du die variablen als shared benutzen willst,
musst du sie auch im hauptprogramm ganz am anfang deklarieren.
eine andere möglichkeit wäre, sie als global zu definieren, das käme aufs selbe raus.

2. speed_x muss auch einen wert haben.
innerhalb deiner proc ist es immer =0, weil es nirgendwo definiert wird.
also auch shared oder global.

3. schau noch mal in bizzls erstes post.
ein problem hast du immernoch:
angenommen, speed_x hat den wert 3 wenn die kollision passiert, dann wird es auf -3 gesetzt.
aber gleich danach kommt eine abfrage, ob es -3 ist, und dann wird es auf +3 gesetzt.
am einfachsten ist ganz simpel nur den wert negieren:

Code: Alles auswählen

If SpriteCollision(2,ball_x,ball_y,sprite,x,y) = 1 
   speed_x = -speed_x
EndIf 
für solche "kleinigkeiten" lohnt eigentlich keine procedure,
so ein vergleichsweise winziges If packt man direkt in die hauptschleife.

du siehst, du müßtest 3 werte shared oder global machen,
drei andere übergibst du als argumente.
es gibt keinen grund, warum so herum und nicht grad anders,
irgendwann wirst du also durcheinanderkommen,
warum ausgerechnet diese variablen global sind und jene nicht.

außerdem raten viele von globalen variablen ab.
wichtig ist vor allem, dass man es nicht übertreiben sollte.
global sollten immer nur ganz wenige ganz besondere variablen sein,
und die sollten auch ganz markante namen tragen,
damit man die namen keinesfalls unbeabsichtigt in irgendeiner
procedure für irgendwelche lokal geplanten variablen verwendet.

auch deine argumente sind neue variablen!

die x und y in deiner proc sind andere als außerhalb.
wenn du in der proc x und y veränderst,
passiert mit den x und y im hauptprogramm garnichts!


lange rede, kurzer sinn:
Variablen, die du innerhalb einer proc benutzt sind immer local,
d.h. es sind physikalisch andere speicheorte als variablen
gleichen namens außerhalb der proc.
ausnahmen bilden nur globale variablen oder per shared deklarierte.

sowas kleines mach besser einfach so in der hauptschleife.
ist auch kurz genug, um die übersichtlichkeit nicht zu gefährden.
(einrücken hilft ;) )

Verfasst: 23.05.2006 07:11
von ullmann
Und wenn Du nur bei speed_x=3 oder -3 negieren möchtest, dann so:

Code: Alles auswählen

IF Abs(speed_x)=3
  speed_x=-speed_x
EndIF
Rainer