Page 1 of 1
newbie question
Posted: Sun Mar 02, 2008 8:05 pm
by t57042
Hello,
I am new to PB and I am trying out some stuff.
The code below displays a small block wich advances every second .
Meanwhile with the buttons the direction of the block can be changed.
Why does it take 2 seconds for the box to react and change direction??
Code: Select all
; ------------------------------------------------------------
;
; sim3
; ------------------------------------------------------------
Global ydirection,xdirection
;;==================================================
Procedure timer(t)
StartTime = ElapsedMilliseconds()
Repeat
ElapsedTime = ElapsedMilliseconds()-StartTime
Event.l = WindowEvent()
If Event = #PB_Event_Gadget
; do the normal application stuff here...
Gadget = EventGadget()
Select Gadget
Case 1
SetGadgetText(4,"north")
ydirection = -10
xdirection=0
Case 2
SetGadgetText(4,"south")
ydirection = 10
xdirection=0
Case 3
SetGadgetText(4,"east")
ydirection = 0
xdirection=10
Case 5
SetGadgetText(4,"west")
ydirection = 0
xdirection=-10
EndSelect
EndIf
If Event = #PB_Event_CloseWindow
End
EndIf
Until ElapsedTime>t
EndProcedure
;==================================================
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
End
EndIf
If OpenWindow(0,0,0,610,410,"Sim 3",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ButtonGadget(1,540, 10,60,20,"north")
ButtonGadget(2,540, 40,60,20,"south")
ButtonGadget(3,540, 70,60,20,"east")
ButtonGadget(5,540, 100,60,20,"west")
TextGadget (4,540,140,60,30,"")
EndIf
If OpenWindowedScreen(WindowID(0),5,5,520,400,0,0,0)
CreateSprite(0,10,10)
If StartDrawing(SpriteOutput(0))
FrontColor(RGB(255,0,100))
Box(0,0,10,10)
StopDrawing()
EndIf
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
End
EndIf
EndIf
y=200
xdirection = 10
ydirection = 0
Repeat
; do the sprite & screen stuff here...
FlipBuffers()
; Clear the screen and draw our sprites
ClearScreen(RGB(0,0,0))
DisplaySprite(0, x, y)
x + xdirection
y + ydirection
timer(1000)
ForEver
End
[edit by Rings, setting Codetags ]
Posted: Sun Mar 02, 2008 8:24 pm
by eJan
Edit - removed.
Posted: Sun Mar 02, 2008 8:25 pm
by hellhound66
Removed.
Posted: Sun Mar 02, 2008 9:38 pm
by Kaeru Gaman
> Your main loop has got a wrong command order.
exactly.
to be more precise:
your old order:
1) FlipBuffers()
2) DisplaySprite(0, x, y)
3) x + xdirection : y + ydirection
4) timer(1000)
4) you change direction
1) then you show the sprite you have displayed one frame earlier that was displayed at the position calculated two frames earlier
2) then you display the position you have calculated one frame earlier
3 then you calculate the next position with the new direction-vars
Posted: Tue Mar 04, 2008 4:04 pm
by t57042
Thanks very much guys. Next question.
As you will see in attached code there i a wide white band over the screen (made with BOX function).
I want to get an irregular shape there, how can I achieve this?
I want to be able to check wether the small boxes are within the white area, so I think the white area has to be one big sprite?
Richard
--------------------------------------------------------------------------
; ------------------------------------------------------------
;
; sim6
; ------------------------------------------------------------
Global ydirection,xdirection
scanrate=1000
;;==================================================
Procedure timer(t)
StartTime = ElapsedMilliseconds()
Repeat
ElapsedTime = ElapsedMilliseconds()-StartTime
Event.l = WindowEvent()
If Event = #PB_Event_Gadget
; do the normal application stuff here...
Gadget = EventGadget()
Select Gadget
Case 1
SetGadgetText(4,"north")
ydirection = -10
xdirection=0
Case 2
SetGadgetText(4,"south")
ydirection = 10
xdirection=0
Case 3
SetGadgetText(4,"east")
ydirection = 0
xdirection=10
Case 5
SetGadgetText(4,"west")
ydirection = 0
xdirection=-10
EndSelect
EndIf
If Event = #PB_Event_CloseWindow
End
EndIf
Until ElapsedTime>t
EndProcedure
;==================================================
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
End
EndIf
OpenWindow(0,0,0,610,410,"Alfama - ATC aptitude testing ",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_Maximize )
CreateGadgetList(WindowID(0))
ButtonGadget(1,840, 10,60,20,"north")
ButtonGadget(2,840, 40,60,20,"south")
ButtonGadget(3,840, 70,60,20,"east")
ButtonGadget(5,840, 100,60,20,"west")
TextGadget (4,840,140,60,30,"")
OpenWindowedScreen(WindowID(0),5,5,820,650,0,0,0)
CreateSprite(0,10,10)
CreateSprite(1,10,10)
CreateSprite(2,800,400)
StartDrawing(SpriteOutput(2))
FrontColor(RGB(243,240,220))
Box(10,0,900,400)
StopDrawing()
StartDrawing(SpriteOutput(0))
FrontColor(RGB(255,0,100))
Box(0,0,10,10)
StopDrawing()
StartDrawing(SpriteOutput(1))
FrontColor(RGB(100,100,100))
Box(0,0,10,10)
StopDrawing()
y=200
xdirection = 10
ydirection = 0
Repeat
timer(scanrate)
x + xdirection
y + ydirection
ClearScreen(RGB(0,0,0))
DisplaySprite(2, 0, 150)
DisplaySprite(0, x, y)
DisplaySprite(1, x, y+100)
FlipBuffers()
ForEver
End
Posted: Tue Mar 04, 2008 4:09 pm
by Kaeru Gaman
edit the code-tags, please. it's not readable that way.
Posted: Tue Mar 04, 2008 4:14 pm
by t57042
What do you mean by edit the code tags?
In my browser everything is readable.
Richard
Posted: Tue Mar 04, 2008 4:16 pm
by Kaeru Gaman
please insert the code into [code] [/code]
(you did it in your first post, so why not this time?)
to make it shown in a box with correct tabs and all.
without the codebox it's a p.i.t.a. to read it...
Posted: Tue Mar 04, 2008 4:38 pm
by Fluid Byte
Kaeru Gaman wrote:you did it in your first post, so why not this time?
Rings wrote:[edit by Rings, setting Codetags ]
Posted: Tue Mar 04, 2008 4:39 pm
by Kaeru Gaman
oops... so he probably doesn't know what I'm talking about... shame
Posted: Tue Mar 04, 2008 4:39 pm
by t57042
Another try
Code: Select all
; ------------------------------------------------------------
;
; sim6
; ------------------------------------------------------------
Global ydirection,xdirection
scanrate=1000
;;==================================================
Procedure timer(t)
StartTime = ElapsedMilliseconds()
Repeat
ElapsedTime = ElapsedMilliseconds()-StartTime
Event.l = WindowEvent()
If Event = #PB_Event_Gadget
; do the normal application stuff here...
Gadget = EventGadget()
Select Gadget
Case 1
SetGadgetText(4,"north")
ydirection = -10
xdirection=0
Case 2
SetGadgetText(4,"south")
ydirection = 10
xdirection=0
Case 3
SetGadgetText(4,"east")
ydirection = 0
xdirection=10
Case 5
SetGadgetText(4,"west")
ydirection = 0
xdirection=-10
EndSelect
EndIf
If Event = #PB_Event_CloseWindow
End
EndIf
Until ElapsedTime>t
EndProcedure
;==================================================
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
End
EndIf
OpenWindow(0,0,0,610,410,"Alfama - ATC aptitude testing ",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_Maximize )
CreateGadgetList(WindowID(0))
ButtonGadget(1,840, 10,60,20,"north")
ButtonGadget(2,840, 40,60,20,"south")
ButtonGadget(3,840, 70,60,20,"east")
ButtonGadget(5,840, 100,60,20,"west")
TextGadget (4,840,140,60,30,"")
OpenWindowedScreen(WindowID(0),5,5,820,650,0,0,0)
CreateSprite(0,10,10)
CreateSprite(1,10,10)
CreateSprite(2,800,400)
StartDrawing(SpriteOutput(2))
FrontColor(RGB(243,240,220))
Box(10,0,900,300)
StopDrawing()
StartDrawing(SpriteOutput(0))
FrontColor(RGB(255,0,100))
Box(0,0,10,10)
StopDrawing()
StartDrawing(SpriteOutput(1))
FrontColor(RGB(100,100,100))
Box(0,0,10,10)
StopDrawing()
y=200
xdirection = 10
ydirection = 0
Repeat
timer(scanrate)
x + xdirection
y + ydirection
ClearScreen(RGB(0,0,0))
DisplaySprite(2, 0, 150)
DisplaySprite(0, x, y)
DisplaySprite(1, x, y+100)
FlipBuffers()
ForEver
End
Posted: Tue Mar 04, 2008 4:50 pm
by Kaeru Gaman
you could use a sprite, yes, but you could also use a loop to draw a bunch of lines.
to check if the boxes are within the shape, you can test via coordinates.
thus, you have to keep the values for the shape in an array.
Posted: Tue Mar 04, 2008 5:23 pm
by Kaeru Gaman
little demo:
your code, added two arrays for the area-limits and the check
Code: Select all
; ------------------------------------------------------------
;
; sim6
; ------------------------------------------------------------
Global ydirection,xdirection
scanrate=1000
;;==================================================
Procedure timer(t)
StartTime = ElapsedMilliseconds()
Repeat
ElapsedTime = ElapsedMilliseconds()-StartTime
Event.l = WindowEvent()
If Event = #PB_Event_Gadget
; do the normal application stuff here...
Gadget = EventGadget()
Select Gadget
Case 1
SetGadgetText(4,"north")
ydirection = -10
xdirection=0
Case 2
SetGadgetText(4,"south")
ydirection = 10
xdirection=0
Case 3
SetGadgetText(4,"east")
ydirection = 0
xdirection=10
Case 5
SetGadgetText(4,"west")
ydirection = 0
xdirection=-10
EndSelect
EndIf
If Event = #PB_Event_CloseWindow
End
EndIf
Until ElapsedTime>t
EndProcedure
;==================================================
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
End
EndIf
OpenWindow(0,0,0,610,410,"Alfama - ATC aptitude testing ",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_Maximize )
CreateGadgetList(WindowID(0))
ButtonGadget(1,840, 10,60,20,"north")
ButtonGadget(2,840, 40,60,20,"south")
ButtonGadget(3,840, 70,60,20,"east")
ButtonGadget(5,840, 100,60,20,"west")
TextGadget (4,840,140,60,30,"")
OpenWindowedScreen(WindowID(0),5,5,820,650,0,0,0)
CreateSprite(0,10,10)
CreateSprite(1,10,10)
CreateSprite(2,800,400)
; ** presetting the values
#GraphShift = 150
Dim va(799)
Dim vb(799)
For n=0 To 799
va(n) = 50+50*Sin(n/30)
vb(n) = 340+60*Cos(n/40)
Next
StartDrawing(SpriteOutput(2))
FrontColor(RGB(243,240,220))
; drawing the lines into the sprite
For n=0 To 799
LineXY(n,va(n),n,vb(n))
Next
StopDrawing()
StartDrawing(SpriteOutput(0))
FrontColor(RGB(255,0,100))
Box(0,0,10,10)
StopDrawing()
StartDrawing(SpriteOutput(1))
FrontColor(RGB(100,100,100))
Box(0,0,10,10)
StopDrawing()
y=200
xdirection = 10
ydirection = 0
Repeat
timer(scanrate)
x + xdirection
y + ydirection
ClearScreen(RGB(0,0,0))
DisplaySprite(2, 0, #GraphShift)
DisplaySprite(0, x-5, y-5) ; to display the sprite centered on the coordinates
; inbound testing
testy = y - #GraphShift
If testy > va(x) And testy < vb(x)
Out$="IN BOUND"
Else
Out$="OUT BOUND"
EndIf
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(10,10,Out$,$00FFFF)
StopDrawing()
FlipBuffers()
ForEver
End
Posted: Tue Mar 04, 2008 6:30 pm
by t57042
Thank you very much.
Richard