#1✎ 9Craftman780DAY 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✎ 411MZ952Intermediate ProgrammerI can make programs, but I still have trouble here and there. Programming StrengthThird YearMy account is over 3 years oldWebsiteReadingI like to read books!HobbiesThe 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✎ 246niconiiPower UserVideo GamesI like to play video games!HobbiesExpert ProgrammerProgramming no longer gives me any trouble. Come to me for help, if you like!Programming StrengthDrawingI like to draw!HobbiesKeep 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✎ 246niconiiPower UserVideo GamesI like to play video games!HobbiesExpert ProgrammerProgramming no longer gives me any trouble. Come to me for help, if you like!Programming StrengthDrawingI 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✎ 411MZ952Intermediate ProgrammerI can make programs, but I still have trouble here and there. Programming StrengthThird YearMy account is over 3 years oldWebsiteReadingI like to read books!HobbiesAh, 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
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
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✎ 411MZ952Intermediate ProgrammerI can make programs, but I still have trouble here and there. Programming StrengthThird YearMy account is over 3 years oldWebsiteReadingI 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
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
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✎ 411MZ952Intermediate ProgrammerI can make programs, but I still have trouble here and there. Programming StrengthThird YearMy account is over 3 years oldWebsiteReadingI like to read books!HobbiesWell, 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
ENDINV_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]=3X 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
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
ENDINV_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]=3X 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✎ 411MZ952Intermediate ProgrammerI can make programs, but I still have trouble here and there. Programming StrengthThird YearMy account is over 3 years oldWebsiteReadingI 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
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✎ 411MZ952Intermediate ProgrammerI can make programs, but I still have trouble here and there. Programming StrengthThird YearMy account is over 3 years oldWebsiteReadingI 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
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✎ 565HTV04Forum LeaderHiddenAchievementsThird YearMy account is over 3 years oldWebsiteIntermediate ProgrammerI 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
LOOP and ENDLOOP are valid commands in SB4.
I think this was already answered. Please read the above posts before posting yourself.
Posted
Edited
by HTV04