Bir hareketli grafiği baktığı yönde nasıl hareket ettirebilirim?


11

Java / Slick 2D kullanıyorum. Sprite döndürmek için fareyi ve sprite taşımak için ok tuşlarını kullanmaya çalışıyorum. Sprite'ı problemsiz bir şekilde döndürebilirim, ancak olması gerektiği yönde hareket ettiremiyorum. "İleri" yi vurduğumda hareketli grafiğin fareye doğru hareket etmesi gerekmez. Aslında, gerçekten ekranın soluna doğru hareket edecektir. Birçok oyun bu hareket tarzını kullandığından, bunun için bazı standart kodlar olduğundan eminim. Trig'in ne olması gerektiği konusunda kimse bana yardım edebilir mi? Teşekkürler

EDIT: İşte dönüş kodu (başka bir şey garip yapan: /programming/12610320/why-is-my-image-rotating-off-center )

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng); 

Ve hareket kodu. Sadece ekranın soluna hareket edebilirim ...

double ang = sprite.angle;
            Input input = gc.getInput();

            if(input.isKeyDown(sprite.up)){
                sprite.x += Math.cos(ang)*sprite.moveSpeed;
                sprite.y += Math.sin(ang)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.down)){
                sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.left)){
                sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.right)){
                sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }

Eklediğiniz kodun anlamı nedir? Bu yeni bir sorun mu? Bu yeni bir sorunsa, lütfen yeni bir soru açın. Lütfen bu soruyu yalnızca hareketli grafiği baktığı yöne hareket ettirmeyle ilgili bilgilerle güncelleyin.
MichaelHouse

Hayır, soruna neden olan kodu kullandım. Aşağıdaki yorumlara bakın. Birisi istedi.
rphello101

Sprite.movespeed'i nerede hesapladığınızı görmüyorum?
AturSams

hamle sabittir, bu durumda .3
rphello101

Yanıtlar:


14

Mevcut hızınıza ve başlığınıza göre bir vektör almak istersiniz. Ardından konumunuzu artırmak için bu vektörü kullanın.

//first get the direction the entity is pointed
direction.x = (float) Math.cos(Math.toRadians(rotation));
direction.y = (float) Math.sin(Math.toRadians(rotation));
if (direction.length() > 0) {
    direction = direction.normalise();
}
//Then scale it by the current speed to get the velocity
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;

Şimdi rotasyonunuza göre hızınızı biliyorsunuz. Konumunuzu bu bilgilerle güncelleyebilirsiniz.

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;

Tüm bunları içeren (özensiz) bir sınıf için, burada bir araya getirdiğim Ludum Dare 21 girişini görebilirsiniz: bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/…
MichaelHouse

Teşekkür ederim. Birkaç değişiklikten sonra, bu işe yaradı. Eğer bunu okursanız sizin için başka bir sorum daha var: hareketli grafiğin geriye doğru gitmesi sadece - = burada ne var. Yine de sola veya sağa hareket etmesini nasıl sağlayabilirim?
rphello101

@ rphello101 Güzel soru, yeni bir soru sormalısın. Daha fazla insan yararlanır ve sahip olduğumdan daha iyi bir cevap alabilirsiniz.
MichaelHouse

3

Fare konumunu alırsınız

mouseX = ... 
mouseY = ...

Sprite pozisyonunu alırsın

spriteX = ...
spriteY = ...

Açıyı buluyorsun

angle = Math.atan2(mouseY - spriteY, mouseX - spriteX);

Hareketiniz:

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;

İpucu olarak: cos ve sin için önceden hesaplanmış değerlerle bir tablo (dizi) oluşturun. böylece cosTable [(int) açı] * hız * süresi ve sinTable [(int) açı] * hız * süresi yapabilirsiniz. Ama değerlerinizi daha hızlı elde edersiniz.
Sidar

Bu hareketli hareketli parçayı fareye doğru hareket ettirir, ancak hareketli hareketli parçanın baktığı yöne benzemez. Sprite, döndürme hızı sınırlanmışsa veya başka bir nedenden dolayı fareyle yüzleşmeye devam ediyor olabilir. Temel olarak yanlış soruyu cevaplıyorsunuz.
MichaelHouse

@ Byte56 "İleri" vurduğumda sprite mutlaka fareye doğru hareket etmiyor "diye sordu. Yine de haklı olabilirsin.
AturSams

Kesinlikle belirsiz. Bu durumda sadece sorunun başlığına geçtim. Beni yanlış anlamayın, cevabınız iyi. Sanýrým OP geri döndüklerinde / istediklerinde ne istediđini bulacađýz.
MichaelHouse

2
@Sidar Bu erken optimizasyon olurdu. Sin / cos işlemlerini darboğaz olarak tanımlamadan sin / cos tablolarını oluşturmak zaman kaybıdır.
bummzack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.