第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Rectangle.Intersects 進行碰撞檢測會導致對象“粘”在表面上

使用 Rectangle.Intersects 進行碰撞檢測會導致對象“粘”在表面上

泛舟湖上清波郎朗 2022-01-19 17:19:56
我正在嘗試開發(fā)一個自上而下的射擊游戲。目前我正在從頭開始做所有事情,因為我想更好地學習 Java。我現(xiàn)在的問題是碰撞檢測。我正在使用 Rectangle.Intersects(如代碼中所示)來確定玩家是否與墻壁相交。這幾乎是完美的,除了當玩家僅在一個軸上碰撞(即撞到垂直墻壁)時,他們在兩個方向上都被鎖定。我想實現(xiàn)滑動以獲得更流暢的游戲玩法。我對如何做到這一點有一點想法,這將涉及分別檢查 x 和 y 平面。但是,我不知道這是否可以使用我目前的方法。我對 Java 有點陌生,所以我不太了解可以用來代替 Rectangle 的不同類型的庫,但它們一直運行良好,我想堅持使用它們。如果有使用矩形的解決方案,那就太好了。如果沒有,我愿意接受新的想法。謝謝。這是我正在使用的代碼//x and y are position of player and vx and vy are the velocities in respective directionspublic void tick() {    x+=vx;    y+=vy;    collision();    //movement    //...}private void collision() {    for(int i = 0; i< handler.object.size(); i++) {        GameObject tempObject = handler.object.get(i);        if(tempObject.getId() == ID.Block) {            if(getBounds().intersects(tempObject.getBounds())) {                x +=-vx;                y +=-vy;            }        } //...public Rectangle getBounds() {    return new Rectangle((int)x,(int)y,32,32);}
查看完整描述

1 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

萬一讀到這篇文章的人很好奇,我創(chuàng)建了一個新函數來處理運動并將碰撞轉換為布爾值,如果玩家與塊(墻)碰撞,則返回 true,如果與其他任何東西碰撞,則返回 false。


我還更改了對塊碰撞的檢查,如代碼中所示


private boolean collision(double vx, double vy) {

    for(int i = 0; i< handler.object.size(); i++) {

        GameObject tempObject = handler.object.get(i);

        if(tempObject.getId() == ID.Block) {

            if(new Rectangle((int)x+(int)vx,(int)y+(int)vy,31,31).intersects(tempObject.getBounds())) {

                    return true;

                }

            } 

        if(tempObject.getId() == ID.Crate) {

            if(getBounds().intersects(tempObject.getBounds())) {

                main.ammo+=50;

                handler.removeObject(tempObject);

            }

        }   

        if(tempObject.getId() == ID.Enemy) {

            if(getBounds().intersects(tempObject.getBounds())) {

                main.hp--;//TODO make it so you cant get stuck in enemies and they drain all your health

            }

        }

    }

    return false;

}

和移動功能


public void Move(double vx, double vy) {

    if(!collision(vx,vy)) {

        x+=vx;

        y+=vy;

    }


}

tick 方法也略有改變


public void tick() {    


    collision(vx,vy);


    vx = 0;

    vy = 0;

    //movement

    if(handler.isUp()) vy -=5;

    //else if(!handler.isDown()) vy = 0;


    if(handler.isDown()) vy += 5;

    //else if(!handler.isUp()) vy = 0;


    if(handler.isRight()) vx += 5;

    //else if(!handler.isLeft()) vx = 0;


    if(handler.isLeft()) vx -=5;

    //else if(!handler.isRight()) vx = 0;


    if(vx!=0||vy!=0){

        Move(vx,0);

        Move(0,vy);

    }

    //anim.runAnimation();

}


查看完整回答
反對 回復 2022-01-19
  • 1 回答
  • 0 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號