Procedure

Anfängerfragen zum Programmieren mit PureBasic.
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Procedure

Beitrag 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
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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)
bizzl
Beiträge: 82
Registriert: 08.09.2005 18:07
Computerausstattung: AMD Athlon II X4 635
Windows 7 64 Bit
Wohnort: Nordhessen - früher : Südniedersachsen

Beitrag 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 
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag 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 :(
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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
bizzl
Beiträge: 82
Registriert: 08.09.2005 18:07
Computerausstattung: AMD Athlon II X4 635
Windows 7 64 Bit
Wohnort: Nordhessen - früher : Südniedersachsen

Beitrag 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? :(
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag 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... :(
Das Ende meines Lebens:
If leben = 0
End
Endif
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 ;) )
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag 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
Antworten