2013-04-21 264 views
0

我试图让玩家无法从左侧和右侧通过平台,并让玩家停在平台之上。到目前为止,我所有的碰撞事件都是左右两边,但右侧不起作用,剩下的就是窃听。我无法弄清楚如何做一个平台游戏的基本碰撞,任何人都可以给我一个工作解决方案?Java平台游戏冲突

Player类代码:

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 

} 
} 
+0

尝试源看出[这里]( http://stackoverflow.com/a/14575043/418556)如果你不能从中找出解决方案,请发布你的最佳尝试[SSCCE](http://sscce.org/)。 – 2013-04-21 14:09:31

+0

@AndrewThompson我已经创建了超过4个线程已经在这个论坛上,我已经尝试了所有可能的解决方案,但它总是或者不好或者做我想做的事情的相反。 – 2013-04-21 14:17:51

+0

我链接的来源(这是一个SSCCE顺便说一句)在这里坚如磐石。 ***赞成,已经创建了一个SSCCE!***如果没有,我投票结束为“不是真正的问题”。 – 2013-04-21 14:20:35

回答

0

这是什么,我挣扎了很久,我知道有一些对this.Obviously解决方案的需要,不管以何种方重置你的球员位置碰撞发生在平台上。

所以我做的是检查矩形是否先相交。然后我尝试弄清楚它碰撞的平台的哪一侧。我通过在玩家矩形每边的外侧创建一个矩形来实现这一点。然后我得到平台矩形与每个矩形的交点。然后我计算交叉点的面积。哪一侧具有最大交叉面积就是发生碰撞的一侧。然后,您可以根据与他碰撞的平台侧面重新设置玩家位置。我创建了一个Mask类,使它非常易于使用my game engine

复杂的部分看起来像这样。 掩模是类别I来表示的矩形

此方法返回布尔值的数组中的一个是真是侧时发生的碰撞上

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