테트리스 스타일 게임에서 사용하는 충돌 검사입니다. 내 Main.as 파일에 있습니다. 그냥 그렇게, 스프라이트를 확장하고 사각형 (광산 여기에 적용 할 필요가없는 몇 가지 케이크를 가지고 무
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);
}
}
그리고 블록 클래스 :
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;
}
이
내 조각 클래스의 생성자 나는 그것을 게시하지 않을 것이다).
마지막으로 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
];
은 요약하면 :
- 이 가 배열 블록 인스턴스를 포함하는 조각 클래스를 확인 스프라이트
- 를 확장하는 블록 클래스를 확인 당신이 선택한 모양.
- 관련 블록 조각들 사이의 충돌 검사를 실행합니다. 그것은 일할 수있는 것처럼
편집
이 보인다. 그러나 하나 이상의 질문이 있습니다 : checkCollision() 부울 반환하지만 그 불리언 함께 할? 부울이 참이면 객체를 교차시킬 수 없게하려면 어떻게해야합니까?
이렇게 구현했습니다. 물체가 서로 교차하도록 허용 한 다음 전화하십시오.
if (checkCollision(f)) {
// check collision returned true
// so reverse the last move
// before finishing this game loop
}
두 가지 옵션이 있습니다. 당신은 당신이 원하는 모양을 충돌시킬 수있는 2D 물리학 프레임 워크를 사용할 수 있습니다. 또는 어떤 모양이 도형의 위치와 회전에 의해 결정되는 셀의 목록을 차지하는 테트리스 2D 매트릭스와 같은 것을 사용할 수 있습니다. 모든 대상 셀이 비어 있으면 행렬을 검사해야합니다. – Organis
방금 지난 주에이 정확한 작업을 수행했습니다 (Tetris 구축). 몇 가지 작업이 필요하지만 마침내 강력한 셀 기반 클래스 세트가 작동합니다. 나는 그것이 "더 나은"선택이라고 생각한다. 내가 당신을 위해 약간의 코드를 게시하기를 원한다면 알려주십시오. –
코드 게시는 저에게 도움이 될 것입니다. –