Java/LibGDX-从一个房间到另一个房间跟踪收集的项目

Java/LibGDX-从一个房间到另一个房间跟踪收集的项目,java,libgdx,platform,inventory,Java,Libgdx,Platform,Inventory,我正在为一个个人项目写一个基于Jet Set Willy的游戏。如您所知,角色可以从一个房间移动到另一个房间,一边移动一边收集物品 我正在使用LibGDX和平铺贴图编辑器 我当前根据地图中的对象分片加载项目,这些分片位于名为“项目”的图层上,如下所示: public void loadItems() { ////////////////////////////////////////////////////////////////////////// //create all I

我正在为一个个人项目写一个基于Jet Set Willy的游戏。如您所知,角色可以从一个房间移动到另一个房间,一边移动一边收集物品

我正在使用LibGDX和平铺贴图编辑器

我当前根据地图中的对象分片加载项目,这些分片位于名为“项目”的图层上,如下所示:

public void loadItems() {
    //////////////////////////////////////////////////////////////////////////
    //create all Items
    for(MapObject object : map.getLayers().get(4).getObjects().getByType(RectangleMapObject.class)){
        Rectangle rect = ((RectangleMapObject) object).getRectangle();
        //new Item(screen, object);
        items.add(new Item(this, object, (rect.getX() + rect.getWidth() / 2) / Engine.PPM, (rect.getY() + rect.getHeight() / 2) / Engine.PPM));
    }
}
这些项目存储在我的Playscreen上的数组中,如下所示:

public static Array<Item> items;
public class Item extends Sprite {

protected World world;
protected PlayScreen screen;

private float stateTime;
protected TiledMap map;
protected MapObject object;

private Animation animation;
private Array<TextureRegion> frames;
private boolean setToDestroy;
private boolean destroyed;
float angle;
public Body b2body;

FixtureDef fdef;

private Texture tex;
private Texture blank_texture;
private int item_number;

////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Constructor
 * @param screen
 * @param object
 * @param x
 * @param y
 */
public Item(PlayScreen screen, MapObject object, float x, float y){
    this.world = screen.getWorld();
    this.screen = screen;
    this.map = screen.getMap();
    //this.item_number = item_number;

    setPosition(x, y);

    Random rn = new Random();
    int max = 2;
    int min = 1;
    int random = rn.nextInt(5) + 1;

    tex = new Texture(Gdx.files.internal("sprites/item" + random + ".png"));

    frames = new Array<TextureRegion>();

    for(int i = 0; i < 4; i++) {
        frames.add(new TextureRegion(tex, i * 16, 0, 16, 16));
    }

    animation = new Animation(0.1f, frames);

    blank_texture = new Texture(Gdx.files.internal("sprites/blank_item.png"));

    setBounds(getX(), getY(), 15 / Engine.PPM, 15 / Engine.PPM);
    setToDestroy = false;
    destroyed = false;
    angle = 0;

    stateTime = 0;

    define_item();
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 *Define the Box2D body for the item
 */
public void define_item() {


    BodyDef bdef = new BodyDef();
    bdef.position.set(getX(), getY());
    bdef.type = BodyDef.BodyType.StaticBody;
    b2body = world.createBody(bdef);

    fdef = new FixtureDef();
    fdef.filter.categoryBits = Engine.ITEM_BIT;
    fdef.filter.maskBits = Engine.PLAYER_BIT;

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(7 / Engine.PPM, 7 / Engine.PPM);

    fdef.shape = shape;

    b2body.createFixture(fdef).setUserData(this);
    b2body.setGravityScale(0);
    b2body.setActive(true);
}


public void redefineItem() {

    Gdx.app.log("redefineItem", "Item");

    Vector2 position = b2body.getPosition();
    world.destroyBody(b2body);

    BodyDef bdef = new BodyDef();
    bdef.position.set(position);
    bdef.type = BodyDef.BodyType.StaticBody;
    b2body = world.createBody(bdef);

    fdef = new FixtureDef();
    fdef.filter.categoryBits = Engine.ITEM_BIT;
    fdef.filter.maskBits = Engine.PLAYER_BIT;

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(7 / Engine.PPM, 7 / Engine.PPM);

    fdef.shape = shape;

    b2body.createFixture(fdef).setUserData(this);
    b2body.setGravityScale(0);
    b2body.setActive(true);
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Draw Method
 * @param batch
 */
@Override
public void draw(Batch batch) {
    if(!destroyed) {
        super.draw(batch);
    }
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Update the Items
 * @param dt
 */
public void update(float dt){

    setRegion(getFrame(dt));
    stateTime += dt;

    if(setToDestroy && !destroyed){
        world.destroyBody(b2body);
        destroyed = true;
        setRegion(blank_texture);
        stateTime = 0;
    }
    else if(!destroyed) {
        setRegion(animation.getKeyFrame(stateTime, true));
        setPosition(b2body.getPosition().x - getWidth() / 2, b2body.getPosition().y - getHeight() / 2);
    }
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Get the Texture
 * @param dt
 * @return
 */
public TextureRegion getFrame(float dt){
    TextureRegion region;
    region = animation.getKeyFrame(stateTime, true);
    return region;
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Item has been collected
 * @param player
 */
public void collected(Player player) {
    if(Engine.bPlaySounds) {
        Sound sound = Gdx.audio.newSound(Gdx.files.internal("audio/sounds/collect_item.wav"));
        sound.play(1.0f);
    }

    //Change the Category Bit, so that it is no longer collidable
    fdef.filter.categoryBits = Engine.COLLECTED_BIT;
    this.setToDestroy = true;

    Gdx.app.log("Collected Item ", "" + this.item_number + " from room " + screen.getCurrentLevel() );

    //Increment the counter on the HUD
    screen.incrementItemCounter();
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Set the category Filter
 * @param filterBit
 */
public void setCategoryFilter(short filterBit){
    Filter filter = new Filter();
    filter.categoryBits = filterBit;
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Get the Tilemap cell
 * @return
 */
public TiledMapTileLayer.Cell getCell(){
    TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
    return layer.getCell((int)(b2body.getPosition().x * Engine.PPM / 16), (int)(b2body.getPosition().y * Engine.PPM / 16));
}
我的项目类别如下:

public static Array<Item> items;
public class Item extends Sprite {

protected World world;
protected PlayScreen screen;

private float stateTime;
protected TiledMap map;
protected MapObject object;

private Animation animation;
private Array<TextureRegion> frames;
private boolean setToDestroy;
private boolean destroyed;
float angle;
public Body b2body;

FixtureDef fdef;

private Texture tex;
private Texture blank_texture;
private int item_number;

////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Constructor
 * @param screen
 * @param object
 * @param x
 * @param y
 */
public Item(PlayScreen screen, MapObject object, float x, float y){
    this.world = screen.getWorld();
    this.screen = screen;
    this.map = screen.getMap();
    //this.item_number = item_number;

    setPosition(x, y);

    Random rn = new Random();
    int max = 2;
    int min = 1;
    int random = rn.nextInt(5) + 1;

    tex = new Texture(Gdx.files.internal("sprites/item" + random + ".png"));

    frames = new Array<TextureRegion>();

    for(int i = 0; i < 4; i++) {
        frames.add(new TextureRegion(tex, i * 16, 0, 16, 16));
    }

    animation = new Animation(0.1f, frames);

    blank_texture = new Texture(Gdx.files.internal("sprites/blank_item.png"));

    setBounds(getX(), getY(), 15 / Engine.PPM, 15 / Engine.PPM);
    setToDestroy = false;
    destroyed = false;
    angle = 0;

    stateTime = 0;

    define_item();
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 *Define the Box2D body for the item
 */
public void define_item() {


    BodyDef bdef = new BodyDef();
    bdef.position.set(getX(), getY());
    bdef.type = BodyDef.BodyType.StaticBody;
    b2body = world.createBody(bdef);

    fdef = new FixtureDef();
    fdef.filter.categoryBits = Engine.ITEM_BIT;
    fdef.filter.maskBits = Engine.PLAYER_BIT;

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(7 / Engine.PPM, 7 / Engine.PPM);

    fdef.shape = shape;

    b2body.createFixture(fdef).setUserData(this);
    b2body.setGravityScale(0);
    b2body.setActive(true);
}


public void redefineItem() {

    Gdx.app.log("redefineItem", "Item");

    Vector2 position = b2body.getPosition();
    world.destroyBody(b2body);

    BodyDef bdef = new BodyDef();
    bdef.position.set(position);
    bdef.type = BodyDef.BodyType.StaticBody;
    b2body = world.createBody(bdef);

    fdef = new FixtureDef();
    fdef.filter.categoryBits = Engine.ITEM_BIT;
    fdef.filter.maskBits = Engine.PLAYER_BIT;

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(7 / Engine.PPM, 7 / Engine.PPM);

    fdef.shape = shape;

    b2body.createFixture(fdef).setUserData(this);
    b2body.setGravityScale(0);
    b2body.setActive(true);
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Draw Method
 * @param batch
 */
@Override
public void draw(Batch batch) {
    if(!destroyed) {
        super.draw(batch);
    }
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Update the Items
 * @param dt
 */
public void update(float dt){

    setRegion(getFrame(dt));
    stateTime += dt;

    if(setToDestroy && !destroyed){
        world.destroyBody(b2body);
        destroyed = true;
        setRegion(blank_texture);
        stateTime = 0;
    }
    else if(!destroyed) {
        setRegion(animation.getKeyFrame(stateTime, true));
        setPosition(b2body.getPosition().x - getWidth() / 2, b2body.getPosition().y - getHeight() / 2);
    }
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Get the Texture
 * @param dt
 * @return
 */
public TextureRegion getFrame(float dt){
    TextureRegion region;
    region = animation.getKeyFrame(stateTime, true);
    return region;
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Item has been collected
 * @param player
 */
public void collected(Player player) {
    if(Engine.bPlaySounds) {
        Sound sound = Gdx.audio.newSound(Gdx.files.internal("audio/sounds/collect_item.wav"));
        sound.play(1.0f);
    }

    //Change the Category Bit, so that it is no longer collidable
    fdef.filter.categoryBits = Engine.COLLECTED_BIT;
    this.setToDestroy = true;

    Gdx.app.log("Collected Item ", "" + this.item_number + " from room " + screen.getCurrentLevel() );

    //Increment the counter on the HUD
    screen.incrementItemCounter();
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Set the category Filter
 * @param filterBit
 */
public void setCategoryFilter(short filterBit){
    Filter filter = new Filter();
    filter.categoryBits = filterBit;
}


////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Get the Tilemap cell
 * @return
 */
public TiledMapTileLayer.Cell getCell(){
    TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
    return layer.getCell((int)(b2body.getPosition().x * Engine.PPM / 16), (int)(b2body.getPosition().y * Engine.PPM / 16));
}
公共类项扩展了Sprite{
保护世界;
受保护的播放屏幕;
私人时间;
受保护的平铺地图;
受保护的MapObject对象;
私人动画;
专用阵列帧;
私有布尔setToDestroy;
私有布尔销毁;
浮动角;
公共机构;
FixtureDef-fdef;
私有纹理纹理;
私有纹理空白纹理;
专用int项目编号;
////////////////////////////////////////////////////////////////////////////////////////////
/**
*建造师
*@param屏幕
*@param对象
*@param x
*@param y
*/
公共项(PlayScreen屏幕、MapObject对象、浮点x、浮点y){
this.world=screen.getWorld();
this.screen=屏幕;
this.map=screen.getMap();
//this.item_number=item_number;
设定位置(x,y);
Random rn=新的Random();
int max=2;
int min=1;
int random=rn.nextInt(5)+1;
tex=新纹理(Gdx.files.internal(“精灵/项目”+随机+”.png”);
frames=新数组();
对于(int i=0;i<4;i++){
添加(新纹理区域(tex,i*16,0,16,16));
}
动画=新动画(0.1f,帧);
blank_texture=新纹理(Gdx.files.internal(“sprites/blank_item.png”);
setBounds(getX(),getY(),15/Engine.PPM,15/Engine.PPM);
setToDestroy=false;
毁灭=虚假;
角度=0;
stateTime=0;
定义_项();
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*定义项目的Box2D主体
*/
公共无效定义_项(){
BodyDef bdef=新的BodyDef();
bdef.position.set(getX(),getY());
bdef.type=BodyDef.BodyType.StaticBody;
b2body=world.createBody(bdef);
fdef=新的FixtureDef();
fdef.filter.categoryBits=引擎.ITEM_位;
fdef.filter.maskBits=Engine.PLAYER_位;
多边形形状=新的多边形形状();
形状设置框(7/Engine.PPM,7/Engine.PPM);
fdef.shape=形状;
b2body.createFixture(fdef).setUserData(this);
b2body.setGravityScale(0);
b2body.setActive(true);
}
公共项目(){
Gdx.app.log(“重定义项”、“项”);
Vector2 position=b2body.getPosition();
世界毁灭体(b2body);
BodyDef bdef=新的BodyDef();
bdef.position.set(位置);
bdef.type=BodyDef.BodyType.StaticBody;
b2body=world.createBody(bdef);
fdef=新的FixtureDef();
fdef.filter.categoryBits=引擎.ITEM_位;
fdef.filter.maskBits=Engine.PLAYER_位;
多边形形状=新的多边形形状();
形状设置框(7/Engine.PPM,7/Engine.PPM);
fdef.shape=形状;
b2body.createFixture(fdef).setUserData(this);
b2body.setGravityScale(0);
b2body.setActive(true);
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*画法
*@param批处理
*/
@凌驾
公共作废提取(批量){
如果(!销毁){
超级抽签(批量);
}
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*更新项目
*@param dt
*/
公共无效更新(浮动dt){
setRegion(getFrame(dt));
stateTime+=dt;
如果(设置为销毁和销毁){
世界毁灭体(b2body);
毁灭=真实;
设置区域(空白纹理);
stateTime=0;
}
否则,如果(!销毁){
setRegion(animation.getKeyFrame(stateTime,true));
setPosition(b2body.getPosition().x-getWidth()/2,b2body.getPosition().y-getHeight()/2);
}
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*获取纹理
*@param dt
*@返回
*/
公共纹理区域getFrame(浮点dt){
结构区;
region=animation.getKeyFrame(stateTime,true);
返回区;
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*物品已被收集
*@param播放器
*/
已收集公共无效信息(玩家){
if(Engine.bPlaySounds){
Sound-Sound=Gdx.audio.newSound(Gdx.files.internal(“audio/sounds/collect_item.wav”);
声音。播放(1.0f);
}
//更改类别位,使其不再可碰撞
fdef.filter.categoryBits=引擎.COLLECTED\u位;
this.setToDestroy=true;
Gdx.app.log(“收集的项目”,“此项目+房间号+”+screen.getCurrentLevel());
//增加抬头显示器上的计数器
screen.incrementItemCounter();
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*设置类别过滤器
*@param filterBit
*/
公共无效设置类别过滤器(短过滤器位){
过滤器=新过滤器();
filter.categoryBits=filterBit;
}
////////////////////////////////////////////////////////////////////////////////////////////
/**
*获取Tilemap单元格
*@返回
*/
public tiledMatpileLayer.Cell getCell()的{
TiledMattileLayer层=(TiledMattileLayer)map.getLayers().get(0);
返回层.getCell((int)(b2body.getPosition().x*Engine.PPM/16),(int)(b2body.getPosition().y*Engine.PPM/16));
}
}

我想将我收集的每件物品都存储在某种数组中,其中包括房间号和物品的X/Y位置。当我重新绘制项目时,它将跳过收集列表中的任何项目。问题是,我不确定如何在Java中实现这一点

有人对我如何做到这一点有什么建议吗

问候

詹姆斯