Saya telah menghabiskan banyak waktu untuk membaca tutorial dan melihat setiap pertanyaan yang terkait dengan multiTouch dari sini dan Stackoverflow. Tapi saya tidak tahu bagaimana melakukan ini dengan benar. Saya menggunakan loop untuk mendapatkan pointerId
, saya tidak melihat banyak orang melakukan ini tetapi satu-satunya cara saya berhasil membuatnya agak berfungsi.
Saya memiliki dua joystick di layar saya, satu untuk bergerak dan satu untuk mengendalikan rotasi sprite saya dan sudut yang dia tembak, seperti di Monster Shooter. Keduanya bekerja dengan baik.
Masalah saya adalah ketika saya Memindahkan sprite saya pada saat yang sama dengan pemotretan Im, touchingPoint
gerakan saya untuk saya diatur ke touchingPoint
pemotretan saya, karena x
dan y
lebih tinggi pada touchingPoint
pemotretan saya ( moving-stick
di sisi kiri layar, shooting-stick
di sisi kanan) , sprite saya mempercepat, ini menciptakan perubahan kecepatan yang tidak diinginkan untuk sprite saya.
beginilah cara saya menyelesaikannya dengan bantuan Anda! ini untuk siapa saja yang mungkin mengalami masalah serupa:
public void update(MotionEvent event) {
if (event == null && lastEvent == null) {
return;
} else if (event == null && lastEvent != null) {
event = lastEvent;
} else {
lastEvent = event;
}
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int x = (int) event.getX(pid);
int y = (int) event.getY(pid);
int index = event.getActionIndex();
int id = event.getPointerId(index);
String actionString = null;
switch (actionCode)
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
actionString = "DOWN";
try{
if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2)
&& y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
movingPoint.x = x;
movingPoint.y = y;
dragging = true;
draggingId = id;
}
else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
&& y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
shootingPoint.x = x;
shootingPoint.y = y;
shooting=true;
shootingId=id;
}
}catch(Exception e){
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
if(id == draggingId)
dragging = false;
if(id == shootingId)
shooting = false;
actionString = "UP";
break;
case MotionEvent.ACTION_MOVE:
for(index=0; index<event.getPointerCount(); index++) {
id=event.getPointerId(index);
int xx = (int) event.getX(index); //pro naming of variable
int yy = (int) event.getY(index);
if(dragging && id == draggingId) {
if(xx > 0 && xx < (steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
&& yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
movingPoint.x = xx;
movingPoint.y = yy;
}
else
dragging = false;
}
if(shooting && id == shootingId){
if(xx > shootingxMesh - (joystick.get_joystickBg().getWidth()) && xx < panel.getWidth()
&& yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
shootingPoint.x = xx;
shootingPoint.y = yy;
}
else
shooting = false;
}
}
actionString = "MOVE";
break;
}
Log.d(TAG, "actionsString: " + actionString + ", pid: " + pid + ", x: " + x + ", y: " + y);
Tidak akan memposting kode sebanyak ini jika saya tidak benar-benar kehilangan apa yang saya lakukan salah. Saya benar-benar tidak bisa mendapatkan pemahaman yang baik tentang cara kerja multiTouching.
pada dasarnya movingPoint
perubahan untuk jari pertama dan kedua saya. Saya mengikatnya ke sebuah kotak, tetapi selama saya memegang satu jari di dalam kotak ini, itu mengubah nilainya berdasarkan di mana jari kedua saya menyentuh. Itu bergerak ke arah yang benar dan tidak ada yang memberikan kesalahan, masalahnya adalah perubahan kecepatan, hampir seperti menambahkan dua touchingPoints.