Omnimaga

Calculator Community => TI Calculators => Axe => Topic started by: bilyp on November 16, 2011, 12:29:40 am

Title: Same routine, different outputs.
Post by: bilyp on November 16, 2011, 12:29:40 am
So I have a matrix (12x8) for a tilemapper that I wrote...
Code: [Select]
:[000000000000]→GDB1
:[000000000002]
:[000000000001]
:[000000000001]
:[220000000001]
:[112000000021]
:[331220002213]
:[333112221133]
and a routine that displays it:
Code: [Select]
:For(A,0,7)
:For(B,0,11)
:Pt-On(B*8,A*8,nib{A*12+B+(GDB1*2)}*8+Pic1)
:End
:End
and then a routine to detect if you are in a block, and store the block ID to C, where B = X+2, A = Y + 16. (the character is 16x8)
Code: [Select]
:If nib{B*12+A+(GDB1*2)}→C
but even though the core of the routines
Code: [Select]
:nib{VAR1*12+VAR2+(GDB1*2)}
are the same, only the first one shows correct blocks. The second one sometimes detects non existent blocks, and doesn't detect some existing blocks.

Is there something wrong in my syntax? Please help, I could not find the reason. :(
(attached is the source of the file with the buggy routines)
Title: Re: Same routine, different outputs.
Post by: Deep Toaster on November 16, 2011, 09:25:36 am
How big are your blocks? If they're not 1x1, it doesn't make sense to use B=X+2 and A=Y+16 to locate your block in the matrix. Assuming they're 8x8, you should divide X and Y by eight.
Title: Re: Same routine, different outputs.
Post by: bilyp on November 16, 2011, 10:14:15 am
Like I said, the player is 16 tall, and 8 wide. The X and Y values correspond to the top left corner of the character, and i want the middle of the bottom part of the character to see if its in a block, and the block below that to see if it is standing on a block. And even though they are 8*8 tiles, I still think that it needs to be pushed down, please correct me if I'm wrong.
Title: Re: Same routine, different outputs.
Post by: Quigibo on November 16, 2011, 08:45:25 pm
Look closely at your first for loop.  A and B are in the ranges from 0 to 7 and 0 to 11 respectively.  You are trying to do the same with Y and X in the ranges 0 to 63 and 0 to 95.  So basically to remedy this, just divide each coordinate by 8 and that should give you the correct block.  In fact, you should turn this into a subroutine because you will likely reuse it a lot:

Code: [Select]
:.Syntax TILE(X,Y)
:Lbl TILE
:Return nib{r2/2/2/2*12+(r1/2/2/2)+(GDB1*2)}

Now in your for loop, you can call TILE(B*8,A*8 ) and elsewhere call TILE(X+2,Y+16).

EDIT: Added a speed optimization since it saves you from needing the division subroutine.
Title: Re: Same routine, different outputs.
Post by: bilyp on November 17, 2011, 09:56:57 am
Thanks! I just tested and it worked! You were right I was going to need that routine in many places.  ;D