Как говорит Клетус, вы хотите использовать сумму радиусов двух шаров. Вы хотите вычислить общее расстояние между центрами шаров следующим образом:
Ball 1: center: p1=(x1,y1) radius: r1
Ball 2: center: p2=(x2,y2) radius: r2
collision distance: R= r1 + r2
actual distance: r12= sqrt( (x2-x1)^2 + (y2-y2)^2 )
Столкновение будет происходить всякий раз, когда (r12 < R). Как говорит Артелий, на самом деле они не должны сталкиваться по осям X / Y, они сталкиваются под определенным углом. За исключением того, что вы на самом деле не хотите этого угла; Вы хотите вектор столкновения. Это разница между центрами двух окружностей, когда они сталкиваются:
collision vector: d12= (x2-x1,y2-y1) = (dx,dy)
actual distance: r12= sqrt( dx*dx + dy*dy )
Обратите внимание, что вы уже вычислили dx и dy выше при расчете фактического расстояния, так что вы могли бы также отслеживать их для цели как это. Вы можете использовать этот вектор столкновений для определения новой скорости шаров - в конечном итоге вы масштабируете вектор столкновений по некоторым факторам и добавляете это к старым скоростям ... но, чтобы вернуться к фактическому столкновению Точка:
collision point: pcollision= ( (x1*r2+x2*r1)/(r1+r2), (y1*r2+y2*r1)/(r1+r2) )
Чтобы выяснить, как найти новую скорость шариков (и вообще, чтобы иметь больше смысла из всей ситуации), вы, вероятно, должны найти книгу по физике для средней школы, или эквивалент. К сожалению, я не знаю хорошего веб-учебника - предложения, кто-нибудь?
О, и если все еще хотите придерживаться вещи оси x / y, я думаю, что вы правильно поняли:
if( abs(dx) > abs(dy) ) then { x-axis } else { y-axis }
Что касается того, почему он может потерпеть неудачу, трудно сказать без дополнительной информации, но у вас могут быть проблемы с тем, что ваши шары движутся слишком быстро и проходят мимо друг друга за один шаг. Есть способы решить эту проблему, но самый простой способ - убедиться, что они не двигаются слишком быстро ...
Привет. Вы можете попробовать этот способ, добавив относительное расположение, а затем добавьте текстовое представление.
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
(LayoutParams.WRAP_CONTENT), (LayoutParams.WRAP_CONTENT));
RelativeLayout relative = new RelativeLayout(getApplicationContext());
relative.setLayoutParams(lp);
TextView tv = new TextView(getApplicationContext());
tv.setLayoutParams(lp);
EditText edittv = new EditText(getApplicationContext());
edittv.setLayoutParams(lp);
relative.addView(tv);
relative.addView(edittv);
Просто используйте myView.setVisibility(View.GONE);
, чтобы полностью удалить его. Но если вы хотите зарезервировать занятое пространство внутри родительского пространства, используйте myView.setVisibility(View.INVISIBLE);