I need help with my code. I want to swap 2 sprites in screen. the sprites have increasing acceleration, so is difficult to calculate the movement. here's my example code:
Strict
Const CENTERX:Int=400
Const CENTERY:Int=300
Graphics CENTERX*2,CENTERY*2,0
Global Object1:TObject=New TObject
Object1.Name="Object1"
Object1.X=CENTERX-100
Object1.Y=CENTERY-120
Global Object2:TObject=New TObject
Object2.Name="Object2"
Object2.X=CENTERX+100
Object2.Y=CENTERY+120
While Not KeyHit(KEY_ESCAPE)
Cls
If MouseHit(1) And Object1.Swap=False And Object2.Swap=False Then SwapObjects(Object1,Object2)
Object1.Update
Object2.Update
Object1.Draw
Object2.Draw
Flip
Wend
Type TObject
Field Name:String
Field X:Double
Field Y:Double
Field AcelX:Float=0
Field AcelY:Float=0
Field AcelInc:Float=0.32
Field AcelTop:Float=8
Field CheckX:Int
Field TargetX:Int
Field TargetY:Int
Field Swap:Int
Field Move:Int
Field StepX:Float=1
Field StepY:Float=1
Method Update()
'increasing acceleration
If Move Then
If CheckX Then
If Abs(X-TargetX) <= Abs(AcelX*AcelX)/0.19 Then Move=False; Return
Else
If Abs(Y-TargetY) <= Abs(AcelY*AcelY)/0.19 Then Move=False; Return
EndIf
If TargetX<X Then AcelX:-AcelInc; If Abs(AcelX)>AcelTop Then AcelX:+AcelInc
If TargetX>X Then AcelX:+AcelInc; If Abs(AcelX)>AcelTop Then AcelX:-AcelInc
If TargetY<Y Then AcelY:-AcelInc; If Abs(AcelY)>AcelTop Then AcelY:+AcelInc
If TargetY>Y Then AcelY:+AcelInc; If Abs(AcelY)>AcelTop Then AcelY:-AcelInc
EndIf
X:+AcelX*StepX
Y:+AcelY*StepY
'decreasing acceleration
If AcelX>0 Then
AcelX:-0.1; If AcelX<0 Then AcelX=0
Else
If AcelX<0 Then
AcelX:+0.1; If AcelX>0 Then AcelX=0
EndIf
EndIf
If AcelY>0 Then
AcelY:-0.1; If AcelY<0 Then AcelY=0
Else
If AcelY<0 Then
AcelY:+0.1; If AcelY>0 Then AcelY=0
EndIf
EndIf
If Swap And (AcelX=0 Or AcelY=0) Then StepX=1; StepY=1; Swap=False; Return
EndMethod
Method Draw()
SetColor 0,0,255
DrawOval X-10,Y-10,20,20
SetColor 255,255,255
DrawText Name,X-30,Y+10
DrawText "X: "+X,X-70,Y+20
DrawText "Y: "+Y,X-70,Y+30
EndMethod
EndType
Function SwapObjects(obj1:TObject Var,obj2:TObject Var)
obj1.TargetX=obj2.X
obj1.TargetY=obj2.Y
obj1.Swap=True
obj1.Move=True
obj1.StepX=Abs(obj1.X-obj1.TargetX)
obj1.StepY=Abs(obj1.Y-obj1.TargetY)
If object1.StepX > object1.StepY Then
obj1.StepY=obj1.StepY/obj1.StepX
obj1.StepX=1
obj1.CheckX=True
Else
obj1.StepX=obj1.StepX/obj1.StepY
obj1.StepY=1
obj1.CheckX=False
EndIf
obj2.TargetX=obj1.X
obj2.TargetY=obj1.Y
obj2.Swap=True
obj2.Move=True
obj2.StepX=Abs(obj2.X-obj2.TargetX)
obj2.StepY=Abs(obj2.Y-obj2.TargetY)
If obj2.StepX > obj2.StepY Then
obj2.StepY=obj2.StepY/obj2.StepX
obj2.StepX=1
obj2.CheckX=True
Else
obj2.StepX=obj2.StepX/obj2.StepY
obj2.StepY=1
obj2.CheckX=False
EndIf
EndFunction
|