运行截图
当手指在手机屏幕上触碰后,屏幕上的图片就会马上追随过来。可以用这里学到的知识去创建游戏人物。
Main窗体代码如下:
#Region 代码说明
'说明:当手指在手机屏幕上触碰后,屏幕上的图片就会马上追随过来。可以用这里学到的知识去创建游戏。
#End Region
#Region Module Attributes
#FullScreen: true
#IncludeTitle: True
#ApplicationLabel: 移动图片
#VersionCode: 1
#VersionName:
#SupportedOrientations: unspecified
#CanInstallToExternalStorage: False
#End Region
'Activity module
Sub Process_Globals
Dim x0 As Float
Dim y0 As Float
'x0和y0被赋值后,这个坐标将位于屏幕的中心点
Dim x1, y1 As Float
Dim Angle As Float : Angle = 0
' Angle 角度,这个变量用来控制图片旋转角度
Dim Speed As Float : Speed = 5dip
'Speed 速度
Dim Timer1 As Timer
'定义一个定时器
End Sub
Sub Globals
Dim bmpImage, bmpImageT As Bitmap
'定义两个位图对象
Dim cvsMain As Canvas
'定义一个画布对象
Dim rectSrc, rectDest As Rect
'定义两个矩形对象,rect 矩形, rectSrc 原始矩形, rectDest目的矩形
'这个例程涉及到较多绘制图片的知识点,大家在学习中要多多留意和学习
End Sub
Sub Activity_Create(FirstTime As Boolean)
'x0和y0被赋值后,这个坐标将位于屏幕的中心点
x0 = 50%x
y0 = 50%y
'调用资源文件里面的一张图片
bmpImage.Initialize(File.DirAssets,"man1.png")
'载入目录资料中的一个图片文件给bmpImage
rectSrc.Initialize(0, 0, bmpImage.Width, bmpImage.Height)
'定义一个矩形区域,这个矩形将位于屏幕左上角
'这个矩形区域现在只是定义,只存在于手机内存中,屏幕上是看不到的,
'bmpImage.Width和bmpImage.Height其实就是man1.png的高宽,可以用这种方法来获取图片的高宽
rectDest.Initialize(x0 - bmpImage.Width / 2, y0 - bmpImage.Height / 2, x0 + bmpImage.Width / 2, y0 + bmpImage.Height / 2)
'定义一个矩形区域,这个矩形将位于屏幕水平和垂直点的中心偏左上角一点
Timer1.Initialize("Timer1",50)
'启动定时器随时监控屏幕的动静,50/1000毫秒
cvsMain.Initialize( Activity)
'通过初始化将确定cvsMain对象对哪个控件进行绘画
cvsMain.DrawBitmapRotated( bmpImage, rectSrc, rectDest, Angle)
'在Activity窗体的背景上画一个有旋转角度的矩形区域,并在这个矩形填充一个图片
'Rotated adj. 旋转的
'库 Core > 类 Canvas > 方法 DrawBitmapRotated (绘制位图并旋转它)
'DrawBitmapRotated ( Bitmap1 As Bitmap, SrcRect As Rect, DestRect As Rect, Degrees As Float )
'Bitmap1 - 被绘制的位置
'SrcRect(源矩形) - 将被绘制的位图的子集.如果为 Null(空)则完整绘制位图.
'DestRect(目标矩形) - 将被绘制的位图矩形.
'Degrees - 位图旋转的角度度数(顺时针)
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Activity_Touch (Action As Int, X As Float, Y As Float)
'在窗体上触碰就引发此事件,当手指触碰时就会移动屏幕上的图片
Select Action
Case Activity.ACTION_DOWN
Log(DateTime.Time(DateTime.Now) & " Activity.ACTION_DOWN")
cvsMain.DrawRectRotated( rectDest, Colors.Black, True, 1, Angle)
'不加上面这句代码,移动图片时会有一些痕迹在屏幕上的
'这句代码就是用来遮蔽这些移动的痕迹
'由于Activity的背景色是黑色,所以用黑色来填充矩形
'库 Core > 类 Canvas > 方法 DrawRectRotated (绘制一个旋转的矩形)
'DrawRectRotated ( Rect1 As Rect, Color As Int, Filled As Boolean, StrokeWidth As Float, Degrees As Float )
'Rect1-矩形对象
'Color-背景色
'Filled - 是否填充矩形
'StrokeWidth - 边缘宽度.当 Filled=False 用才有用.
'Degrees - 矩形顺时针旋转的角度
Angle = CalcAngle(X,Y)
'计算出旋转的角度值是多少,Calc 计算
Timer1.Enabled = True
'激活定时器,使之工作
cvsMain.DrawBitmapRotated(bmpImage, rectSrc, rectDest, Angle)
x1 = X
y1 = Y
Activity.Invalidate
'使Activity窗体失去焦点
Case Activity.ACTION_MOVE
Log(DateTime.Time(DateTime.Now) & " Activity.ACTION_MOVE")
cvsMain.DrawRectRotated(rectDest, Colors.Black, True, 1, Angle)
Angle = CalcAngle(X,Y)
x1 = X
y1 = Y
Timer1_Tick
Case Activity.ACTION_UP
'当手指不触碰屏幕时就停止移动图片
Log(DateTime.Time(DateTime.Now) & " Activity.ACTION_UP")
Timer1.Enabled = False
Activity.Title = ""
End Select
End Sub
Sub CalcAngle(x As Float, y As Float) As Float
Dim a As Float
If x - x0 = 0 Then
a = 90
Else
a = ATanD((y - y0)/(x - x0))
End If
If x - x0 < 0 Then
a = a + 180
End If
Return a
End Sub
Sub Timer1_Tick '时钟控件事件
cvsMain.DrawRectRotated(rectDest, Colors.Black, True, 1, Angle)
'库 Core > 类 Canvas > 方法 DrawRectRotated (绘制一个有旋转角度的矩形)
'DrawRectRotated ( Rect1 As Rect, Color As Int, Filled As Boolean, StrokeWidth As Float, Degrees As Float )
'Rect1-矩形对象
'Filled填充 - 是否填充矩形
'StrokeWidth边缘宽度 - 边缘宽度.当 Filled=False 用才有用.
'Degrees角度 - 矩形旋转的角度(顺时针)
x0 = x0 + Speed * CosD(Angle)
y0 = y0 + Speed * SinD(Angle)
rectDest.Initialize(x0 - bmpImage.Width / 2, y0 - bmpImage.Height / 2, x0 + bmpImage.Width / 2, y0 + bmpImage.Height / 2)
If Abs(x0 - x1) < 3dip And Abs(y0 - y1) < 3dip Then
Timer1.Enabled = False
Activity.Title = "到达手指触碰点"
x0 = x1
y0 = y1
Else
Activity.Title = ""
End If
cvsMain.DrawBitmapRotated(bmpImage, rectSrc, rectDest, Angle)
Activity.Invalidate
End Sub
Sub Activity_KeyPress (KeyCode As Int) As Boolean
If (KeyCode = KeyCodes.KEYCODE_BACK) Then
If (Msgbox2("是否要退出程序?", "", "确定", "取消", "", Null) = DialogResponse.POSITIVE) Then
'DialogResponse是一个预定义的对象,其中包含了可能的返回值
'DialogResponse.Positive = -1 '点击确认按钮
'DialogResponse.CANCEL= -3 '点击取消按钮
'Return False'返回False则表示按键信息交给系统处理
ExitApplication '退出应用
' Activity.Finish'关闭这个活动
Else
Return True'返回True则表示按键已经处理
End If
End If
End Sub