Page 1 of 1
Circle Sin Text
Posted: Mon Jun 15, 2020 5:43 pm
by Swos2009
I got the code working in Sin text in circle but I cant seem get the message right because it seem covering other letters.
What am I doing wrong?
Code: Select all
If InitSprite() = 0 Or InitKeyboard() = 0 Or OpenScreen(640,480,32,"App Title") = 0
MessageRequester("Error!", "Unable to Initialize Environment", #PB_MessageRequester_Ok)
End
EndIf
Dim Message$(26)
Message$(0)="H"
Message$(1)="E"
Message$(2)="L"
Message$(3)="L"
Message$(4)="O"
Message$(5)="A"
Message$(6)="N"
Message$(7)="D"
Message$(8)="W"
Message$(9)="E"
Message$(10)="L"
Message$(11)="C"
Message$(12)="O"
Message$(13)="M"
Message$(14)="E"
Message$(15)="T"
Message$(16)="O"
Message$(17)="P"
Message$(18)="U"
Message$(19)="R"
Message$(20)="E"
Message$(21)="B"
Message$(22)="A"
Message$(23)="S"
Message$(24)="I"
Message$(25)="C"
Repeat
beta=beta+1
ClearScreen(0)
ExamineKeyboard()
If StartDrawing(ScreenOutput())
i=0
For i=0 To 25;
gamma=i*45+beta
X=164*Sin(gamma)+160
Y=132*Cos(gamma)+64
DrawText(150+X,150+Y,Message$(i))
Next
EndIf
StopDrawing()
FlipBuffers()
Delay(25)
Until KeyboardPushed(#PB_Key_Escape)
End
Re: Circle Sin Text
Posted: Mon Jun 15, 2020 6:42 pm
by Mijikai
Divide the circle in enough spaces...
A separate string array is not really needed - just read the chars directly from memory
Code: Select all
EnableExplicit
Procedure.i Main(Width.i,Height.i,Title.s = #Null$)
Protected wnd.i
Protected wnd_event.i
Protected *chr.Ascii
Protected text.s
Protected x.i
Protected y.i
Protected gamma.f
Protected beta.f
Protected slice.f
Protected speed.f
If InitSprite()
wnd = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If wnd
If OpenWindowedScreen(WindowID(wnd),#Null,#Null,Width,Height,#False,#Null,#Null,#PB_Screen_WaitSynchronization)
SetFrameRate(50)
text = "------- Hello and welcome to PureBasic -------"
slice = 360 / Len(text);spacing
Repeat
Repeat
wnd_event = WindowEvent()
If wnd_event = #PB_Event_CloseWindow
Break 2
EndIf
ClearScreen($0)
StartDrawing(ScreenOutput())
speed + 0.8
beta = speed
*chr = @text;<- get base pointer to chars
Repeat
gamma = Radian(beta)
x = 200 * Sin(gamma)
y = 200 * -Cos(gamma)
DrawText(x + 400 ,y + 300 ,Chr(*chr\a),$FF8088 + x - y )
beta + slice
*chr + SizeOf(Character);<- advance chr pointer
Until *chr\a = #Null
StopDrawing()
FlipBuffers()
Until wnd_event = #Null
ForEver
EndIf
CloseWindow(wnd)
EndIf
EndIf
ProcedureReturn #Null
EndProcedure
Main(800,600)
End
Re: Circle Sin Text
Posted: Mon Jun 15, 2020 7:57 pm
by Swos2009
Thanks Mijikai , I learn somethings new as I didnt know that you can do just read the chars directly from memory

Re: Circle Sin Text
Posted: Mon Jun 15, 2020 8:13 pm
by mk-soft
Nice Mijikai
but is better to use *chr.character as ASCII. Then works safe with Unicode.
Code: Select all
EnableExplicit
Procedure.i Main(Width.i,Height.i,Title.s = #Null$)
Protected wnd.i
Protected wnd_event.i
Protected *chr.character
Protected text.s
Protected x.i
Protected y.i
Protected gamma.f
Protected beta.f
Protected slice.f
Protected speed.f
If InitSprite()
wnd = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If wnd
If OpenWindowedScreen(WindowID(wnd),#Null,#Null,Width,Height,#False,#Null,#Null,#PB_Screen_WaitSynchronization)
SetFrameRate(50)
text = "------- Hello and welcome to PureBasic -------"
slice = 360 / Len(text);spacing
Repeat
Repeat
wnd_event = WindowEvent()
If wnd_event = #PB_Event_CloseWindow
Break 2
EndIf
ClearScreen($0)
StartDrawing(ScreenOutput())
speed + 0.8
beta = speed
*chr = @text;<- get base pointer to chars
Repeat
gamma = Radian(beta)
x = 200 * Sin(gamma)
y = 200 * -Cos(gamma)
DrawText(x + 400 ,y + 300 ,Chr(*chr\c),$FF8088 + x - y )
beta + slice
*chr + SizeOf(Character);<- advance chr pointer
Until *chr\c = #Null
StopDrawing()
FlipBuffers()
Until wnd_event = #Null
ForEver
EndIf
CloseWindow(wnd)
EndIf
EndIf
ProcedureReturn #Null
EndProcedure
Main(800,600)
End
Re: Circle Sin Text
Posted: Mon Jun 15, 2020 8:36 pm
by Mijikai
mk-soft wrote:Nice Mijikai
but is better to use *chr.character as ASCII. Then works safe with Unicode.
True

Missed that - i usually only care about the ascii table thats why i dont need the second byte

Re: Circle Sin Text
Posted: Mon Jun 15, 2020 8:38 pm
by davido
Very nice.
I wouldn't have a clue how to do this; so I'll find it an interesting study.
I found it a bit difficult to read - so I changed it to anti-clockwise.
Re: Circle Sin Text
Posted: Mon Jun 15, 2020 8:49 pm
by kernadec
hello
to have fun
best regard
Code: Select all
If InitSprite() = 0 Or InitKeyboard() = 0 Or OpenScreen(640,480,32,"App Title") = 0
MessageRequester("Error!", "Unable to Initialize Environment", #PB_MessageRequester_Ok)
End
EndIf
Dim Message$(26)
Message$(0)="H"
Message$(1)="E"
Message$(2)="L"
Message$(3)="L"
Message$(4)="O"
Message$(5)="A"
Message$(6)="N"
Message$(7)="D"
Message$(8)="W"
Message$(9)="E"
Message$(10)="L"
Message$(11)="C"
Message$(12)="O"
Message$(13)="M"
Message$(14)="E"
Message$(15)="T"
Message$(16)="O"
Message$(17)="P"
Message$(18)="U"
Message$(19)="R"
Message$(20)="E"
Message$(21)="B"
Message$(22)="A"
Message$(23)="S"
Message$(24)="I"
Message$(25)="C"
Repeat
beta=beta+1
ClearScreen(0)
ExamineKeyboard()
If StartDrawing(ScreenOutput())
i=0
For i=0 To 25;
gamma=i*14+beta
X=150 + 160 * Cos(Radian(gamma))
Y=100 + 64 * -Sin(Radian(gamma))
DrawText(180+X,100+Y,Message$(25-i),RGB(55+Random(200),55+Random(200),55+Random(200)))
Next
EndIf
StopDrawing()
FlipBuffers()
Delay(25)
Until KeyboardPushed(#PB_Key_Escape)
End
Re: Circle Sin Text
Posted: Mon Jun 15, 2020 10:11 pm
by Mijikai
This is fun!
Rotate in other direction and some effects
Code: Select all
EnableExplicit
Procedure.i Main(Width.i,Height.i,Title.s = #Null$)
Protected wnd.i
Protected wnd_event.i
Protected *chr.character
Protected text.s
Protected x1.i
Protected y1.i
Protected x2.i
Protected y2.i
Protected x3.i
Protected y3.i
Protected gamma.f
Protected beta.f
Protected slice.f
Protected speed.f
Protected mod.i
If InitSprite()
wnd = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If wnd
If OpenWindowedScreen(WindowID(wnd),#Null,#Null,Width,Height,#False,#Null,#Null,#PB_Screen_WaitSynchronization)
SetFrameRate(50)
text = "------- Hello and welcome to PureBasic -------"
slice = 360 / Len(text);spacing
Repeat
Repeat
wnd_event = WindowEvent()
If wnd_event = #PB_Event_CloseWindow
Break 2
EndIf
ClearScreen($0)
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
speed + 0.8
beta = speed
*chr = @text;<- get base pointer to chars
mod = 0
Repeat
gamma = Radian(360 - beta)
x1 = (x1 / 10 - y1) * Sin(gamma) * (mod / 50)
y1 = 200 + mod * -Cos(gamma)
DrawText(x1 + 400 ,y1 + 300 ,Chr(*chr\c),$FF8088 + x1 - y1 )
x2 = (x2 / 10 - y2) * Sin(gamma)
y2 = 100 * -Cos(gamma)
DrawText(x2 + 400 ,y2 + 220 ,Chr(*chr\c),$FF8088 + x2 - y2 )
x3 = 200 * Sin(gamma)
y3 = 200 * -Cos(gamma)
DrawText(x3 + 400 ,y3 + 220 ,Chr(*chr\c),$FF8088 + x3 - y3 )
mod + 1
beta - slice
*chr + SizeOf(Character);<- advance chr pointer
Until *chr\c = #Null
StopDrawing()
FlipBuffers()
Until wnd_event = #Null
ForEver
EndIf
CloseWindow(wnd)
EndIf
EndIf
ProcedureReturn #Null
EndProcedure
Main(800,600)
End