如何使用java在png图像上创建网格图?

时间:2013-11-20 07:44:36

标签: java

问题在于我正在帮助一个拥有java项目的朋友,我们必须创建一个MSX的Knightmare翻版。游戏已经发展得很好但我们不知道如何创造与风景的东西的碰撞,比如河上的柱子和桥梁。为了做到这一点,我认为我们可以在png上创建逻辑“网格映射”(整个级别是这个图像,在游戏上像普通图像一样调用)并在其上做逻辑,只是一个布尔逻辑。

所以我建议做的基本方法是在我们的脑海中计算出这个网格的二维数组。是否有一些我们可以使用的工具,以便更容易或自动化?

Knightmare original version video

And this is the image that we are using on the game

1 个答案:

答案 0 :(得分:0)

我将尝试回答标题问题,这似乎是重要问题。

前段时间我用Java编写了一个小平台游戏,在那里我编写了一个名为comprobarColisiones()(检查碰撞)的方法,我每次都调用它

// Check collisions
comprobarColisiones();

h.mover(pasadas); //Move hero

// Moving enemies
if (h.x > en.getX()){
    en.mover(h.getdx(), h.getIzq(),pasadas);
}
if (h.x> en2.getX()){
    en2.mover(h.getdx(), h.getIzq(),pasadas);
}

// Moving static objects (rocks)
roca1.mover(h.getdx(),h.getIzq());
roca2.mover(h.getdx(),h.getIzq());
roca3.mover(h.getdx(),h.getIzq());

// REPAINTING
repaint();

// A time calculation that I use to control the game speed somewhere
tiempoAnteriorTipito = System.currentTimeMillis();

当我的意思是“静态物体”时,它只是为了区分具有自我运动的物体和那些只要英雄移动的物体,在你的游戏中(如我的),可能不会有任何静态物体(嗯,可能是分数和东西),甚至岩石都会滚动。

public void comprobarColisiones(){

    // Getting bounds
    Rectangle r1 = en.getBounds();
    Rectangle r2 = en2.getBounds();
    Rectangle rec_roca1 = roca1.getBounds();
    Rectangle rec_roca2 = roca2.getBounds();
    Rectangle rec_roca3 = roca3.getBounds();

    // Getting bounds and resolving collisions with shooting objects
    ArrayList martillos = Heroe.getMartillos();
    for (int i = 0; i < martillos.size(); i++) {

            Martillo m = (Martillo) martillos.get(i);
            Rectangle m1 = m.getBounds();
            if (r1.intersects(m1) && en.vive())
            {
                    en.setVive(false);
                    m.visible = false;
            }
            else if (r2.intersects(m1)&& en2.vive())
            {
                    en2.setVive(false);
                    m.visible = false;                        
            }
    }

    // Checking if hero touches enemies

    Rectangle heroecuad = h.getBounds();
    if (heroecuad.intersects(r1)&&en.vive()){
        perdio = true;
        System.out.println("PERDIO CON EL ENEMIGO 1");
    }
    if (heroecuad.intersects(r2)&&en2.vive()){
        perdio = true;
        System.out.println("PERDIO CON EL ENEMIGO 2");
    }

    // Checking if hero touches static objects

    if(heroecuad.intersects(rec_roca1)){
        System.out.println("CHOCO ROCA 1");
    }

    if(heroecuad.intersects(rec_roca2)){
        System.out.println("CHOCO ROCA 2");
    }        

    if(heroecuad.intersects(rec_roca3)){
        System.out.println("CHOCO ROCA 3");
    }        
}

我创建了敌人和静态东西,并在我加载escenario时放置它们,就像这样:

en = new Enemigo(800, ALTURA_PISO+8);
en2 = new Enemigo(900, ALTURA_PISO+8);

roca1 = new Roca(1650, ALTURA_PISO+17);
roca2 = new Roca(2200, ALTURA_PISO+17);
roca3 = new Roca(3400, ALTURA_PISO+17);

// Being the first number the initial X-Pos and the second the initial Y-Pos, this will change everytime the hero moves, of course

可能在您的游戏中,您将地图的任何区域定义为可探测的,并添加一些幽灵对象以检查与英雄的交叉点并停止其移动。对于我所看到的,你的英雄不应该探索水和柱子。

希望这会给你一些想法。