首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的Pac-man克隆运动

java中的Pac-man克隆运动
EN

Stack Overflow用户
提问于 2018-05-25 06:05:58
回答 2查看 510关注 0票数 1

我想使用矩形来检测碰撞水平和垂直pac-man和墙壁。因为我想,如果检测到水平碰撞,pac-man只能向左或向右移动,并以垂直方式反向移动。我的想法是像这样做长方形:

代码语言:javascript
复制
public void checkMap() {
    int xRaw = pac.getX();
    int yRaw = pac.getY();
    rectanglePacX = new Rectangle(xRaw+1, yRaw, Pac.SIZE, Pac.SIZE);
    rectanglePacX1 = new Rectangle(xRaw-1, yRaw, Pac.SIZE, Pac.SIZE);
    rectanglePacY = new Rectangle(xRaw, yRaw+1, Pac.SIZE, Pac.SIZE);
    rectanglePacY1 = new Rectangle(xRaw, yRaw-1, Pac.SIZE, Pac.SIZE);
    for (int i = 0; i < items.size(); i++) {
        if (isPacCollisionWallz(items.get(i), rectanglePacX) && isPacCollisionWallz(items.get(i), rectanglePacX1)) {
            vector = 1;
        }
        if (isPacCollisionWallz(items.get(i), rectanglePacY) && isPacCollisionWallz(items.get(i), rectanglePacY1)) {
            vector = 2;
        } else {
            vector = 3;
        }
    }

}

这是我的方法isPacCollisionWallz()

代码语言:javascript
复制
private boolean isPacCollisionWallz(MapItem mapItem, Rectangle rectangle) {
    return rectangle.intersects(mapItem.getRectangle());
}

vector == 1我启用字符向上或向下移动,vector == 2向左或向右移动,vector == 3在十字路口可以移动所有方向。但我不知道怎么回事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-25 06:54:20

创建这些矩形的方式不正确,因为:

代码语言:javascript
复制
rectanglePacX1 = new Rectangle(xRaw-1, yRaw, Pac.SIZE, Pac.SIZE); 
rectanglePacY1 = new Rectangle(xRaw, yRaw-1, Pac.SIZE, Pac.SIZE);

返回一个像素,并使用Pac.SIZE设置大小。它将与当前的矩形只差一个像素。你需要的是:

代码语言:javascript
复制
rectanglePacX1 = new Rectangle(xRaw - Pac.SIZE -1, yRaw, Pac.SIZE, Pac.SIZE); 
rectanglePacY1 = new Rectangle(xRaw, yRaw - Pac.SIZE- 1, Pac.SIZE, Pac.SIZE);

要解释这个问题,图像要简单一些。

红色是创建减1像素的矩形,绿色是你想要的,减1像素和矩形本身的大小。

注意:我需要告诉您,在视图中实现逻辑并不是一个好的实践。最好是在OOP中实现游戏本身,然后在逻辑上添加一个视图,通常使用的是观测器模式。看看什么是MVC

实现一个包含二维Cell数组的类Cell,每个单元格都有一个类型(有一个硬币,是一个墙,.)。这将使您的PacMan实例能够很容易地检测到移动。

票数 1
EN

Stack Overflow用户

发布于 2018-05-25 07:07:15

不要把你的游戏模型和你在屏幕上看到的东西混淆起来。模型可以是游戏地图的简单表示,它可以像单元格一样简单:

代码语言:javascript
复制
xxxxxxxxxxxxxx
x ...>  x    x
x xxxxx xxxx x
x     x      x
xxxxxxxxxxxxxx

您可以将它在Java中表示为一个对象(称为Maze,因为Map在Java中意味着其他东西),其中包含一个单元格网格。定义一个Cell类:

代码语言:javascript
复制
public class Cell {
    public boolean isWall() { ... }
    ...
}

和一个Maze类:

代码语言:javascript
复制
public class Maze {
    private Cell[][] cells;
    ...
    public Cell getCellAt( int x, int y ) { ... }
}

当你想在屏幕上显示迷宫时,你可以参考迷宫对象,找出哪些细胞包含墙壁、鬼魂或其他东西,并将其呈现到屏幕上。

这样做的好处是,碰撞检测变得非常容易,:只需获取播放器位置左/右/上/下的单元格,并调用isWall()以确定是否可以移动到那里。

这也意味着代码的这一部分将与如何绘制游戏的细节脱钩:它不需要知道像Pac.SIZE这样的东西,也不需要知道你的墙壁是什么颜色。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50522522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档