bool BoxCollider::IsCollider(ICollider& other){ switch (other.GetColliderType()) { case ColliderType::Box: return IsCollide((BoxCollider*)this, (BoxCollider*)&other); case ColliderType::Sphere: break; } return false; }
void IActor::Collide(ActorPtr const& actor) { // Own vs Other if (IsCollide(actor)) { OnCollide(actor); } // Own vs Other Child for (auto&& other : m_children) { if (IsCollide(other)) { OnCollide(other); } } // Own Child vs Other for (auto&& child : m_children) { child->Collide(actor); } }
void Actor::Collide(Actor& other) { HitInfo hitInfo; //衝突したか? if (IsCollide(other, hitInfo)) { //衝突したお互いのアクターのOnCollide()を呼ぶ hitInfo.collideActor = &other; OnCollide(hitInfo); hitInfo.collideActor = this; other.OnCollide(hitInfo); } //子の衝突判定を行う EachChildren([&](Actor& actor) { actor.Collide(other); }); }
bool cLevelLayerGridData::IsCollide(Vector3 e_vPos) { return IsCollide(Vector2(e_vPos.x,e_vPos.y)); }
void Widget::BlockMove(Direction dir) { switch (dir) { case UP: if(IsCollide(block_pos.pos_x,block_pos.pos_y,UP)) break; //逆时针旋转90度 BlockRotate(cur_block); //防止旋转后bug,i和j从0到4重新设置方块 for(int i=0;i<4;i++) for(int j=0;j<4;j++) game_area[block_pos.pos_y+i][block_pos.pos_x+j]=cur_block[i][j]; //重新计算边界 GetBorder(cur_block,cur_border); break; case DOWN: //方块到达边界则不再移动 if(block_pos.pos_y+cur_border.dbound==AREA_ROW-1) { ConvertStable(block_pos.pos_x,block_pos.pos_y); ResetBlock(); break; } //碰撞检测,只计算上下左右边界,先尝试走一格,如果碰撞则稳定方块后跳出 if(IsCollide(block_pos.pos_x,block_pos.pos_y,DOWN)) { //只有最终不能下落才转成稳定方块 ConvertStable(block_pos.pos_x,block_pos.pos_y); ResetBlock(); break; } //恢复方块上场景 for(int j=cur_border.lbound;j<=cur_border.rbound;j++) game_area[block_pos.pos_y][block_pos.pos_x+j]=0; //没有碰撞则下落一格 block_pos.pos_y+=1; //方块下降一格,拷贝到场景,注意左右边界 for(int i=0;i<4;i++) //必须是0到4 for(int j=cur_border.lbound;j<=cur_border.rbound;j++) if(block_pos.pos_y+i<=AREA_ROW-1&&game_area[block_pos.pos_y+i][block_pos.pos_x+j]!=2) //注意场景数组不越界,而且不会擦出稳定的方块 game_area[block_pos.pos_y+i][block_pos.pos_x+j]=cur_block[i][j]; break; case LEFT: //到左边界或者碰撞不再往左 if(block_pos.pos_x+cur_border.lbound==0||IsCollide(block_pos.pos_x,block_pos.pos_y,LEFT)) break; //恢复方块右场景 for(int i=cur_border.ubound;i<=cur_border.dbound;i++) game_area[block_pos.pos_y+i][block_pos.pos_x+3]=0; block_pos.pos_x-=1; //方块左移一格,拷贝到场景 for(int i=cur_border.ubound;i<=cur_border.dbound;i++) for(int j=0;j<4;j++) if(block_pos.pos_x+j>=0&&game_area[block_pos.pos_y+i][block_pos.pos_x+j]!=2) //注意场景数组不越界 game_area[block_pos.pos_y+i][block_pos.pos_x+j]=cur_block[i][j]; break; case RIGHT: if(block_pos.pos_x+cur_border.rbound==AREA_COL-1||IsCollide(block_pos.pos_x,block_pos.pos_y,RIGHT)) break; //恢复方块左场景 for(int i=cur_border.ubound;i<=cur_border.dbound;i++) game_area[block_pos.pos_y+i][block_pos.pos_x]=0; block_pos.pos_x+=1; //方块右移一格,拷贝到场景 for(int i=cur_border.ubound;i<=cur_border.dbound;i++) for(int j=0;j<4;j++) if(block_pos.pos_x+j<=AREA_COL-1&&game_area[block_pos.pos_y+i][block_pos.pos_x+j]!=2) //注意场景数组不越界 game_area[block_pos.pos_y+i][block_pos.pos_x+j]=cur_block[i][j]; break; case SPACE: //一次到底 //一格一格下移,直到不能下移 while(block_pos.pos_y+cur_border.dbound<AREA_ROW-1&&!IsCollide(block_pos.pos_x,block_pos.pos_y,DOWN)) { //恢复方块上场景 for(int j=cur_border.lbound;j<=cur_border.rbound;j++) game_area[block_pos.pos_y][block_pos.pos_x+j]=0; //没有碰撞则下落一格 block_pos.pos_y+=1; //方块下降一格,拷贝到场景,注意左右边界 for(int i=0;i<4;i++) //必须是0到4 for(int j=cur_border.lbound;j<=cur_border.rbound;j++) if(block_pos.pos_y+i<=AREA_ROW-1&&game_area[block_pos.pos_y+i][block_pos.pos_x+j]!=2) //注意场景数组不越界,而且不会擦出稳定的方块 game_area[block_pos.pos_y+i][block_pos.pos_x+j]=cur_block[i][j]; } ConvertStable(block_pos.pos_x,block_pos.pos_y); ResetBlock(); break; default: break; } //处理消行,整个场景上面的行依次下移 int i=AREA_ROW-1; int line_count=0; //记消行数 while(i>=1) { bool is_line_full=true; for(int j=0;j<AREA_COL;j++) if(game_area[i][j]==0) { is_line_full=false; i--; break; } if(is_line_full) { for(int k=i;k>=1;k--) for(int j=0;j<AREA_COL;j++) game_area[k][j]=game_area[k-1][j]; line_count++;//每次增加消行的行数 } } score+=line_count*10; //得分 //判断游戏是否结束 for(int j=0;j<AREA_COL;j++) if(game_area[0][j]==2) //最顶端也有稳定方块 GameOver(); }