我正在尝试将Java游戏作为一个有趣的副项目。
我的游戏板是一块瓷砖网格:
grid = new Tile[height][width];
在网格中,我创建了一个新的Tile对象:activetile = new Tile(this,0, 0); //add new tile to "this" board
目前:
我可以控制单个磁贴 - 向下,向左和向右移动
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_DOWN) {
checkBottomFull(0,4);
collisionCheck(activetile.getX(),activetile.getY());
checkEndGame(activetile.getX(), activetile.getY());
activetile.setLocation(activetile.getX(), activetile.getY()+1);
System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY());
repaint();
}
...right key and left key code omitted
checkBottomFull()
将清除底行(如果已满),collisionCheck()
将生成一个新作品,如果块击中地板或下面的另一块,checkEndGame()
将如果块被卡在顶部,则结束游戏。
我正在努力解决以下问题:
为了创建一个真正的俄罗斯方块,我想我应该只生成3个其他的Tile实例,并根据它是什么部分(L,O,Bar,Z等),设置它们的位置根据activetile(我控制的单个瓷砖)的适当位置,如下:
if (piece == "Bar") {
block2 = new Tile(this, activetile.getX(), activetile.getY());
block3 = new Tile(this, activetile.getX()+2, activetile.getY());
block4 = new Tile(this, activetile.getX()+3, activetile.getY());
}
问题是,我对activetile
的碰撞检测不允许它适当移动,因为它会遇到其他块。我尝试在keyPressed()
中通过设置block2, block3, block4
的位置来设置活动后的新位置设置,如下所示:(因此,一旦activetile
向下移动,所有其他人都被允许向下移动,使它们不重叠)
activetile.setLocation(activetile.getX(), activetile.getY()+1);
block2.setLocation(activetile.getX(), activetile.getY()+1);
block3.setLocation(activetile.getX(), activetile.getY()+1);
block4.setLocation(activetile.getX(), activetile.getY()+1);
这可能适用于下降,但它不适用于向左或向右移动,因为瓷砖将重叠。
那么,我是否正确地通过生成这样的新块来创建Bar
块的新instane?我的想法是否正确?
可执行
https://www.dropbox.com/s/oyh26dfbmsvt5c8/my_tetris_test.jar
链接到源代码zip
https://www.dropbox.com/s/9kt3sl6qqo54amk/Tetris%20Two.rar
谢谢!
答案 0 :(得分:1)
我会看一下Polygon类:http://docs.oracle.com/javase/6/docs/api/java/awt/Polygon.html
提供的方法可以测试与另一个对象上的点的碰撞(内部)。您还可以使用translate(deltaX, deltaY)
大大简化对象的“动作”。