VB开发安卓程序_游戏4控制物体行走

本文介绍了如何使用B4A语言开发一个带有两个操纵杆的GamePad应用,利用Gestures库处理多点触控事件,通过Canvas绘制动态图形,实现左右移动和方向控制。
摘要由CSDN通过智能技术生成

运行截图

代码来自 [Class] GamePad - Multitouch gamepad

本例程所需的库Gestures已上传

Main窗体代码如下:



#Region Module Attributes
	#FullScreen: False
	#IncludeTitle: True
	#ApplicationLabel: GamePad
	#VersionCode: 1
	#VersionName: 
	#SupportedOrientations: landscape
	#CanInstallToExternalStorage: False
#End Region

'Activity module
Sub Process_Globals
	Dim timer1 As Timer
End Sub

Sub Globals
	Dim gd As GamePad
	Dim movement As Float
	movement = 3dip
	Dim cvs As Canvas
	Dim lrect, rrect As Rect
End Sub

Sub Activity_Create(FirstTime As Boolean)
	If FirstTime Then
		timer1.Initialize("timer1", 10)
	End If
	gd.Initialize
	Dim length, rightPadding, leftPadding, bottomPadding As Int
	length = 100dip 'also the panel's height
	rightPadding = 70dip
	leftPadding = 20dip
	bottomPadding = 20dip
	gd.AddToActivity (Activity, leftPadding, 100%y - bottomPadding - length, _
		100%x - rightPadding - leftPadding, length)
		
	cvs.Initialize(Activity)
	lrect.Initialize(10dip, 10dip, 20dip, 20dip)
	rrect.Initialize(100%x - 20dip, 10dip, 100%x - 10dip, 20dip)
	cvs.DrawRect(lrect, Colors.Red, True, 0)
	cvs.DrawRect(rrect, Colors.Blue, True, 0)
End Sub

Sub Timer1_Tick
	HandleValue(lrect, gd.GetLeftValue, Colors.Red)
	HandleValue(rrect, gd.GetRightValue, Colors.Blue)
End Sub

Sub HandleValue(r As Rect, val As Int, color As Int)
	If val = gd.NONE Then Return
	cvs.DrawRect(r, Colors.Black, True, 0)
	Activity.Invalidate2(r)
	Select val
		Case gd.LEFT
			r.Left = r.Left - movement
			r.Right = r.Right - movement
		Case gd.RIGHT
			r.Left = r.Left + movement
			r.Right = r.Right + movement
		Case gd.UP
			r.Top = r.Top - movement
			r.Bottom = r.Bottom - movement
		Case gd.DOWN
			r.Top = r.Top + movement
			r.Bottom = r.Bottom + movement
	End Select
	cvs.DrawRect(r, color, True, 0)
	Activity.Invalidate2(r)
End Sub

Sub Activity_Resume
	timer1.Enabled = True
End Sub

Sub Activity_Pause (UserClosed As Boolean)
	timer1.Enabled = False
End Sub


类模块GamePad代码如下:

'version: 1.00

Sub Class_Globals

	Private ges As Gestures 'Gestures 是手势库,并不是B4A安装后带来的,需要到B4A官网下载
	Private pnl As Panel
	Private cvs As Canvas '画布对象
	
	Public NONE, LEFT, RIGHT, UP, DOWN 'NONE 没有的意思
	'上面这一句代码定义了4个变体型变量,这是Basic的一种比较特殊的变量
	'往里面放进什么类型的数据它就变成什么形的
	'Int、Long、 Double、 string可任意转换
	'以前只知道VB有这种类型,但从没试过B4A支不支持变体,毕竟B4A其实就是JAVA的壳
	'今天总算看到B4A也支持变体类型了
	
	NONE   = 0
	LEFT   = 1
	RIGHT = 2
	UP		  = 3
	DOWN = 4
	
	
	'开始:操纵杆 -------------------------------------------------------------------
	
	'自定义一个数据类型,并把这个数据库命名为操纵杆( joystick )'
	'因为这个游戏会有两个操纵杆来操作游戏中的两个方块
	Type joystick(x As Float, y As Float, zeroX As Float, zeroY As Float, color As Int)
	
	
	'定义两个操纵杆变量,一个是放在左边,另一个是放在右边的
	Dim jleft, jright As joystick 
	
	'结束:操纵杆 -------------------------------------------------------------------
	
	
	Private radius As Int 'radius 的意思就是半径、半径范围
	radius = 15dip

End Sub


Public Sub Initialize '初始化这个游戏走动 (GamePad) 类

	pnl.Initialize("")
	
	
	
	'开始:初始化手势类 -------------------------------------------------------------
	
	'初始化手势类变量,multitouch的意思是多点触碰
	'multiterminal n. 多端网路 adj. 多端的;多接头的
	'
	'关于监听可以参考下面我写的一篇文章
	'[原创]通过 Reflector 库实现手指拖动控件  
	'http://silentbees.blog.163.com/blog/static/228789031201311186436692/
	
	'监听面板控件 pnl  ,同时监听事件指向pnl_multitouch
	'	
	ges.SetOnTouchListener(pnl, "pnl_multitouch") 
	
	'结束:初始化手势类 -------------------------------------------------------------
	
	
	
	'开始:初始化两个操纵杆变量 ---------------------------------------------
	
	jleft.Initialize
	jleft.color = Colors.Red
	
	jright.Initialize
	jright.color = Colors.Blue
	
	'结束:初始化两个操纵杆变量 ---------------------------------------------
	
End Sub


Public Sub AddToActivity(act As Activity, vLeft As Int, vTop As Int, vWidth As Int, vHeight As Int) '把GamePad类加到将要操作的窗体中


	'开始:放置左右两个操纵杆 -------------------------------------------------------
	
	Dim iv1, iv2 As ImageView '定义两个图像浏览类变量,这个类是B4A安装后自带的
	
	iv1.Initialize("")
	iv2.Initialize("")
	
	'从目录资源载入操作盘图片
	iv1.Bitmap = LoadBitmap(File.DirAssets, "arrows.png")
	iv2.Bitmap = iv1.Bitmap
		
	'库 Core > 类 ImageView > 属性 Bitmap 
	'Bitmap As Bitmap  用于获得或设定分配给 ImageView 的位图. 
	'Example: 
	'ImageView1.Bitmap = LoadBitmap(File.DirAssets, "someimage.jpg")

	iv1.Gravity = Gravity .FILL 'FILL是填充的意思
	iv2.Gravity = Gravity.FILL
	
	'把几个可视控件加到	act 窗体中
	act.AddView(iv1, vLeft, vTop, vHeight, vHeight)
	act.AddView(iv2, vLeft + vWidth - vHeight, vTop, vHeight, vHeight)
	act.AddView(pnl, vLeft, vTop, vWidth, vHeight)
	
	cvs.Initialize(pnl)
	jleft.zeroX = pnl.Height / 2
	jleft.zeroY = pnl.Height / 2
	jright.zeroX = pnl.Width - pnl.Height / 2
	jright.zeroY = pnl.Height / 2
	
	MoveJoystick(jleft.zeroX, jleft.zeroY, jleft)
	MoveJoystick(jright.zeroX, jright.zeroY, jright)
	pnl.Invalidate
	
	'结束:放置左右两个操纵杆 -------------------------------------------------------
	

	
End Sub

Private Sub pnl_multitouch(View As Object, pointerID As Int, action As Int, x As Float, Y As Float) As Boolean
	Dim foundLeft, foundRight As Boolean
	For i = 0 To ges.GetPointerCount - 1
		If (action = ges.ACTION_UP OR action = ges.ACTION_POINTER_UP) AND _
			ges.GetPointerID(i) = pointerID Then
				Continue
		End If
		If ges.GetX(i) = -1 AND ges.GetY(i) = -1 Then Continue
		Dim gx, gy As Float
		gx = Max(0, Min(ges.GetX(i), pnl.Width))
		gy = Max(0, Min(ges.GetY(i), pnl.Height))
		If gx < pnl.Width / 2 Then
			gx = Min(gx, pnl.Height)
			foundLeft = True
			MoveJoystick(gx, gy, jleft)
		Else
			gx = Max(gx, pnl.Width - pnl.Height)
			foundRight = True
			MoveJoystick(gx, gy, jright)
		End If
	Next
	If Not(foundLeft) Then MoveJoystick(jleft.zeroX, jleft.zeroY, jleft)
	If Not(foundRight) Then MoveJoystick(jright.zeroX, jright.zeroY, jright)
	pnl.Invalidate
	Return True
End Sub

Private Sub MoveJoystick(x As Float, y As Float, j As joystick)
	cvs.DrawCircle(j.x, j.y, radius, Colors.Transparent, True, 0)
	Dim valuex, valuey As Float
	valuex = x - j.zeroX
	valuey = y - j.zeroY
	If Abs(valuex) > Abs(valuey) Then y = j.zeroY Else x = j.zeroX
	j.x = x
	j.y = y
	cvs.DrawCircle(j.x, j.y, radius, j.color, True, 0)
End Sub

Public Sub GetLeftValue As Int
	Return GetValue(jleft)
End Sub

Public Sub GetRightValue As Int
	Return GetValue(jright)
End Sub

Private Sub GetValue(j As joystick) As Int
	If Power(j.x - j.zeroX, 2) + Power(j.y - j.zeroY, 2) < Power(pnl.Height / 3, 2) Then
		Return NONE
	Else If j.x < j.zeroX Then 
		Return LEFT
	Else If j.x > j.zeroX Then
		Return RIGHT
	Else If j.y > j.zeroY Then
		Return DOWN
	Else If j.y < j.zeroY Then
		Return UP
	End If
End Sub

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值