Day 1 (Help plz) (Page 1) ● SmileBASIC Source Forums

Register
This website has been moved, please see this post

# Day 1 (Help plz)

• #1 ✎ 9 Craftman780 DAY 1 OF USING SMILE BASIC 4 (Switch) I've implimented movement. ```'---------------------------------------------------------------------' ' MOVEMENT' CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 SPOFS 0,DX,DY VSYNC ENDLOOP '---------------------------------------------------------------------'``` It sets the sprite of a strawberry in the middle of the screen (roughly 185 (direction X) and 115 (direction Y)) and using the joy-con's right directional buttons, I can move the strawberry around the screen which will then stop if it reaches the certain threshold. (see DX,DY) However, If I say want to add right below it (I have it marked out to make it easier to see what's what) like a beep function for the A button like so: ```'---------------------------------------------------------------------' ' MOVEMENT' CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 SPOFS 0,DX,DY VSYNC ENDLOOP '---------------------------------------------------------------------' LOOP IF BUTTON(1,B_A,1) THEN BEEP 6 ENDLOOP``` Nothing happens... All the code works just fine (no errors) it's just when I try to press the A button to get it to beep, nothing happens. I would really love some help. Posted Edited by Yolkai
• #2 ✎ 408 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Third Year My account is over 3 years old Website Reading I like to read books! Hobbies The button code for A is #B_RRIGHT You don't want to put the beep code outside the main loop. Say your main loop is movement code. If your beep code is directly below it (outside the loop), and the program never exits the movement loop above, then the beep code would never run, and thus no sound occurs. ```CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP'main loop 'movement IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 SPOFS 0,DX,DY 'beep IF BUTTON(1,#B_RRIGHT) THEN BEEP 6 VSYNC ENDLOOP ``` I've only used SB4 for a bit, but isn't the first parameter of BUTTON the Controller ID? You want to make sure you're checking for input from the right controller as well, but I might be wrong about that. (I don't know what sort of XCTRLSTYLE you've got going on.) Posted Edited by MZ952
• #3 ✎ 246 niconii Power User Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies Keep in mind that code is executed from top to bottom. So, your movement code runs, but then it hits the first ENDLOOP, making it go back up to LOOP. That first loop goes on forever, which means that SmileBASIC actually never reaches your second loop where you try to check the A Button. When it comes to interactive programs like this, you'll usually just have one big main loop. Adding another loop after it would mean you want that loop to happen after you're totally done with the first loop, which isn't what you were trying to do. Posted Edited by niconii
• #4 ✎ 246 niconii Power User Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies
The button code for A is #B_RRIGHT
The alias #B_A was added in an update, so both will work.
I've only used SB4 for a bit, but isn't the first parameter of BUTTON the Controller ID? You want to make sure you're checking for input from the right controller as well, but I might be wrong about that. (I don't know what sort of XCTRLSTYLE you've got going on.)
The left and right Joy-Cons together count as one controller if you're using them as a pair.
Posted Edited by niconii
• #5 ✎ 408 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Third Year My account is over 3 years old Website Reading I like to read books! Hobbies Ah, I see. I guess there are now #B_X,#B_Y,#B_UP, etc. counterparts too? Neat. If you've got the control style set to single handheld mode (attached to console/attached to grip) (XCTRLSTYLE 0 I believe), then the controller ID is irrelevant? I mean, I guess then it wouldn't really make sense to ask about states of nonexistent controllers, unless I'm mistaken about what the actual functionality of controller ID is. Posted Edited by MZ952
• #6 ✎ 9 Craftman780
The button code for A is #B_RRIGHT
The alias #B_A was added in an update, so both will work.
I've only used SB4 for a bit, but isn't the first parameter of BUTTON the Controller ID? You want to make sure you're checking for input from the right controller as well, but I might be wrong about that. (I don't know what sort of XCTRLSTYLE you've got going on.)
The left and right Joy-Cons together count as one controller if you're using them as a pair.
Yes. It can work in two ways ``` IF BUTTON(1,#B_A)==1 THEN BEEP 6 IF BUTTON(1,#B_A,1) THEN BEEP 6 ``` in the first command, the == bit means it will continue for as long as the button is pressed, and will repeat. the second, then {designation},1 bit means it will only happen once which is helpful if you're trying to have it only beep once.
Posted Edited by Craftman780
• #7 ✎ 9 Craftman780
Keep in mind that code is executed from top to bottom. So, your movement code runs, but then it hits the first ENDLOOP, making it go back up to LOOP. That first loop goes on forever, which means that SmileBASIC actually never reaches your second loop where you try to check the A Button. When it comes to interactive programs like this, you'll usually just have one big main loop. Adding another loop after it would mean you want that loop to happen after you're totally done with the first loop, which isn't what you were trying to do.
So basicall,y Id have to keep all my code in a loop?
Posted
• #8 ✎ 408 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Third Year My account is over 3 years old Website Reading I like to read books! Hobbies
So basicall,y Id have to keep all my code in a loop?
Not necessarily. ```CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP MOVEMENT DRAW NOISE VSYNC ENDLOOP DEF MOVEMENT IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 END DEF DRAW SPOFS 0,DX,DY END DEF NOISE IF BUTTON(1,#B_RRIGHT) THEN BEEP 6 END ``` Defining routines as functions can be very helpful for organization. Among other things
Posted Edited by MZ952
• #9 ✎ 9 Craftman780
So basicall,y Id have to keep all my code in a loop?
Not necessarily. ```CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP MOVEMENT DRAW NOISE VSYNC ENDLOOP DEF MOVEMENT IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 END DEF DRAW SPOFS 0,DX,DY END DEF NOISE IF BUTTON(1,#B_RRIGHT) THEN BEEP 6 END ``` Defining routines as functions can be very helpful for organization.
My code now looks like this ``` '---------------------------------------------------------------------' ' MOVEMENT' CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 SPOFS 0,DX,DY VSYNC '---------------------------------------------------------------' '---------------------------------------------------------------' ' BEEP' IF BUTTON(1,#B_A,1) THEN BEEP 2 '---------------------------------------------------------------' ENDLOOP ``` Thanks! I will also try the defining bit :D
Posted Edited by Craftman780
• #10 ✎ 9 Craftman780
So basicall,y Id have to keep all my code in a loop?
Not necessarily. ```CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP MOVEMENT DRAW NOISE VSYNC ENDLOOP DEF MOVEMENT IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 END DEF DRAW SPOFS 0,DX,DY END DEF NOISE IF BUTTON(1,#B_RRIGHT) THEN BEEP 6 END ``` Defining routines as functions can be very helpful for organization. Among other things
My code now looks like this. It is indeed much cleaner. :D ``` CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP MOVEMENT DRAW NOISE ENDLOOP 'DEFINITIONS' '-----------------------------------------------------------------' DEF MOVEMENT IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY-DY-1 IF BUTTON)1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY<220 THEN DY=220 END '-----------------------------------------------------------------' DEF DRAW SPOFS 0,DX,DY END '-----------------------------------------------------------------' DEF NOISE IF BUTTON(1,#B_A,2) THEN BEEP 2 END '-----------------------------------------------------------------' ``` Now, what if I wanted to add an inventory? Like a black square with a white outline, and a pointer, while still using the directional buttons for selections? And just items in general like a sword that can be picked up just be moving across it?
Posted Edited by Craftman780
• #11 ✎ 408 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Third Year My account is over 3 years old Website Reading I like to read books! Hobbies Well, a simple inventory system might use a 2d array to store things. `DIM INVNTRY[8,16]` for example. 8 slots tall, 16 slots wide. You could store an internal "inventory index" to keep track of which inventory slot the user is hovering over, and that inventory index could be used to interpret a position of the sprites and so forth that would draw the inventory representation on the screen. ```DIM INV[8,16],INV_SLOT_X=0,INV_SLOT_Y=0 DIM INV_SLOT_SIZE=8'size in pixels LOOP _INPUT DRAW VSYNC ENDLOOP DEF _INPUT IF BUTTON(0,#B_LUP) THEN DEC INV_SLOT_Y ENDIF IF BUTTON(0,#B_LDOWN) THEN INC INV_SLOT_Y ENDIF IF BUTTON(0,#B_LLEFT) THEN DEC INV_SLOT_X ENDIF IF BUTTON(0,#B_LRIGHT) THEN INC INV_SLOT_X ENDIF INV_SLOT_X=MIN(MAX(0,INV_SLOT_X),16-1)'keep cursor in boundaries INV_SLOT_Y=MIN(MAX(0,INV_SLOT_Y),8-1)'--- END DEF DRAW GCLS 0 DIM X,Y,ISS=INV_SLOT_SIZE FOR Y=0 TO 8-1 FOR X=0 TO 16-1 IF X==INV_SLOT_X && Y==INV_SLOT_Y THEN GFILL X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ELSE GBOX X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ENDIF NEXT X NEXT Y END``` INV_SLOT_X and INV_SLOT_Y point to an element of INV, which is a 2 dimensional array. So, if we treat objects in the inventory as numbers, say, 3 is a sword, you can set and get values of the inventory by accessing them. INV[INV_SLOT_Y,INV_SLOT_X]=3 X and Y in the DRAW routine correspond to elements of the inventory, so you can use that to draw certain images in the inventory slots. Say, 3 also corresponds to the sprite number of the object. ```DEF DRAW GCLS 0 DIM X,Y,ISS=INV_SLOT_SIZE FOR Y=0 TO 8-1 FOR X=0 TO 16-1 IF X==INV_SLOT_X && Y==INV_SLOT_Y THEN GFILL X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ELSE GBOX X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ENDIF SPSET ManagementNumber,INV[Y,X]'definition number SPOFS ManagementNumber,X*ISS,Y*ISS NEXT X NEXT Y END``` Also, I haven't tested any of this code, so I might've made a mistake lol Posted Edited by MZ952
• #12 ✎ 9 Craftman780
Well, a simple inventory system might use a 2d array to store things. `DIM INVNTRY[8,16]` for example. 8 slots tall, 16 slots wide. You could store an internal "inventory index" to keep track of which inventory slot the user is hovering over, and that inventory index could be used to interpret a position of the sprites and so forth that would draw the inventory representation on the screen. ```DIM INV[8,16],INV_SLOT_X=0,INV_SLOT_Y=0 DIM INV_SLOT_SIZE=8'size in pixels LOOP _INPUT DRAW VSYNC ENDLOOP DEF _INPUT IF BUTTON(0,#B_LUP) THEN DEC INV_SLOT_Y ENDIF IF BUTTON(0,#B_LDOWN) THEN INC INV_SLOT_Y ENDIF IF BUTTON(0,#B_LLEFT) THEN DEC INV_SLOT_X ENDIF IF BUTTON(0,#B_LRIGHT) THEN INC INV_SLOT_X ENDIF INV_SLOT_X=MIN(MAX(0,INV_SLOT_X),16-1)'keep cursor in boundaries INV_SLOT_Y=MIN(MAX(0,INV_SLOT_Y),8-1)'--- END DEF DRAW GCLS 0 DIM X,Y,ISS=INV_SLOT_SIZE FOR Y=0 TO 8-1 FOR X=0 TO 16-1 IF X==INV_SLOT_X && Y==INV_SLOT_Y THEN GFILL X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ELSE GBOX X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ENDIF NEXT X NEXT Y END``` INV_SLOT_X and INV_SLOT_Y point to an element of INV, which is a 2 dimensional array. So, if we treat objects in the inventory as numbers, say, 3 is a sword, you can set and get values of the inventory by accessing them. INV[INV_SLOT_Y,INV_SLOT_X]=3 X and Y in the DRAW routine correspond to elements of the inventory, so you can use that to draw certain images in the inventory slots. Say, 3 also corresponds to the sprite number of the object. ```DEF DRAW GCLS 0 DIM X,Y,ISS=INV_SLOT_SIZE FOR Y=0 TO 8-1 FOR X=0 TO 16-1 IF X==INV_SLOT_X && Y==INV_SLOT_Y THEN GFILL X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ELSE GBOX X*ISS,Y*ISS,X*ISS+ISS,Y*ISS+ISS ENDIF SPSET ManagementNumber,INV[Y,X]'definition number SPOFS ManagementNumber,X*ISS,Y*ISS NEXT X NEXT Y END``` Also, I haven't tested any of this code, so I might've made a mistake lol
It works for the most part, but it doesn't necessarily stay within the confines of the box. The white pixel also gets longer the further it goes to the right. It also goes out of the box when it 'reaches' the threshold.
Posted
• #13 ✎ 408 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Third Year My account is over 3 years old Website Reading I like to read books! Hobbies
It works for the most part, but it doesn't necessarily stay within the confines of the box. The white pixel also gets longer the further it goes to the right. It also goes out of the box when it 'reaches' the threshold.
Are you sure you copied the code over right? I tested it on my 3DS (in this case only the button codes are different in SB3) and it seems to work fine. Edit: I would double check the DRAW function. I condensed it as much I could for readability, but it's totally possible to mistake an x for a y and so on, which would explain what you're seeing.
Posted Edited by MZ952
• #14 ✎ 9 Craftman780
It works for the most part, but it doesn't necessarily stay within the confines of the box. The white pixel also gets longer the further it goes to the right. It also goes out of the box when it 'reaches' the threshold.
Are you sure you copied the code over right? I tested it on my 3DS (in this case only the button codes are different in SB3) and it seems to work fine. Edit: I would double check the DRAW function. I condensed it as much I could for readability, but it's totally possible to mistake an x for a y and so on, which would explain what you're seeing.
I think it's different on the 3DS. I think it uses v3 instead of the now current 4 Also, how would I make a background? Like the interior of a house, then the door would take you to like an overworld type deal?
Posted Edited by Craftman780
• #15 ✎ 408 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Third Year My account is over 3 years old Website Reading I like to read books! Hobbies
I think it's different on the 3DS. I think it uses v3 instead of the now current 4 Also, how would I make a background? Like the interior of a house, then the door would take you to like an overworld type deal?
I'm familiar with both SB3 and SB4, they are built very similarly (SB4 is basically an advanced SB3; same instructions, same syntax, etc., new functionalities). The code should work the same on both platforms. That sounds like something artistically specific that you might need to figure out by experimentation. I suggest looking around forum sites like this and looking at others' code to figure out what makes them tick.
Posted Edited by MZ952
• #16 ✎ 42 splapoon
DAY 1 OF USING SMILE BASIC 4 (Switch) I've implimented movement. ```'---------------------------------------------------------------------' ' MOVEMENT' CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 SPOFS 0,DX,DY VSYNC ENDLOOP '---------------------------------------------------------------------'``` It sets the sprite of a strawberry in the middle of the screen (roughly 185 (direction X) and 115 (direction Y)) and using the joy-con's right directional buttons, I can move the strawberry around the screen which will then stop if it reaches the certain threshold. (see DX,DY) However, If I say want to add right below it (I have it marked out to make it easier to see what's what) like a beep function for the A button like so: ```'---------------------------------------------------------------------' ' MOVEMENT' CLS DX=185,DY=115 SPSET 0,0:SPOFS 0,DX,DY LOOP IF BUTTON(1,#B_LLEFT)==1 THEN DX=DX-1 IF BUTTON(1,#B_LRIGHT)==1 THEN DX=DX+1 IF BUTTON(1,#B_LUP)==1 THEN DY=DY-1 IF BUTTON(1,#B_LDOWN)==1 THEN DY=DY+1 IF DX>360 THEN DX=360 IF DX<0 THEN DX=0 IF DY<0 THEN DY=0 IF DY>220 THEN DY=220 SPOFS 0,DX,DY VSYNC ENDLOOP '---------------------------------------------------------------------' LOOP IF BUTTON(1,B_A,1) THEN BEEP 6 ENDLOOP``` Nothing happens... All the code works just fine (no errors) it's just when I try to press the A button to get it to beep, nothing happens. I would really love some help.
you might have a problem because you put the `BEEP 6` on the same line, try it on the second line or, 2.check the volume 3. turn the `LOOP` to `@LOOP` 4.remove the `END LOOP` and replace it with a `GOTO @LOOP`
Posted
• #17 ✎ 565 HTV04 Forum Leader Hidden Achievements Third Year My account is over 3 years old Website Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength
3. turn the `LOOP` to `@LOOP` 4.remove the `END LOOP` and replace it with a `GOTO @LOOP`