簡體   English   中英

Java平台游戲沖突

[英]Java Platform Game Collision

我試圖使播放器無法從左側和右側穿過平台,並使播放器停在平台頂部。 到目前為止,我所發生的所有碰撞都是左右移動,但是右邊沒有工作,而左邊則是bug。 我不知道如何進行平台游戲的基本碰撞,有人可以給我一個可行的解決方案嗎?

播放器類代碼:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class Player implements KeyListener
{
int x, y, width, height;

boolean jump, left, right;

PlayerThread playerThread;

int maxHeight = 40;
double heightC = 0;
boolean onPlatform = false;
boolean landed = true;
int prevY;
int prevX;
Rectangle playRect = new Rectangle();
boolean leftCollision = false;
boolean rightCollision = false;
Platform p;

public Player()
{
    x = 500;
    y = 350;
    width = 40;
    height = 50;
    playerThread = new PlayerThread();
    playerThread.start();
}

public void paint(Graphics g)
{
    String str = String.valueOf(x);
    String str2 = String.valueOf(y);

    g.setColor(Color.RED);
    playRect.setBounds(x, y, width, height);
    g.fillRect(x, y, width, height);

    g.drawString("X: " + str + ", Y: " + str2, 100, 100);
}

public void update(Platform p)
{
    this.p = p;
    CheckForCollision(p);

}

public void CheckForCollision(Platform p)
{
    int pX = p.getX();
    int pY = p.getY();
    int pWidth = p.getWidth();
    int pHeight = p.getHeight();

    //COLLISION WITH PLATFORM CODE
    if (playRect.intersects(p.plat) && left == true && !jump && !right && landed)
    {
        System.out.println("LEFT");
        x = prevX;
        leftCollision = true;
    }
    else
    {
        leftCollision = false;
    }

    if (playRect.intersects(p.plat) && right == true && !jump && !right && landed)
    {
        System.out.println("RIGHT");
        x = prevX;
        rightCollision = true;
    }
    else
    {
        rightCollision = false;
    }
}

public class PlayerThread extends Thread implements Runnable
{
    public void run()
    {
        while (true)
        {
            if (left && !leftCollision)
            {

                prevX = x;
                x -= 2;

            }

            if (right && !rightCollision)
            {
                prevX = x;
                x += 2;
            }

            if (jump)
            {
                if (heightC >= maxHeight)
                {
                    System.out.println(heightC);
                    jump = false;
                    heightC = 0;
                }
                else
                {
                    heightC += 1.5;
                    prevY = y;
                    y -= 5;
                    landed = false;
                }
            }

            //GRAVITY CODE
            if (!jump && !landed)
            {
                if (y < 400 - height)
                {
                    prevY = y;
                    y += 5;
                    //landed = false;
                }
            }

            if (y >= 400 - height && !landed)
            {
                y = 400 - height;
                landed = true;
            }

            try
            {
                sleep(17);
            } 
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

@Override
public void keyPressed(KeyEvent e)
{
    switch (e.getKeyCode())
    {
    case KeyEvent.VK_LEFT:

        left = true;
        break;
    case KeyEvent.VK_RIGHT:
        right = true;
        break;
    case KeyEvent.VK_SPACE:
        if (landed)
        {
        jump = true;
        }
        break;
    }
}

@Override
public void keyReleased(KeyEvent e)
{
    switch (e.getKeyCode())
    {
    case KeyEvent.VK_LEFT:
        left = false;
        break;
    case KeyEvent.VK_RIGHT:
        right = false;
        break;
    case KeyEvent.VK_SPACE:
        break;
    }
}



public int getX()
{
    return x;
}

public void setX(int x)
{
    this.x = x;
}

public int getY()
{
    return y;
}

public void setY(int y)
{
    this.y = y;
}

public int getWidth()
{
    return width;
}

public void setWidth(int width)
{
    this.width = width;
}

public int getHeight()
{
    return height;
}

public void setHeight(int height)
{
    this.height = height;
}

@Override
public void keyTyped(KeyEvent e)
{
    // TODO Auto-generated method stub

}
}

這是我長期以來一直在努力的事情,並且我知道有很多解決方案。顯然,您需要根據發生碰撞的平台的任一側來重置玩家的位置。

所以我要做的是檢查矩形是否先相交。 然后,我嘗試找出該平台與哪一側發生碰撞。 我是通過在播放器矩形每一側的外部創建一個矩形來實現的。 然后我得到平台矩形與每個側面矩形的交集。 然后我計算出相交的面積。相交面積最大的一側是發生碰撞的一側。 然后,您可以根據與他相撞的平台的側面重置玩家的位置。 我創建了一個Mask類,使它在游戲引擎中非常易於使用

復雜的部分看起來像這樣。 遮罩是我用來表示矩形的類

此方法返回一個布爾數組,正確的是發生碰撞的那一側

public static int left=2,top=3,right=0,bottom=1;
public boolean[] collisionSide(Mask m){

    boolean[] leftUp = new boolean[4];

    Rectangle[] boxes = new Rectangle[4];
    boxes[0] = new Rectangle(this.getRect().x-1, this.getRect().y, 1, this.getRect().height);
    boxes[1] = new Rectangle(this.getRect().x, this.getRect().y-1, this.getRect().width, 1);
    boxes[2] = new Rectangle(this.getRect().x + this.getRect().width, this.getRect().y, 1, this.getRect().height);
    boxes[3] = new Rectangle(this.getRect().x, this.getRect().y+this.getRect().height, this.getRect().width, 1);

    double greatestArea = 0;
    int greatest = 0;

    for( int bbb = 0; bbb<4; bbb++){
        if( Calc.getArea( boxes[bbb].createIntersection(m.getRect() ) ) > greatestArea){
            greatestArea = Calc.getArea( boxes[bbb].createIntersection(m.getRect() ) );
            greatest = bbb;
        }
    }

    for(int b=0; b<4; b++)
        leftUp[b] = false;

    leftUp[greatest] = true;

    return leftUp;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM