Ejemplo n.º 1
0
int Bonus::move_bonus(double distance, Platform plat) {
	this->cir.center.y+=distance;
	point P=intersects(this->cir,plat.return_rectangle());
	if(cir.center.y>640+cir.r) return -1;
	else {
		if(P.x!=INF&&P.y!=INF) return this->type;
		else return 0;
	}
}
Ejemplo n.º 2
0
//co zwraca opisane jest w Ball.h
int Ball::move(vbl &blocks, vbo &borders, vbn &bonuses, Platform plat, int blocksuntouched[]) {
	bool col = false;
	bool usun = false;

	rectangle rr;
	point w;

	int cc = 0;

	//zderzenie z obramowaniem
	for (vbo::iterator it = borders.begin(); it != borders.end()/* && !col*/ && !usun; it++) {
		rr = (*it).return_rectangle();
		w = collision(rr);
		if (w.x != INF) {			
			if (!(*it).isMurderous()) {
				col = true;
				cc++;
				reflect(w);
				this->moze_odbic_sie_od_platformy = true;
			}
			else {
				usun = true;
				break;
			}
			change_vec(0.0, 0.0);
		}
	}

	bool chanceforbonus=false; //zmienna spamiętująca czy usunięto klocek
	point bonuscords;


	//zderzenie z blokiem
	for (vbl::iterator it = blocks.begin(); it != blocks.end()/* && !col*/ && !usun; it++) {
		rr = (*it).return_rectangle();
		w = collision(rr);
		if (w.x != INF) {
			col = true;
			cc++;
			reflect(w);
			if ((*it).get_lives()==(*it).get_maxlives()) blocksuntouched[(*it).get_type()]--;
			if ((*it).hit(1)) { // uderzenie z siłą 1 - do zmiany !!!
				
				chanceforbonus=true;
				bonuscords.x=((*it).return_rectangle().bottomright.x+(*it).return_rectangle().upperleft.x)/2;
				bonuscords.y=(*it).return_rectangle().bottomright.y;

				blocks.erase(it);
				
				
			}
			
			//tworzenie bonusu

			srand(time(0));
			int bonustype=rand()%3+1;
			if(bonustype%2==0&&chanceforbonus) chanceforbonus=true;
			else chanceforbonus=false;

			if(chanceforbonus) {
				circle cir;
				cir.r=16;
				cir.center=bonuscords;
				Bonus bonus(cir, bonustype); 
				bonuses.push_back(bonus);
			}
			this->moze_odbic_sie_od_platformy = true;
			break;
		}
	}

	
	
	

	

	bool plat_col = false;
	//zderzenie z platformą będzie tu ↓
//	if (this->moze_odbic_sie_od_platformy == true) {
		rr = plat.return_rectangle();
		w = collision(rr);
		if (w.x != INF) {
			plat_col = true;
			cc++;
			if (this->moze_odbic_sie_od_platformy) {
				double dist = (w.x-(rr.upperleft.x + (rr.bottomright.x-rr.upperleft.x)/2));
				reflect(w);
				change_vec(plat.getSpeed(), dist); //sprawdź czy nie krawędź
			}
			this->moze_odbic_sie_od_platformy = false;
		}
//	}
	
	//if (cc > 1) cout<<"errrrr\n";
	if (cc > 1 && plat_col) usun = true;
	
	(this->cir).center.x += speed*mv.x;
	(this->cir).center.y += speed*mv.y;	

	if (usun && !plat_col) return 1;
	else if (usun && plat_col) return 2;
	else if (plat_col) return 3;
	else return 4;
}
Ejemplo n.º 3
0
//co zwraca opisane jest w Ball.h
int Ball::move(vbl &blocks, vbo &borders, vbn &bonuses, Platform &plat, int blocksuntouched[], int &blocks_left) {
    lBR_tmp.clear();
    lBoR_tmp.clear();
    bool col = false;
    bool usun = false;
    bool usun_zolte = false;

    rectangle rr;
    point w;

    int cc = 0;

    //zderzenie z obramowaniem
    for (vbo::iterator it = borders.begin(); it != borders.end()/* && !col*/ && !usun; it++) {
        rr = (*it).return_rectangle();
        w = collision(rr);
        if (w.x != INF && !find(*it)/*lastBorderReflection != it*/) {
            if (!(*it).isMurderous()) {
                col = true;
                cc++;
                reflect(w);
                this->moze_odbic_sie_od_platformy = true;
            }
            else {
                usun = true;
                break;
            }
            change_vec(0.0, 0.0);
            lBoR_tmp.push_back(*it);
//			lastBorderReflection = it;
//			lastBlockReflection = blocks.end();
        }
        else if (w.x != INF && find(*it)) {
            puts("err 2*lBoR");
            lBoR_tmp.push_back(*it);
        }
    }

    bool chanceforbonus=false; //zmienna spamiętująca czy usunięto klocek
    point bonuscords;


    //zderzenie z blokiem
    for (vbl::iterator it = blocks.begin(); it != blocks.end()/* && !col*/ && !usun; it++) {
        rr = (*it).return_rectangle();
        w = collision(rr);
        if (w.x != INF && !find(*it)/*lastBlockReflection != it*/) {
            lBR_tmp.push_back(*it);
//			lastBlockReflection = it;
//			lastBorderReflection = borders.end();
            col = true;
            cc++;
            reflect(w);
            if ((*it).get_lives()==(*it).get_maxlives()) {
                blocksuntouched[(*it).get_type()]--;
                int yellowblock=3;

                if(blocksuntouched[yellowblock]==0) {
                    usun_zolte = true;

                    blocksuntouched[yellowblock]=-1;
//					lastBlockReflection = blocks.end();
//					lBR_tmp.clear();
                }
            }
            if ((*it).hit(1)) { // uderzenie z siłą 1 - do zmiany !!!

                chanceforbonus=true;
                bonuscords.x=((*it).return_rectangle().bottomright.x+(*it).return_rectangle().upperleft.x)/2;
                bonuscords.y=(*it).return_rectangle().bottomright.y;

                it--;
                blocks.erase(it+1);
                blocks_left--;
//				lastBlockReflection = blocks.end();
            }
            //printf("bloki: %d\n", blocks_left);
            //lastBlockReflection = blocks.end();

            //tworzenie bonusu

            int bonustype=rand()%5;
            bonustype++;
//			bonustype=5;
            if(rand()%3==0&&chanceforbonus) chanceforbonus=true;
            else chanceforbonus=false;

            if(chanceforbonus) {
                circle cir;
                //cir.r=16;
                cir.center=bonuscords;
                Bonus bonus(cir, bonustype);
                bonuses.push_back(bonus);
            }
            this->moze_odbic_sie_od_platformy = true;
            break;
        }
        else if (w.x != INF && find(*it)/*lastBlockReflection == it*/) {
            puts("err 2*lBR");
            lBR_tmp.push_back(*it);
        }
    }

    if (usun_zolte) {
        int yellowblock = 3;
        for (vbl::iterator it2 = blocks.begin(); it2 != blocks.end(); it2++) {	//to nie powinno być w części rysowania!
            if((*it2).get_type()==yellowblock) {
                it2--;
                blocks.erase(it2+1);
                blocks_left--;
            }
        }
    }


    bool plat_col = false;
    //zderzenie z platformą będzie tu ↓
//	if (this->moze_odbic_sie_od_platformy == true) {
    rr = plat.return_rectangle();
    w = collision(rr);
    if (w.x != INF) {
        plat_col = true;
        cc++;
        if (this->moze_odbic_sie_od_platformy) {
            double dist = (w.x-(rr.upperleft.x + (rr.bottomright.x-rr.upperleft.x)/2));
            reflect(w);
            change_vec(plat.getSpeed(), dist); //sprawdź czy nie krawędź
//				lastBorderReflection = borders.end();
//				lastBlockReflection = blocks.end();
        }
        this->moze_odbic_sie_od_platformy = false;
    }
//	}


    if (!plat_col && blocksuntouched[0]) {
        w=collision(bon_bl);
        if (w.x != INF) {
            cc++;
            reflect(w);
//			lastBorderReflection = borders.end();
//			lastBlockReflection = blocks.end();
            this->moze_odbic_sie_od_platformy = false;
            change_vec(0.0, 0.0);
            blocksuntouched[0]=0;
        }
    }

    lBR.clear();
    for (vbl::iterator it = lBR_tmp.begin(); it != lBR_tmp.end(); it++) {
        lBR.push_back(*it);
//		(*it).print();
    }

    lBoR.clear();
    for (vbo::iterator it = lBoR_tmp.begin(); it != lBoR_tmp.end(); it++) {
        lBoR.push_back(*it);
//		(*it).print();
    }

    if (cc > 1) puts("errrrr");
    if (cc > 1 && plat_col) usun = true;

    (this->cir).center.x += speed*mv.x;
    (this->cir).center.y += speed*mv.y;

    if (usun && !plat_col) return 1;
    else if (usun && plat_col) return 2;
    else if (plat_col) return 3;
    else return 4;
}
Ejemplo n.º 4
0
//co zwraca opisane jest w Ball.h
int Ball::move(vbl &blocks, vbo &borders, vbn &bonuses, Platform &plat, int blocksuntouched[], int &blocks_left, int &new_points) {
	lBR_tmp.clear();
	lBoR_tmp.clear();
	bool col = false;
	bool usun = false;
	bool usun_zolte = false;
	
	new_points = 0;

	rectangle rr;
	point w;

	int cc = 0;

	//zderzenie z obramowaniem
	for (vbo::iterator it = borders.begin(); it != borders.end()/* && !col*/ && !usun; it++) {
		rr = (*it).return_rectangle();
		w = collision(rr);
		if (w.x != INF && !find(*it)/*lastBorderReflection != it*/) {		
			if (!(*it).isMurderous()) {
				//col = true;
				cc++;
				reflect(w);
				this->moze_odbic_sie_od_platformy = true;
			}
			else {
				usun = true;
				break;
			}
			change_vec(0.0, 0.0);
			lBoR_tmp.push_back(*it);
//			lastBorderReflection = it;
//			lastBlockReflection = blocks.end();
		}
		else if (w.x != INF && find(*it)) {
			puts("err 2*lBoR");
			lBoR_tmp.push_back(*it);
		}
	}

	bool chanceforbonus=false; //zmienna spamiętująca czy usunięto klocek
	point bonuscords;

	//zderzenie z blokiem
	for (vbl::iterator it = blocks.begin(); it != blocks.end() && !usun; it++) {
		rr = (*it).return_rectangle();
		w = collision(rr);
		if (w.x != INF && !find(*it)) {
			lBR_tmp.push_back(*it);

			col = true;
			cc++;
			reflect(w);
			if ((*it).get_lives()==(*it).get_maxlives()) {
				blocksuntouched[(*it).get_type()]--;
				int yellowblock=3;
	
				if(blocksuntouched[yellowblock]==0) {
					usun_zolte = true;
					
					blocksuntouched[yellowblock]=-1;
				}
			}
			if ((*it).hit(1)) { // uderzenie z siłą 1 - do zmiany !!!
				
				chanceforbonus=true;
				bonuscords.x=((*it).return_rectangle().bottomright.x+(*it).return_rectangle().upperleft.x)/2;
				bonuscords.y=(*it).return_rectangle().bottomright.y;

				new_points += (*it).get_type();

				it--;
				blocks.erase(it+1);
				blocks_left--;					
			}			
			
			//tworzenie bonusu
			int bonustype;
			if (chanceforbonus) {
				double random_no = (double)rand() / RAND_MAX;
				if (random_no < 0.850) chanceforbonus = false;
				else if (chanceforbonus && random_no < 0.870) bonustype = 1;
				else if (chanceforbonus && random_no < 0.905) bonustype = 2;
				else if (chanceforbonus && random_no < 0.945) bonustype = 3;
				else if (chanceforbonus && random_no < 0.980) bonustype = 4;
				else if (chanceforbonus && random_no <= 1.0) bonustype = 5;			
				/*
					1 - zmniejsz platformę
					2 - zwiększ platformę
					3 - dodaj border na dole
					4 - dodaj 2 nowe piłki
					5 - dodaj życie
				*/
				//bonustype=2;
			}

			if(chanceforbonus) {
				circle cir;
				//cir.r=16;
				cir.center=bonuscords;
				Bonus bonus(cir, bonustype); 
				bonuses.push_back(bonus);
			}
			this->moze_odbic_sie_od_platformy = true;
			break;
		}
		else if (w.x != INF && find(*it)) {
			puts("err 2*lBR");
			lBR_tmp.push_back(*it);
		}
	}
	
	if (usun_zolte) {
		int yellowblock = 3;
		for (vbl::iterator it2 = blocks.begin(); it2 != blocks.end(); it2++) {	//to nie powinno być w części rysowania!
			if((*it2).get_type()==yellowblock) {
				new_points += (*it2).get_type();
				it2--;
				blocks.erase(it2+1);
				blocks_left--;
			}
		}
	}
	

	//zderzenie z platformą
	bool plat_col = false;	
	rr = plat.return_rectangle();
	w = collision(rr);
	if (w.x != INF) {
		plat_col = true;
		cc++;
		if (this->moze_odbic_sie_od_platformy) {
			double dist = (w.x-(rr.upperleft.x + (rr.bottomright.x-rr.upperleft.x)/2));
			reflect(w);
			change_vec(plat.getSpeed(), dist); //sprawdź czy nie krawędź
		}
		this->moze_odbic_sie_od_platformy = false;
	}


	if (!plat_col && blocksuntouched[0]) {
		w=collision(bon_bl);
		if (w.x != INF) {
			cc++;
			reflect(w);
			this->moze_odbic_sie_od_platformy = false;
			change_vec(0.0, 0.0);
			blocksuntouched[0] = 0;
		}
	}
	/*else if (plat_col && blocksuntouched[0]) {
		blocksuntouched[0] = 0;
	}*/
	
	lBR.clear();
	for (vbl::iterator it = lBR_tmp.begin(); it != lBR_tmp.end(); it++) {
		lBR.push_back(*it);
	}
	
	lBoR.clear();
	for (vbo::iterator it = lBoR_tmp.begin(); it != lBoR_tmp.end(); it++) {
		lBoR.push_back(*it);
	}
	
	if (cc > 1) puts("errrrr");
	if (cc > 1 && plat_col) {
		mv.x = 0;
		mv.y = 10;
		if ((this->cir).center.y < 595) mv.y *= -1;
		if ((this->cir).center.x > 480) (this->cir).center.x -= 0.1;
		else (this->cir).center.x += 0.1;
		//usun = true;
	}
	
	(this->cir).center.x += speed*mv.x;
	(this->cir).center.y += speed*mv.y;	

	if (usun && !plat_col) return 1;
	else if (usun && plat_col) return 2;
	else if (plat_col) return 3;
	else return 4;
}
Ejemplo n.º 5
0
//co zwraca opisane jest w Ball.h
int Ball::move(vbl &blocks, vbo &borders, Platform plat) {
	bool col = false;
	bool usun = false;

	rectangle rr;
	point w;

	//zderzenie z obramowaniem
	for (vbo::iterator it = borders.begin(); it != borders.end() && !col && !usun; it++) {
		rr = (*it).return_rectangle();
		w = collision(rr);
		if (w.x != INF) {
			if (!(*it).isMurderous()) {
				col = true;
				reflect(w);
				this->moze_odbic_sie_od_platformy = true;
			}
			else {
				usun = true;
				break;
			}
		}
	}


	//zderzenie z blokiem
	for (vbl::iterator it = blocks.begin(); it != blocks.end() && !col && !usun; it++) {
		rr = (*it).return_rectangle();
		w = collision(rr);
		if (w.x != INF) {
			col = true;
			reflect(w);
			if ((*it).hit(1)) { // uderzenie z siłą 1 - do zmiany !!!
				cout<<"usuwam...\n";
				blocks.erase(it);
			}
			this->moze_odbic_sie_od_platformy = true;
			break;
		}
	}

	bool plat_col = false;
	//zderzenie z platformą będzie tu ↓
//	if (this->moze_odbic_sie_od_platformy == true) {
		rr = plat.return_rectangle();
		w = collision(rr);
		if (w.x != INF) {
			plat_col = true;
			if (this->moze_odbic_sie_od_platformy) {
				change_vec(plat.getSpeed());
				reflect(w);
			}
			this->moze_odbic_sie_od_platformy = false;
		}
//	}
	
	(this->cir).center.x += speed*mv.x;
	(this->cir).center.y += speed*mv.y;	

	if (usun && !plat_col) return 1;
	else if (usun && plat_col) return 2;
	else if (plat_col) return 3;
	else return 4;
}