Cool Topic. I will follow it ! So far everything is clear to me .. I hope to learn more about the poke and peek also. And maybe some assembly ?
But this part is a bit complex Please explain
Sure...
FORI=2TO8 'What i understand.. count from 2 till 8 in I XD(I)=SGN(5-I) 'Then set a array in XD with SGN ? What is SGN
SGN()-function returns the SIGN of a number... So 0 will return 0, positive number will return +1 and negative number will return -1
YD(8-I)=XD(I) ' No idea .. but set YD(8-I) the value of XD(I) NEXT SWAP YD(0),YD(8) 'Then SWAP something ?
Yes, this may be a bit hard to understand, but it is just simple math... The idea of all until this point is to fill XD & YD tables with X & Y offset values related to the weird kind of number returned by STICK()-function. In the end the table will look like this:
STICK() XD YD 0 0 0 Don't move 1 0 -1 Up 2 +1 -1 Up, Right 3 +1 0 Right 4 +1 +1 Down, Right 5 0 +1 Down 6 -1 +1 Down, Left 7 -1 0 Left 8 -1 -1 Up, Left SPRITE$(0)="0HH0" 'SomeHex value used for the sprite ?
Actually it is ASCII string. (See the $-sign) When you convert the ASCII to binary, it looks like this:
00110000 01001000 01001000 00110000 -> It is representing a simple ball. FORI=0TO1 'Loop something 1 time ? S=STICK(J) I=-STRIG(J) 'What is strig ?
No, we actually loop until variable "I" gets value "1". The STRIG()-funtion return joystick button / SPACE-key status. If button is pressed it will return "-1" otherways it will return "0". We take this number, change the sign and put it to "I" This means that we loop until button is pressed.
I try to be a bit more beginner friendly although the comments are still missing...
I now decoded this:
10 FORI=2TO8:XD(I)=SGN(5-I):YD(8-I)=XD(I):NEXT:SWAPYD(0),YD(8): SCREEN2,1:SPRITE$(0)="0HH0":FORI=0TO1:S=STICK(J):I=-STRIG(J): X=X+XD(S):Y=Y+YD(S): PUTSPRITE0,(X,Y),8:NEXT
...to very traditional text book version:
10 SCREEN 2,1 20 FOR I=0 TO 7 30 READ D$ 40 S$=S$+CHR$(VAL("&B"+D$)) 50 NEXT I 60 SPRITE$(0)=S$ 70 S=STICK(J) 80 IF S=1 THEN Y=Y-1 90 IF S=2 THEN Y=Y-1:X=X+1 100 IF S=3 THEN X=X+1 110 IF S=4 THEN Y=Y+1:X=X+1 120 IF S=5 THEN Y=Y+1 130 IF S=6 THEN Y=Y+1:X=X-1 140 IF S=7 THEN X=X-1 150 IF S=8 THEN Y=Y-1:X=X-1 160 PUT SPRITE 0,(X,Y),8 170 IF STRIG(J)=0 THEN GOTO 70 180 END 190 DATA 00110000 200 DATA 01001000 210 DATA 01001000 220 DATA 00110000 230 DATA 00000000 240 DATA 00000000 250 DATA 00000000 260 DATA 00000000
... at least when I was child the examples were like this.
hi Jack!
Vampier - you don't like more people joining in?
@ NYYRIKKI : I love this Code ! If you would make a topic to share BASIC TRICK and TIPS like that I would be fan !
FORI=0TO1:S=STICK(J):I=-STRIG(J): X=X+XD(S):Y=Y+YD(S): PUTSPRITE0,(X,Y),8:NEXT
So this part is more or less like a Do Until/Loop
Do Until I=1 S=STICK(J) X=X+XD(S) Y=Y+YD(S) PUTSPRITE0,(X,Y),8 I=-STRIG(J) 'IF I=1 EXIT LOOP Loop
About the old school code:
I think I understand it, but what about this part ?
20 FOR I=0 TO 7 30 READ D$ 40 S$=S$+CHR$(VAL("&B"+D$)) 50 NEXT I
So you have a loop from 0 to 7, so 8 steps to read all the DATA Items into S$. But before you read in the data into S$ you convert the binary data to a STRING Value ?
190 DATA 00110000 200 DATA 01001000 210 DATA 01001000 220 DATA 00110000 230 DATA 00000000 240 DATA 00000000 250 DATA 00000000 260 DATA 00000000
@Vampier: Come on... We have the same goal: Let's teach people MSX-BASIC! If you want to make the "Vampiers ultimate guide to coding MSX-BASIC" then I also suggest that you use WIKI or if you want even more control, make a www-page...
FORI=0TO1:S=STICK(J):I=-STRIG(J): X=X+XD(S):Y=Y+YD(S): PUTSPRITE0,(X,Y),8:NEXT
So this part is more or less like a Do Until/Loop
Do Until I=1 S=STICK(J) X=X+XD(S) Y=Y+YD(S) PUTSPRITE0,(X,Y),8 I=-STRIG(J) 'IF I=1 EXIT LOOP Loop
Yes, MSX-BASIC just doesn't have DO UNTIL or LOOP-commands... To be more exact this is DO UNTIL I=>1
About the old school code:
I think I understand it, but what about this part ?
20 FOR I=0 TO 7 30 READ D$ 40 S$=S$+CHR$(VAL("&B"+D$)) 50 NEXT I
So you have a loop from 0 to 7, so 8 steps to read all the DATA Items into S$. But before you read in the data into S$ you convert the binary data to a STRING Value ?
Yes. In MSX-BASIC the normal 8x8 sprites are defined with 8-byte long strings. So what happens here is that I read binary string -> convert the binary string to number value -> convert the number to character -> insert the character to S$-string. After the loop I define the sprite outlook with generated S$-string.
In this example in DATA-lines the 0's represent transparent color and 1's represent red color.
Whoever adds code: let's add it to the Wiki in an organized way. That way things can be found back more easily because it's all categorized. This thread could be used to noodle around though, but without organizing things in an orderly fashion, the thread will sooner or later disappear in thread-history.
Ok, Clear! I just looked to an old book and this one is also FUN:
10 COLOR,1,1:SCREEN2:FORF=1TO96STEP.5:Y1=F*SIN(F):X1=F*COS(F):Y2=100-Y1:X2=125-X1:C=RND(1)*13+2:PSET(X1+125,Y1+100),C:PSET(x2,y2),C:NEXTF:GOTO10