Làm thế nào tôi có thể di chuyển một sprite theo hướng nó đang đối mặt?


11

Tôi đang sử dụng Java / Slick 2D. Tôi đang cố gắng sử dụng chuột để xoay sprite và các phím mũi tên để di chuyển sprite. Tôi có thể làm cho sprite xoay không có vấn đề, nhưng tôi không thể làm cho nó di chuyển theo hướng mà nó được cho là. Khi tôi nhấn "về phía trước", sprite không nhất thiết phải di chuyển về phía chuột. Trên thực tế, nó sẽ chỉ di chuyển về phía bên trái của màn hình thực sự. Tôi chắc chắn phải có một số mã tiêu chuẩn cho việc này vì nhiều trò chơi sử dụng phong cách chuyển động này. Bất cứ ai có thể giúp tôi với những gì được cho là trig? Cảm ơn

EDIT: Đây là mã xoay vòng (làm một cái gì đó khác lạ: /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); 

Và mã di chuyển. Tôi chỉ có thể di chuyển về phía bên trái của màn hình ...

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;
            }

Điểm của mã bạn đã thêm là gì? Đây có phải là một vấn đề mới? Nếu đó là một vấn đề mới, xin vui lòng mở một câu hỏi mới. Vui lòng chỉ cập nhật câu hỏi này với thông tin liên quan đến việc di chuyển sprite theo hướng nó phải đối mặt.
MichaelHouse

Không, đó là mã tôi đã sử dụng gây ra vấn đề. Xem các bình luận dưới đây. Có người hỏi nó.
rphello101

Tôi không thấy nơi bạn tính toán sprite.movespeed?
AturSams

Movespeed là một hằng số, trong trường hợp này được đặt ở .3
rphello101

Câu trả lời:


14

Bạn sẽ muốn có được một vector dựa trên vận tốc và tiêu đề hiện tại của bạn. Sau đó sử dụng vector đó để tăng vị trí của bạ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;

Vì vậy, bây giờ bạn biết vận tốc của bạn dựa trên vòng quay của bạn. Bạn có thể cập nhật vị trí của bạn với thông tin đó.

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

Đối với một lớp (cẩu thả) có chứa tất cả những thứ này, bạn có thể thấy mục nhập Ludum Dare 21 tôi đặt cùng nhau tại đây: bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/
tựa

Cảm ơn bạn. Sau một vài sửa đổi, điều này đã làm việc. Tôi có một câu hỏi khác cho bạn mặc dù nếu bạn tình cờ đọc được điều này: khiến cho sprite di chuyển ngược lại chỉ là - = những gì bạn có ở đây. Làm thế nào để tôi làm cho nó di chuyển sang trái hoặc phải mặc dù?
rphello101

@ rphello101 Câu hỏi hay, bạn nên hỏi một câu hỏi mới. Nhiều người sẽ có lợi và bạn có thể nhận được câu trả lời tốt hơn câu tôi có.
MichaelHouse

3

Bạn có được vị trí chuột

mouseX = ... 
mouseY = ...

Bạn có được vị trí sprite

spriteX = ...
spriteY = ...

Bạn tìm góc

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

Chuyển động của bạn sẽ là:

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

Như một mẹo: Tạo một bảng (mảng) cho cos và sin với các giá trị được tính toán trước. vì vậy bạn chỉ có thể thực hiện cosTable [(int) angle] * speed * time và sinTable [(int) angle] * speed * time Điều đó không chính xác. Nhưng bạn có được giá trị của bạn nhanh hơn.
Sidar

Điều này sẽ di chuyển sprite về phía chuột, nhưng điều đó không giống với hướng mà sprite đang đối mặt. Sprite vẫn có thể quay mặt về phía chuột nếu tốc độ quay của nó bị giới hạn hoặc một số lý do khác. Về cơ bản, bạn đang trả lời sai câu hỏi.
MichaelHouse

@ Byte56 anh ấy nói "Khi tôi nhấn" về phía trước ", sprite không nhất thiết phải di chuyển về phía con chuột" Tôi nghĩ đó là những gì anh ấy hỏi về. Bạn có thể đúng mặc dù.
AturSams

Đó là loại mơ hồ chắc chắn. Tôi chỉ mặc định cho tiêu đề của câu hỏi trong trường hợp này. Đừng hiểu lầm tôi, câu trả lời của bạn là tốt. Tôi đoán chúng ta sẽ tìm ra những gì OP muốn khi / nếu họ quay lại.
MichaelHouse

2
@Sidar Đó sẽ là tối ưu hóa sớm. Xây dựng các bảng sin / cos mà không xác định các hoạt động sin / cos là nút cổ chai là một sự lãng phí thời gian.
bummzack
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.