Đây là giải pháp của riêng tôi cho các góc quay 90 °:
/**
* Created on 2018-02-09.
*
* @author Alexander Winter
*/
public class RotatableParticleEffect extends ParticleEffect {
public RotatableParticleEffect() {}
public RotatableParticleEffect(ParticleEffect effect) {
super(effect);
}
public void rotateBy(int turnQuarter) {
while(turnQuarter < 0)
turnQuarter += 4;
turnQuarter %= 4;
for(ParticleEmitter emitter : getEmitters()) {
ScaledNumericValue angle = emitter.getAngle();
angle.setHighMax(angle.getHighMax() + turnQuarter * -90f);
angle.setHighMin(angle.getHighMin() + turnQuarter * -90f);
angle.setLowMax(angle.getLowMax() + turnQuarter * -90f);
angle.setLowMin(angle.getLowMin() + turnQuarter * -90f);
ScaledNumericValue rot = emitter.getRotation();
rot.setHighMax(rot.getHighMax() + turnQuarter * -90f);
rot.setHighMin(rot.getHighMin() + turnQuarter * -90f);
rot.setLowMax(rot.getLowMax() + turnQuarter * -90f);
rot.setLowMin(rot.getLowMin() + turnQuarter * -90f);
for(int i = 0; i < turnQuarter; i++) {
swapFields(emitter.getXOffsetValue(), emitter.getYOffsetValue());
emitter.getYOffsetValue().setLowMin(-emitter.getYOffsetValue().getLowMin());
emitter.getYOffsetValue().setLowMax(-emitter.getYOffsetValue().getLowMax());
}
}
}
private static void swapFields(Object o1, Object o2) {
if(o1 == null || o2 == null)
throw new IllegalArgumentException("Objects must not be null");
if(!o1.getClass().equals(o2.getClass()))
throw new IllegalArgumentException("Objects are not the same type");
Class<?> type = o1.getClass();
while(type != null) {
for(Field field : type.getDeclaredFields()) {
if(!field.isAccessible())
field.setAccessible(true);
try {
Object tmp = field.get(o1);
field.set(o1, field.get(o2));
field.set(o2, tmp);
} catch(IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
type = type.getSuperclass();
}
}
}
Với giải pháp này, bạn không thể xoay với mọi góc độ. Nếu bạn cần, bạn sẽ cần điều chỉnh các độ lệch X và Y bằng một vòng xoay. offsetY = originalOffsetY * sin(angle)
và tương tự cho X với cos()
. Tôi đã không thực hiện giải pháp đầy đủ cho mọi góc độ vì tôi không cần nó. Tuy nhiên, tôi có thể xác nhận giải pháp đơn giản hơn này hoạt động với tôi.