ฉันใช้เวลานับไม่ถ้วนในการอ่านบทเรียนและดูคำถามทุกข้อที่เกี่ยวข้องกับมัลติทัชจากที่นี่และ Stackoverflow แต่ฉันก็ไม่สามารถหาวิธีที่จะทำอย่างถูกต้อง ฉันใช้การวนซ้ำเพื่อรับของpointerId
ฉันฉันไม่เห็นคนจำนวนมากทำเช่นนี้ แต่มันเป็นวิธีเดียวที่ฉันจัดการเพื่อให้มันทำงานได้ค่อนข้างดี
ฉันมีจอยสติ๊กสองอันบนหน้าจอหนึ่งอันสำหรับการเคลื่อนไหวและอีกอันหนึ่งสำหรับควบคุมการหมุนของสไปรท์และมุมที่เขายิงเช่นใน Monster Shooter ทั้งสองทำงานได้ดี
ปัญหาของฉันคือเมื่อฉันย้ายสไปรท์ของฉันในเวลาเดียวกันกับการถ่ายภาพ Im การtouchingPoint
เคลื่อนไหวของฉันถูกตั้งค่าไว้ที่การtouchingPoint
ยิงของฉันเนื่องจากx
และy
สูงกว่าการtouchingPoint
ยิงของฉัน ( moving-stick
ทางด้านซ้ายของหน้าจอshooting-stick
ทางด้านขวา) เทพดาของฉันเพิ่มความเร็วสิ่งนี้ทำให้เกิดการเปลี่ยนแปลงความเร็วที่ไม่พึงประสงค์สำหรับสไปรต์ของฉัน
นี่คือวิธีที่ฉันแก้ไขมันด้วยความช่วยเหลือของคุณ! นี่คือสำหรับทุกคนที่อาจพบปัญหาที่คล้ายกัน:
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);
จะไม่โพสต์รหัสมากถ้าฉันไม่ได้สูญเสียสิ่งที่ฉันทำผิด ฉันไม่สามารถเข้าใจการทำงานแบบมัลติทัชได้อย่างดี
โดยทั่วไปmovingPoint
การเปลี่ยนแปลงสำหรับทั้งลายนิ้วมือครั้งแรกและครั้งที่สองของฉัน ฉันผูกมันไว้กับกล่อง แต่ตราบใดที่ฉันถือหนึ่งนิ้วในกล่องนี้มันจะเปลี่ยนค่าตามที่นิ้วมือที่สองของฉันแตะ มันเคลื่อนที่ไปในทิศทางที่ถูกต้องและไม่มีอะไรผิดพลาดปัญหาคือการเปลี่ยนแปลงความเร็วมันเกือบจะเหมือนกับการเพิ่มจุดสัมผัสทั้งสอง