ฉันจะย้ายสไปรต์ไปในทิศทางที่หันหน้าไปได้อย่างไร


11

ฉันใช้ Java / Slick 2D ฉันพยายามใช้เมาส์เพื่อหมุนสไปรต์และปุ่มลูกศรเพื่อย้ายสไปรต์ ฉันสามารถทำให้เทพดาหมุนได้โดยไม่มีปัญหา แต่ฉันไม่สามารถขยับไปในทิศทางที่ควรจะเป็นได้ เมื่อฉันกด "ส่งต่อ" สไปรท์ไม่จำเป็นต้องเลื่อนไปทางเมาส์ จริงๆแล้วมันจะเคลื่อนไปทางซ้ายของหน้าจอจริงๆเท่านั้น ฉันแน่ใจว่าต้องมีรหัสมาตรฐานสำหรับเกมนี้เนื่องจากเกมหลายเกมใช้รูปแบบการเคลื่อนไหวนี้ ทุกคนสามารถช่วยฉันด้วยสิ่งที่ตรีโกณมิติควรจะเป็น ขอบคุณ

แก้ไข: นี่คือรหัสการหมุน (ซึ่งทำอย่างอื่นแปลก ๆ : /programming/12610320/why-is-my-im-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); 

และรหัสการเคลื่อนไหว ฉันสามารถเลื่อนไปทางซ้ายของหน้าจอ ...

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

จุดของรหัสที่คุณเพิ่มคืออะไร? นี่เป็นปัญหาใหม่หรือไม่? หากเป็นปัญหาใหม่โปรดเปิดคำถามใหม่ โปรดอัปเดตคำถามนี้ด้วยข้อมูลที่เกี่ยวข้องกับการย้ายเทพดาในทิศทางที่หันหน้าไป
MichaelHouse

ไม่ใช่รหัสที่ฉันใช้ซึ่งทำให้เกิดปัญหา ดูความคิดเห็นด้านล่าง มีคนถามหามัน
rphello101

ฉันไม่เห็นว่าคุณคำนวณ sprite.movespeed ที่ไหน
AturSams

movespeed เป็นค่าคงที่ในกรณีนี้กำหนดไว้ที่. 3
rphello101

คำตอบ:


14

คุณจะต้องการเวกเตอร์ตามความเร็วและหัวเรื่องปัจจุบันของคุณ จากนั้นใช้เวกเตอร์นั้นเพื่อเพิ่มตำแหน่งของคุณ

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

ดังนั้นตอนนี้คุณรู้ความเร็วของคุณตามการหมุนของคุณ คุณสามารถอัปเดตตำแหน่งของคุณด้วยข้อมูลนั้น

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

สำหรับคลาส (เลอะเทอะ) ที่มีทั้งหมดนี้คุณสามารถดูรายการLudum
MichaelHouse

ขอขอบคุณ. หลังจากปรับเปลี่ยนเล็กน้อยแล้วก็ใช้งานได้ ฉันมีคำถามอีกข้อหนึ่งสำหรับคุณแม้ว่าคุณจะอ่านสิ่งนี้เกิดขึ้น: การทำให้ผีสางเคลื่อนที่ไปข้างหลังนั้นเป็นเพียงแค่ - = จากสิ่งที่คุณมีที่นี่ ฉันจะทำให้มันเลื่อนไปทางซ้ายหรือขวาได้อย่างไร
rphello101

@ rphello101 เป็นคำถามที่ดีคุณควรถามคำถามใหม่ ผู้คนจำนวนมากจะได้รับประโยชน์และคุณอาจได้รับคำตอบที่ดีกว่าคนที่ฉันมี
MichaelHouse

3

คุณได้รับตำแหน่งเมาส์

mouseX = ... 
mouseY = ...

คุณจะได้รับตำแหน่งผีสาง

spriteX = ...
spriteY = ...

คุณพบมุม

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

การเคลื่อนไหวของคุณจะเป็น:

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

เป็นเคล็ดลับ: สร้างตาราง (อาร์เรย์) สำหรับ cos และ sin ด้วยค่าที่คำนวณล่วงหน้า ดังนั้นคุณสามารถทำมุม cosTable [(int)] * ความเร็ว * เวลาและมุม sinTable [(int)] * ความเร็ว * เวลามันไม่แม่นยำ แต่คุณจะได้รับค่านิยมของคุณเร็วขึ้น
Sidar

สิ่งนี้จะเลื่อนเทพดาไปทางเมาส์ แต่นั่นไม่เหมือนกับทิศทางที่หันหน้าไปทางเทพดา สไปรท์อาจยังคงหันหน้าไปทางเม้าส์ถ้าความเร็วในการหมุนถูก จำกัด ไว้ โดยพื้นฐานแล้วคุณกำลังตอบคำถามที่ผิด
MichaelHouse

@ Byte56 เขาพูดว่า "เมื่อฉันกดปุ่ม" ไปข้างหน้า "เทพดาไม่จำเป็นต้องเลื่อนไปทางเมาส์" ฉันคิดว่านั่นเป็นสิ่งที่เขาถาม คุณอาจพูดถูก
AturSams

แน่นอนว่ามันคลุมเครือ ฉันเพิ่งเริ่มต้นกับชื่อของคำถามในกรณีนี้ อย่าเข้าใจฉันผิดคำตอบของคุณดี ฉันเดาว่าเราจะพบสิ่งที่ OP ต้องการเมื่อ / ถ้าพวกเขากลับมา
MichaelHouse

2
@Sidar นั่นจะเป็นการเพิ่มประสิทธิภาพก่อนเวลาอันควร การสร้างตาราง sin / cos โดยไม่ระบุการดำเนินการ sin / cos เนื่องจากคอขวดเสียเวลา
bummzack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.