Это проверка столкновения, которую я использую в своей игре в стиле тетриса. Он находится в моем файле Main.as.
private function checkCollision(f:GameField):Boolean{
var p:Piece = f.activePiece;
var a:Array = f.blockArray;
for (var j:int = 0; j < p.numChildren; j++){
var b:Block = p.getChildAt(j) as Block;
// check walls, your will probably have four instead of 3
if (b.hitTestObject(f.leftWall) || b.hitTestObject(f.rightWall) || b.row + b.rowLocal >= f._rows){
return true;
}
}
// check all the blocks in f.blockArray
for (var i:int = 0; i < a.length; i++){
// check the moving PIECE against all other BLOCKS
if (p.hitTestObject(a[i])){
// check every child of the PIECE (these will be the blocks)
for (var j:int = 0; j < p.numChildren; j++){
// excluding the BLOCKS in the moving PIECE
if (p.getChildAt(j).parent != a[i].parent){
var b:Block = p.getChildAt(j) as Block;
// finally, BLOCK vs BLOCK collision check
if (b.hitTestObject(a[i])){
return true;
}
}
}
}
}
return false;
}
Это конструктор для моего класса Кусок:
public function Piece(f:GameField,shape:Array,color:uint)
{
makeGrid();
f.addChild(this);
// the shape array passed to this constructor is shown at the end of my post
_shape = shape;
addBlocks(f,shape,color);
}
private function addBlocks(f:GameField, shape:Array, color:uint):void{
_shape = shape;
for (var i:int = 0; i < shape.length; i++){
var b:Block = new Block(color);
// this uses the Array passed as var "shape" to tell where the block will be in relation to the center of rotation of the Piece instance
b.rowLocal = shape[i].y+2;
b.columnLocal = shape[i].x+2;
// this tells the brick its starting column and row are
b.row = -2;
b.column = 3;
// this is the sum of the local and global coordinates
b.y = (b.rowLocal + b.row) * Main.UNIT_SIZE;
b.x = (b.columnLocal + b.column) * Main.UNIT_SIZE;
// put the block on the display list
addChild(b);
// add the block to the array to use for collision checks in the Main doc
f.blockArray.push(b);
}
}
А класс Блок просто расширяет спрайт и рисует квадрат (шахта имеет некоторые лакомства, которые не должны быть применены здесь, так Я не стану его публиковать).
И, наконец, вызов конструктора Piece и пример массива формы, который передается ему.
var newP:Piece = new Piece(f, arr, color);
и форма массива:
_shapeArray = [
{shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (1, 0)),color:_colorArray[0]}, // I
{shape:new Array(new Point (-1, -1), new Point (-1, 0), new Point (0, 0), new Point (0, -1)),color:_colorArray[1]}, // O
{shape:new Array(new Point (-2, -1), new Point (-1, -1), new Point (-1, 0), new Point (0, 0)),color:_colorArray[2]}, // Z
{shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (-1, -1), new Point (0, -1)),color:_colorArray[3]}, // S
{shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (-2, -1)),color:_colorArray[4]}, // J
{shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (0, -1)),color:_colorArray[5]}, // L
{shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (-1, -1)),color:_colorArray[6]} // T
];
Резюмируя:
- сделать класс блок, который расширяет Sprite
- сделать класс кусок, который содержит экземпляров блоков, расположенных в форму, которую вы выбираете.
- Запустите проверку столкновения между соответствующими кусками блоков.
редактировать
Это выглядит, как он может работать. Однако у меня есть еще один вопрос: checkCollision() возвращает логическое значение, но что я делаю с этим логическим? Если логическое значение true, как мне сделать объекты неспособными пересечь?
Вот как я это реализовал. Разрешить объектам пересекать друг друга, а затем звонить
if (checkCollision(f)) {
// check collision returned true
// so reverse the last move
// before finishing this game loop
}
Два варианта. Вы можете использовать некоторую 2D-физическую структуру, которая позволяет вам сталкиваться с любыми фигурами, которые вы хотите, или можете использовать что-то вроде 2D-матрицы Tetris, где любая форма занимает список ячеек, определяемых положением и поворотом фигуры, и если вы хотите переместить фигуру должны проверить матрицу, если все ячейки назначения свободны. – Organis
Я только что сделал это на прошлой неделе (построил Тетрис). Это требует некоторой работы, но у меня наконец появился классный класс классов, основанный на ядре. Я думаю, что это «лучший» вариант. Дайте мне знать, если вы хотите, чтобы я опубликовал немного кода для вас. –
Проводка кода будет работать для меня. –