Problem with Type in a Function
Blitz3D Forums/Blitz3D Beginners Area/Problem with Type in a Function
| ||
If I have 5 targets created as types ie target_1, target_2 etc and I want to find the x,y postion of any of those targets how can I write an if statement to check the target I want I wrote this but am unable to add a variable after 'target_'. If I want 'target_3' how can I add the '3' to the end of 'target_'? Also how do the variables I pass into the function get returned? Function check_target_pos(target_num,x,y) ; If target_ \x=0 End End Function Many thanks for reading Graham, UK |
| ||
Have a look:type example field x end type o.example=new example o\x=50 function something() print o\x end function will not work because you've declared "o" as a local (by default) and you cannot access it in functions. But you can access types using a built in list for each type... erm.. type. If you want to individualise instances of types then it's a good idea to give them a unique ID you can use later to identify them. Regard: type example field x,y field id ; unique ID (it's your responsibility to make them unique) end type ; create two local example. These aren't accessable in functions. o.example=new example o\id=1 o\x=50 o2.example=new example o2\id=2 o2\x=100 ; run a program Check_Target_Pos(1) ; try and check ID 1 waitkey end function Check_Target_Pos(number) local found.example=null found=getTypeByID(number) ; try and find 'number' if found <> null ; check to see whether it's found it. ; do whatever you want with 'found' ; if found\x=0 then end else Print("Could not find example "+number) endif end function function getTypeByID.example(idNumber) ; this function will cycle the list ; of examples currently created within your game ; if the example type we're cycling through ; has the same ID number as the parameter, ; it's the type we want. We return it. Note the return ; value of this function for i.example=each example if i\id = idNumber then return i next end function |
| ||
Or you can do like this:Type Target Field X,Y End Type Target_1.Target=New Target Target_2.Target=New Target Target_1\X=5 Check_Target_Pos(Target_1,5,5) Function Check_Target_Pos(Target_Num.Target,X,Y) If Target_Num\X=5 Then Print("Target\x=5"):WaitKey End Function |
| ||
Yeah, or you could do it like that. ;) |
| ||
;create globals Global gfx_x=640 Global gfx_y=480 Global gfx_colour_depth=16 Global id ;========================================================================================== ;create window Graphics gfx_x,gfx_y,gfx_colour_depth,2 ;screen =640,480,16 bit colour, always windowed AppTitle="Shape Shoot" SetBuffer BackBuffer() ;========================================================================================== ;create types Type target Field x=0 ;x pos Field y=0 ; y pos Field id ; id number of target Field hit=False ;target hit/miss Field image ;target graphic End Type ;========================================================================================== ;create objects from types target_1.target=New target target_1\x=0 target_1\y=0 target_1\id=1 target_1\hit=False target_1\image=LoadImage("target.bmp") ;x40,y40 pixels MaskImage (target_1\image,255,255,255) ;get rid of the surrounding white of the image ;========================================================================================== ;main loop While Not KeyHit (1) Cls Gosub debug_output ;draw the target on the screen DrawImage target_1\image,target_1\x,target_1\y ;increase x and y co-ordinates of the target target_1\x=target_1\x+5 target_1\y=target_1\y+5 ;slight delay in the movement of target Delay(100) ;check the onscreen position of target check_target_pos(1) ;flip the buffer screen Flip Wend End ;========================================================================================== ;create functions Function check_target_pos(id) ;used to check the position of any targets on screen Local found.target=Null found=get_target_id(id) ; try and find 'number' If found <> Null ; check to see whether it's found it. Text(0,0,"found "+id) ;ok so i found that it is number 1 so how can i now say ;If target_1\x < 0 Then etc etc ;i cannot use target_id as it is not a declared type Else Text(0,0,"Could not find example "+id) EndIf End Function Function get_target_id.target(id) ;cycle through all availible targets and return the id For i.target=Each target If i\id = id Then Return i Next End Function ;========================================================================================== ;debug .debug_output Text(0,400,"target 1 x="+target_1\x+" y="+target_1\y) Return |
| ||
Please read the comments in Function check_target_pos(id) and try and help me pleeeeeaaase! |
| ||
You use "found" instead. Basically, what it's doing is this:Function check_target_pos(id) ; here, you're finding the instance of the target type ; that has the id you're looking for and putting it into ; found. ; It's the same as saying: ; j.target=new target ; a.target=null ; a = j ; You're basically pointing to it. It's not being copied, ; just being pointed to with a different name. ; This is what you're doing below. You're declaring "found" ; and then making it point to the target with ; the ID you're looking for. Local found.target=Null found=get_target_id(id) If found <> Null ; check to see whether it's found it. Text(0,0,"found "+found\id+", "+found\x+", "+found\y) ;If found\x < 0 Then etc etc Else Text(0,0,"Could not find example "+id) EndIf End Function |
| ||
Check this out, ( Lol I'm to slow, some one was faster ) Function check_target_pos(id) ;used to check the position of any targets on screen Local found.target=Null found=get_target_id(id) ; try and find 'number' If found <> Null ; check to see whether it's found it. Text(0,0,"found "+id) ;ok so i found that it is number 1 so how can i now say ;If target_1\x < 0 Then etc etc ;Like This...... If found\x < 0 Then ;etc etc Else Text(0,0,"Could not find example "+id) EndIf End Function bye... |
| ||
Sorry tiger! |
| ||
thanks guys, its so much clearer now!! really appreciated |
| ||
If you want the X-value of a specific type-instance, there are two options: - you add a field (i.e. InstanceNumber%) to your type and when you want to get the X-value of a certain type, you can loop through all types of type "Target" (with First, Each, Before, After, ...) and check if the field matches the one you want the X-value from - use arrays of types (my favorite choice, instant access, no looping needed) Arrays are always global, so you have access to them at any time. Like this: Type Target Field X% Field Y% End Type dim ArrayOfTargets.Target(5) ; Creates an array with indexes 0-5 and prepares it to hold pointers to "Target"-type-instances. ; Create all instances and put the pointers into the array For i = 1 to 5 ArrayOfTypes(i) = New Target Next ; Now all (5) type-instances are created and each (index 1-5) index of the array points to such an instance. ; Your function: Function check_target_pos(target_num,x,y) ; If ArrayOfTargets(target_num)\x=0 End End Function |