adding curved movement
BlitzPlus Forums/BlitzPlus Programming/adding curved movement
Hi, I have made this intro effect that takes a picture and cut it in boxes 16x16 pixels. And then it places these boxes randomly on the screen and moves them back to their original place. But the thing is, that it moves the boxes straight to their place and I would like to add a curved movement or something to make it look a little more interesting. If you have any ideas please feel free to comment. Here is the code:
;// FULL SCREEN PICTURE EFFECT
; SET GRAPHICS MODE
Graphics 640,480
; LOAD STUFF
picture = LoadImage("das3.jpg") ;change filename to any 640x480 picture
;// SETUP VARIABLES
Dim expos(1200),eypos(1200)
Dim cxpos(1200),cypos(1200)
x=0
y=0
For a=0 To 1199
expos(a)=x
eypos(a)=y
x=x+16
If x>624 Then
x=0
y=y+16
End If
cxpos(a)=Rnd(623)
cypos(a)=Rnd(463)
Next
;// SETUP MOUSE CHECK
mx1=0
mx2=MouseX()
; Go double buffering
SetBuffer BackBuffer()
While Not KeyHit(1)
mx1=MouseX() : If mx1<>mx2 Then End ; if mouse is moved then end program
For a=0 To 1199
CopyRect expos(a),eypos(a),16,16,cxpos(a),cypos(a),ImageBuffer(picture),BackBuffer()
If cxpos(a) <> expos(a) Then
If cxpos(a) < expos(a) Then cxpos(a) = cxpos(a) + 1
If cxpos(a) > expos(a) Then cxpos(a) = cxpos(a) - 1
End If
If cypos(a) <> eypos(a) Then
If cypos(a) < eypos(a) Then cypos(a) = cypos(a) + 1
If cypos(a) > eypos(a) Then cypos(a) = cypos(a) - 1
End If
Next
Flip ; show backbuffer
Cls ; Clear screen
Wend
End
;// END OF CODE
Zawran
You could accomplish this in many ways- it depends on the speed required, the type of path required etc.
You could do some grunt-work and calculate a curved path between two random points but it's probably overkill for a transition effect.
An easier way would be to start with (but not necessarily show) the block in its target position and move it along a curved path some number of times. Then to get the desired effect simply replay the movement.
In this example i've used rectangles instead of images for simplicity. The end position and current position start off the same. The current position is then shifted on a circular path 100 steps. When you press a key the path is 'replayed' giving you the desired effect.
You could modify the example by changing the amount the angle (a) increases/decreases or the transcendental functions used to give some interesting curves!
Hope this gives you some ideas :)
Graphics 800,600,16,1
SetBuffer BackBuffer()
Global cur_x#, cur_y#, end_x#, end_y#
;position object and destination
cur_x=400
cur_y=300
end_x=400
end_y=300
a=0
For loop=0 To 100
cur_x=cur_x+2*Cos(a)
cur_y=cur_y+2*Sin(a)
a=a+1
Next
Rect end_x-4, end_y-4, 8, 8, 0
Rect cur_x-4, cur_y-4, 8, 8, 1
Text 0,0, "Pres a key"
Flip
WaitKey()
Cls
For loop=0 To 100
Cls
Rect end_x-4, end_y-4, 8, 8, 0
Rect cur_x-4, cur_y-4, 8, 8, 1
Flip
cur_x=cur_x-2*Cos(a)
cur_y=cur_y-2*Sin(a)
a=a-1
Next
End
Heres another method:
; Chaser
Const sw=640,sh=480
Const sz=25 ; size of square/oval
Graphics sw,sh,0,2
SetBuffer BackBuffer()
x#=Rand(20,sw-20) : y#=Rand(20,sh-20)
destx#=x : desty#=y
speed#=0.05
Repeat
Cls
Color 100,100,100
Text 10,10,"Click LMB to position RED square"
Text 10,40,"Speed = "+speed
Text 140,40,"<- Change with Cursor keys LEFT /RIGHT"
If MouseHit(1) Then destx=MouseX() : desty=MouseY()
speed=speed+Float(KeyDown(205)-KeyDown(203))*0.001
x=x+(destx-x)*speed : y=y+(desty-y)*speed
Color 200,20,20 : Rect destx-sz/2,desty-sz/2,sz,sz
Color 20,230,20 : Oval x-sz/2,y-sz/2,sz,sz
Flip
Until KeyHit(1)
End
Syntax
That's pretty good but I don't see any curved paths there :)
I would like to add a curved movement or something to make it look a little more interesting
@MuffinRemnant,
No curved paths there. Just another method for Zawran to play with.
The code moves the object at a slower rate the nearer it gets to its destination.
Ok - try this Zawran - 640x480 into 32x32 tiles moving to their detination in curved paths (sorry it's a bit rough but it's a 15 minute knock up)...
Graphics 640,480,16,1
SetBuffer BackBuffer()
Global cur_x#, cur_y#, end_x#, end_y#
Dim grbimg%(300)
Dim cx#(300)
Dim cy#(300)
Dim q#(300)
bigimg=LoadImage("Image1.jpg")
DrawImage bigimg,0,0
; grab the bits
count=0
For y=0 To 448 Step 32
For x=0 To 608 Step 32
grbimg(count)=CreateImage(32,32)
GrabImage grbimg(count), x, y
count=count+1
Next
Next
; position at start
count=0
For y=0 To 448 Step 32
For x=0 To 608 Step 32
cx(count)=x
cy(count)=y
count=count+1
Next
Next
; do 1000 steps for each grabbed image
For loop=0 To 299
a=0
q(loop)= Rnd(-4,4)
For steps = 0 To 99
cx(loop)=cx(loop)+q(loop)*Cos(a)
cy(loop)=cy(loop)+q(loop)*Sin(a)
a=a+2
Next
Next
a=a-2
; playback time
; repeat 100 steps
For steps=0 To 100
Cls
; draw all grabbed images
For loop=0 To 299
DrawImage grbimg(loop), cx(loop), cy(loop)
; update
cx(loop)=cx(loop)-q(loop)*Cos(a)
cy(loop)=cy(loop)-q(loop)*Sin(a)
Next
;show
Flip
a=a-2
Next
; wait for key
WaitKey()
End
I might suggest that you search the forums for some code related to bezier curves. These are a class of cubic spline curves that were adopted because they are simple to implement and lead to some very smooth curves that are easy to deflect and control. You now find them in most drawing packages. They were initially developed to aid in finding the most visually satisfying curve functions for shaping automobile parts. I already found two programs out there, and once you understand the principles of the code, I believe you can come with some excellent results that will fit your needs.