Xoay hạt phát LibGDX


7

Tôi có một trò chơi libGDX, trong đó tôi muốn tạo ra một số hơi thở như hiệu ứng bằng cách sử dụng các hạt. Cho đến nay chúng tôi đã thực hiện một hình nón như hiệu ứng. Tôi có thể có được và hiển thị nó trên màn hình với điều này.

ParticleEffectPool.PooledEffect effect = breathPool.obtain();
effect.setPosition(x,y);
ps.add(effect);

Nhưng tôi thực sự không thấy bất kỳ cách nào để xoay toàn bộ hệ thống hạt theo một hướng nhất định. Có bất kì cách nào để đạt được điều này không?


Không, nó không phải là không thể. Đọc -> tại đây

nó có giống với hệ thống hạt 2d không?
Rothens

Câu trả lời:


2

Bạn có thể thử chọn thuộc angletính của bộ phát (hoặc bộ phát nếu bạn có nhiều) và điều chỉnh thủ công các giá trị ở giữa một số góc.

ParticleEffect effect = /* your effect */
ParticleEmitter emitter = effect.findEmitter("some_name"); // find the emitter you want to     rotate here
float targetAngle = /* your target angle */

ScaledNumericValue angle = emitter.getAngle();

/* find angle property and adjust that by letting the min, max of low and high span their current size around your angle */

float angleHighMin = angle.getHighMin();
float angleHighMax = angle.getHighMax();
float spanHigh = angleHighMax - angleHighMin;
angle.setHigh(angle - spanHigh / 2.0f, angle + spanHigh / 2.0f);

float angleLowMin = angle.getLowhMin();
float angleLowMax = angle.getLowMax();
float spanLow = angleLowMax - angleLowMin;
angle.setLow(angle - spanLow / 2.0f, angle + spanLow / 2.0f);

Lưu ý rằng ở trên sẽ chỉ điều chỉnh mức caothấp là gì, và rất có thể bạn sẽ cần phải làm gì đó với nó.


2
Điều này đã làm việc! Bạn có nghĩa là sử dụng targetAngletrong setHigh () và setLow (), nhưng quên ... và bạn có một lỗi đánh máy trong getLowMin (). Hoạt động tốt khác.
Tối đa

Không hoạt động nếu các hạt của bạn không có cùng chiều rộng so với chiều cao.
Mùa đông

1

Đâ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.


-1

Thêm hiệu ứng hạt vào một nhóm có bật chuyển đổi (mặc định).


2
Câu trả lời này có thể được hưởng lợi từ thông tin bổ sung. Làm thế nào để giải quyết vấn đề này và có thêm bước nào để hoàn thành mục tiêu?
MichaelHouse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.