TlačiťTlačiť Slovenčina English Hľadať RSS

© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 27. 4. 2024.

Stránka sa načítava, prosím čakajte…

Dátum: 14. 9. 2020, pred štyrmi rokmi, aktualizované: 6. 1. 2021, pred tromi rokmi

Pažravec je nenásytná postavička ovládateľná klávesnicou aj myšou (šípkami a medzerníkom; ťahaním kurzora myši po ploche a klikom pravého tlačidla). Jeho cieľom je zjesť všetku potravu na ploche. Bránia mu v tom ružovkasté améby, ktoré môže zlikvidovať presne mierenými bodliakmi, ktoré generuje jeho telo (ich zásoba je vidno v hrebeni na hlave, ktorý sa postupne skracuje; potrava generovanie bodliakov urýchľuje, ale ich generovanie sa úplne nezastaví ani keď je pažravec hladný).

Na ploche sú náhodne rozhádzané brvná, ktoré nemajú iný význam ako prekážať. Výnimočne sa môže stať, že sa jedlo ocitne na neprístupnom mieste medzi prekážkami. Aby bola hra dohrateľná, dajú sa brvná tiež zničiť pichliačmi, ale až po odstránení všetkých améb.

Ak pažravca zožerie améba, oživí sa na náhodnej pozícii na trávniku, ale spolu s ním pribudne do hry jedna améba navyše. Keď je améb masívna presila, hra sa ukončí prehrou. Naopak, keď pažravec zožerie všetko jedlo rozhádzané po trávniku, tak sa hra ukončí výhrou.

 

obrázok 
Ukážka vzhľadu začatej novej hry.

 

~

import knižnica.Bod;
import knižnica.Častica;
import knižnica.Farba;
import knižnica.Kláves;
import knižnica.GRobot;
import knižnica.Poloha;
import knižnica.PoložkaPonuky;
import knižnica.Svet;
import knižnica.Zoznam;

import static knižnica.Svet.*;
import static knižnica.Kláves.*;

public class Hlavná extends GRobot
{
	private int zožrané = 0;
	private final Pažravec pažravec;
	private final Pozadie pozadie;
	private final Zoznam<Krmivo> krmivo = new Zoznam<>();
	private final Zoznam<Príšera> príšery = new Zoznam<>();
	private final Zoznam<Stena> steny = new Zoznam<>();
	private final Častica náhodnýCieľ = new Častica();

	public static boolean vypĺňaj = true;
	public static boolean prekresliSteny = false;

	// Atribút slúžiaci na uchovanie položky ponuky „Nová hra.“
	private final PoložkaPonuky nováHra;

	private Hlavná()
	{
		nekresli();
		pozadie = new Pozadie();

		veľkosť(8);
		hrúbkaČiary(3);
		farba(nebeská);

		pažravec = new Pažravec();
		for (int i = 0; i < 100; ++i)
			krmivo.pridaj(new Krmivo());
		for (int i = 0; i < 5; ++i)
			príšery.pridaj(new Príšera());
		for (int i = 0; i < 17; ++i)
			steny.pridaj(new Stena());
		// (Pichliače vytvárame neskôr, aby boli vizuálne najvyššie bez
		// potreby používania vrstiev. Používame verejný zoznam pažravca.)
		for (int i = 0; i < 3; ++i)
			pažravec.pichliače.pridaj(new Pichliač());

		// Pridanie položky „Nová hra“ do ponuky:
		nováHra = pridajPoložkuPonuky("Nová hra", VK_N, VK_N);

		vykonajKontrolu();

		vlastnýTvar(r ->
		{
			Farba f = farba();
			for (Krmivo k : krmivo)
				if (k.viditeľné)
				{
					skočNa(k);
					farba(f);
					if (vypĺňaj) kruh();
					farba(čierna);
					kružnica();
				}

			// Na ladenie kĺzania:
			/*
			if (null != aaa)
			{
				farba(oranžová);
				skočNa(aaa);
				kruh(5);
			}
			if (null != bbb)
			{
				farba(tyrkysová);
				skočNa(bbb);
				kruh(5);
			}
			if (null != ccc)
			{
				farba(červená);
				skočNa(ccc);
				kruh(5);
			}
			if (null != ddd)
			{
				choďNa(ddd);
				kruh(5);
			}
			*/
		});

		spustiČasovač();
	}


	// Na ladenie kĺzania:
	// Bod aaa = null, bbb = null, ccc = null, ddd = null;


	private void nováHra()
	{
		zožrané = 0;
		pažravec.obnov();

		for (Krmivo k : krmivo)
			if (k.viditeľné) k.viditeľné = false;
		for (int i = 0; i < 100; ++i) novéKrmivo(false);

		for (Príšera príšera : príšery)
			if (príšera.viditeľný()) príšera.skry();
		for (int i = 0; i < 5; ++i) nováPríšera(false);

		for (Stena stena : steny) stena.obnov();
		prekresliSteny = true;

		for (Pichliač pichliač : pažravec.pichliače)
			if (pichliač.aktívny()) pichliač.deaktivuj();

		vykonajKontrolu();
		spustiČasovač();
	}

	private void novéKrmivo()
	{
		novéKrmivo(true);
	}

	private void novéKrmivo(boolean ajKontrola)
	{
		for (Krmivo k : krmivo)
			if (!k.viditeľné)
			{
				k.náhodnáPoloha();
				k.viditeľné = true;
				if (ajKontrola) vykonajKontrolu();
				return;
			}

		krmivo.pridaj(new Krmivo());
		if (ajKontrola) vykonajKontrolu();
	}

	private void nováPríšera()
	{
		nováPríšera(true);
	}

	private void nováPríšera(boolean ajKontrola)
	{
		for (Príšera príšera : príšery)
			if (príšera.skrytý())
			{
				príšera.obnov();
				if (ajKontrola) vykonajKontrolu();
				return;
			}

		príšery.pridaj(new Príšera());
		if (ajKontrola) vykonajKontrolu();
	}

	private void vykonajKontrolu()
	{
		// System.out.print("Kontrola");
		for (int i = 0; i < 10; ++i)
			if (!kontrola())
			{
				// System.out.print("; i: " + i);
				break;
			}
		// System.out.println(".");
	}

	private boolean kontrola()
	{
		boolean zmenené = false;

		for (Stena stena : steny)
		{
			for (Krmivo k : krmivo)
				if (k.viditeľné && stena.bodVObdĺžniku(k,
					stena.veľkosť() + veľkosť() * 2, 20 + veľkosť() * 2))
				{
					k.náhodnáPoloha();
					zmenené = true;
				}

			if (stena.koliduje(pažravec))
			{
				pažravec.náhodnáPoloha();
				zmenené = true;
			}

			for (Príšera príšera : príšery)
				if (príšera.viditeľný() && stena.koliduje(príšera))
				{
					príšera.náhodnáPoloha();
					zmenené = true;
				}
		}

		return zmenené;
	}


	@Override public void tik()
	{
		boolean koniec = true;
		for (Krmivo k : krmivo)
			if (k.viditeľné)
			{
				koniec = false;
				if (pažravec.vzdialenosťOd(k) <
					pažravec.veľkosť() - veľkosť())
				{
					++zožrané;
					k.viditeľné = false;
				}
			}
		if (koniec)
		{
			pažravec.rýchlosť(0);
			for (Príšera príšera : príšery)
				if (príšera.viditeľný()) príšera.skry();
		}

		if (zožrané >= 10 && pažravec.pridajPichliač()) zožrané -= 10;

		for (Príšera príšera : príšery)
			if (príšera.viditeľný())
				for (Pichliač pichliač : pažravec.pichliače)
					if (pichliač.aktívny() && pichliač.koliduje(príšera))
					{
						pichliač.deaktivuj();
						príšera.zraň();
					}

		for (Príšera príšera : príšery)
			if (príšera.viditeľný())
			{
				if (pažravec.koliduje(príšera))
				{
					vykonaťNeskôr(() ->
					{
						príšera.zraň();
						príšera.náhodnáPoloha();
						príšera.náhodnýSmer();
						for (int i = 0; i < 10; ++i)
							novéKrmivo(false);
						nováPríšera(false);
						pažravec.náhodnáPoloha();
						pažravec.náhodnýSmer();
						vykonajKontrolu();
						int početPríšer = 0;
						for (Príšera počítadlo : príšery)
							if (počítadlo.viditeľný()) ++početPríšer;
						if (početPríšer > 30)
						{
							zastavČasovač();
							pažravec.deaktivuj();
						}
					});
				}
				else if (príšera.pasívny())
				{
					if (0 == náhodnéCeléČíslo(-1, 1))
						príšera.cieľ(pažravec);
					else
					{
						náhodnýCieľ.náhodnáPoloha();
						príšera.cieľ(náhodnýCieľ);
					}
				}
			}

		// Kĺzanie popri stene je vykonané maximálne 100-krát. Po stom pokuse
		// je to brané ako zlyhanie a pažravec sa posunie na poslednú polohu,
		// v ktorej nekolidoval so stenou.
		{
			Poloha poslednáPoloha = pažravec.poslednáPoloha();
			int i = 0;
			for (; i < 100; ++i)
			{
				boolean skonči = true;
				Poloha poloha = pažravec.poloha();
				for (Stena stena : steny)
				{
					if (stena.koliduje(pažravec))
					{
						skonči = false;
						Bod bod = najbližšíBodNaÚsečke(pažravec,
							stena.ľavýBod(), stena.pravýBod());

						// Na ladenie kĺzania:
						/*
						aaa = stena.ľavýBod();
						bbb = stena.pravýBod();
						ccc = bod;
						*/

						double uhol = pažravec.uhol();
						pažravec.skočNa(bod);
						pažravec.otočNa(poloha);
						double vzdialenosť = pažravec.vzdialenosťK(poloha);
						pažravec.vľavo(náhodnéReálneČíslo(-1, 1));
						pažravec.skoč(vzdialenosť + 1);

						// Na ladenie kĺzania:
						// ddd = pažravec.poloha();

						pažravec.uhol(uhol);
						break;
					}
				}
				if (skonči) break;
			}

			if (i >= 100)
			{
				pažravec.skočNa(poslednáPoloha);
				pažravec.vľavo(náhodnéReálneČíslo(-1, 1));
			}
		}

		for (Stena stena : steny)
		{
			boolean bezPríšer = true;

			for (Príšera príšera : príšery)
				if (príšera.viditeľný())
				{
					if (stena.koliduje(príšera))
					{
						príšera.zrušCieľ();
						príšera.skočNa(príšera.poslednáPoloha());
					}
					bezPríšer = false;
				}

			for (Pichliač pichliač : pažravec.pichliače)
				if (pichliač.aktívny() && stena.koliduje(pichliač))
				{
					if (bezPríšer)
					{
						if (stena.veľkosť() > 10)
							stena.veľkosť(stena.veľkosť() - 10);
						else if (stena.veľkosť() > 0)
							stena.veľkosť(0);
						else
							pažravec.pridajPichliač();
					}
					else if (stena.veľkosť() > 1)
						stena.veľkosť(stena.veľkosť() - 1);

					prekresliSteny = true;
					pichliač.deaktivuj();
				}
		}

		if (prekresliSteny)
		{
			pozadie.prekresli();
			for (Stena stena : steny) stena.nakresli();
			prekresliSteny = false;
		}

		if (neboloPrekreslené()) prekresli();
	}

	@Override public void voľbaPoložkyPonuky()
	{
		if (nováHra.aktivovaná())
		{
			if (časovačAktívny()) zastavČasovač();
			if (ÁNO == otázka("Spustiť novú hru?")) nováHra();
		}
	}


	public static void main(String[] args)
	{
		// Zapnutie podrobnejšieho režimu ladenia na detekciu
		// niektorých ťažšie zistiteľných chýb:
		// režimLadenia(true, true);

		Svet.skry();
		použiKonfiguráciu("Pažravec.cfg");
		new Hlavná();
		if (prvéSpustenie()) zbaľ();
		Svet.zobraz();
	}
}

~

import knižnica.Častica;

public class Krmivo extends Častica
{
	public boolean viditeľné = true;

	public Krmivo()
	{
		náhodnáPoloha();
	}
}

~

import knižnica.Farba;
import knižnica.GRobot;
import knižnica.Rad;
import knižnica.Zoznam;

import static knižnica.Kláves.*;
import static knižnica.Svet.*;
import static knižnica.ÚdajeUdalostí.*;

public class Pažravec extends GRobot
{
	private final Rad fázaÚst = new Rad(0, 90, 15);
	private int pichliačov = 5;
	private int interval = 0;

	// Pichliač je verejný. Z pohľadu bezpečnosti (OOP) to neprekáža.
	// Pichliač je v podstate samostatná jednotka, ku ktorej aj tak
	// potrebujeme mať prístup.
	public Zoznam<Pichliač> pichliače = new Zoznam<>();

	public Pažravec()
	{
		ohranič();
		zdvihniPero();
		veľkosť(25);
		farba(svetložltá);
		hrúbkaČiary(3);
		obnov();
	}


	public void obnov()
	{
		pichliačov = 5;
		interval = 0;
		fázaÚst.hodnota(0);
		rýchlosť(5);
		aktivuj(false);
		náhodnáPoloha();
		náhodnýSmer();
	}

	public void vystreľ()
	{
		if (pichliačov > 0)
		{
			for (Pichliač pichliač : pichliače)
				if (pichliač.pasívny())
				{
					--pichliačov;
					pichliač.skočNa(this);
					pichliač.smer(this);
					pichliač.aktivuj(50, false);
					break;
				}
		}
	}

	public boolean pridajPichliač()
	{
		if (pichliačov < 15)
		{
			++pichliačov;
			return true;
		}
		return false;
	}

	private void zub()
	{
		Farba f = farba();
		double veľkosť = veľkosť() / 4;

		farba(snehová);
		if (Hlavná.vypĺňaj) vyplňŠtvorec(veľkosť);
		farba(čierna);
		kresliŠtvorec(veľkosť);

		farba(f);
	}

	private void pichliač()
	{
		Farba f = farba();
		double hč = hrúbkaČiary();
		double veľkosť = veľkosť() / 3;

		hrúbkaČiary(hč / 2);
		farba(svetločervená);
		if (Hlavná.vypĺňaj) vyplňHviezdu(veľkosť);
		farba(čierna);
		kresliHviezdu(veľkosť);

		hrúbkaČiary(hč);
		farba(f);
	}


	@Override public void kresliTvar()
	{
		int hodnotaFázy = rýchlosť() <= 0 ? 0 : fázaÚst.hodnota();
		double uhol1 = 90 + hodnotaFázy / 2;
		double uhol2 = 360 - hodnotaFázy;
		double posun1 = veľkosť();
		double posun2 = posun1 / 2;
		double posun3 = posun1 * 7 / 11;

		if (uhol() < 90 || uhol() > 270)
		{
			vľavo(uhol1);
			preskočVpravo(posun1);

			double uhol = pichliačov > 7 ? 40 - pichliačov * 2 : 30;
			for (int i = 0; i < pichliačov; ++i)
			{
				skočPoOblúku(uhol);
				pichliač();
			}
		}
		else
		{
			vľavo(uhol1 + uhol2);
			preskočVpravo(posun1);

			double uhol = pichliačov > 7 ? 40 - pichliačov * 2 : 30;
			for (int i = 0; i < pichliačov; ++i)
			{
				skočPoOblúku(-uhol);
				pichliač();
			}
		}

		domov();

		vľavo(uhol1);
		preskočVpravo(posun3);
		zub();
		domov();

		vľavo(uhol1 + uhol2);
		preskočVpravo(posun3);
		zub();
		domov();

		vľavo(uhol1);
		začniCestu();
		preskočVpravo();
		skočPoOblúku(uhol2);
		preskočVľavo();
		if (Hlavná.vypĺňaj) vyplňCestu();
		farba(čierna);
		kresliCestu();
		domov();

		if (uhol() < 90 || uhol() > 270)
			vľavo(uhol1 - 90);
		else
			vpravo(uhol1);
		preskoč(-posun2, posun2);
		if (Hlavná.vypĺňaj) kruh(posun2 / 5);
	}

	@Override public void aktivita()
	{
		if (rýchlosť() > 0)
		{
			fázaÚst.daj();

			if (pichliačov < 15)
			{
				if (interval > 0) --interval;
				else
				{
					++pichliačov;
					interval = 150;
				}
			}
		}
	}

	@Override public void aktivácia() { zobraz(); }
	@Override public void deaktivácia() { skry(); }

	@Override public void stlačenieKlávesu()
	{
		if (aktívny() && rýchlosť() > 0) switch (kláves())
		{
		case HORE:    smer(SEVER);  break;
		case DOLE:    smer(JUH);    break;
		case VĽAVO:   smer(ZÁPAD);  break;
		case VPRAVO:  smer(VÝCHOD); break;
		case MEDZERA: vystreľ();    break;
		case ESCAPE:
			if (časovačAktívny())
				zastavČasovač();
			else
				spustiČasovač();
			break;
		case VK_W:
			Hlavná.vypĺňaj = !Hlavná.vypĺňaj;
			Hlavná.prekresliSteny = true;
			žiadajPrekreslenie();
			break;
		}
	}

	@Override public void stlačenieTlačidlaMyši()
	{
		if (aktívny() && rýchlosť() > 0)
		{
			if (tlačidloMyši(ĽAVÉ))
			{
				if (!myšV()) otočNaMyš();
			}
			else
				vystreľ();
		}
	}

	@Override public void ťahanieMyšou()
	{
		if (aktívny() && rýchlosť() > 0 && !myšV()) otočNaMyš();
	}
}

~

import knižnica.GRobot;
import knižnica.Rad;

public class Pichliač extends GRobot
{
	private final Rad rad = new Rad(0, 360, 60);

	public Pichliač()
	{
		ohranič();
		zdvihniPero();
		otáčajTvar(30, false);
		rýchlosť(10, false);
		farba(svetločervená);
		hrúbkaČiary(1);
		skry();
	}


	@Override public void kresliTvar()
	{
		double uhol1 = 90 + uhol() + rad.hodnota();
		double uhol2 = 90 - uhol() + rad.hodnota();

		if (Hlavná.vypĺňaj)
		{
			uhol(uhol1); vyplňHviezdu();
			uhol(uhol2); vyplňHviezdu();
		}

		farba(čierna);
		uhol(uhol1); kresliHviezdu();
		uhol(uhol2); kresliHviezdu();
	}

	@Override public void aktivita() { rad.daj(); }
	@Override public void aktivácia() { zobraz(); }
	@Override public void deaktivácia() { skry(); }
}

~

import knižnica.GRobot;
import knižnica.Svet;
import static knižnica.Svet.*;

public class Pozadie extends GRobot
{
	public Pozadie()
	{
		skry();
		farbaPozadia(svetlozelená);
		farba(tmavozelená);
		for (int i = 0; i < 10_000; ++i)
		{
			náhodnáPoloha();
			uhol(SEVER);
			if (0 == náhodnéCeléČíslo(0, 1))
				choďPoOblúku(náhodnéReálneČíslo(10, 20),
					náhodnéReálneČíslo(75, 100));
			else
				choďPoOblúku(náhodnéReálneČíslo(10, 20),
					-náhodnéReálneČíslo(75, 100));
		}
		podlaha.zálohujGrafiku();
	}

	public void prekresli()
	{
		if (Hlavná.vypĺňaj)
		{
			farbaPozadia(svetlozelená);
			podlaha.obnovGrafiku();
		}
		else
		{
			farbaPozadia(biela);
			podlaha.vymažGrafiku();
		}
	}
}

~

import knižnica.GRobot;
import knižnica.Poloha;
import knižnica.Rad;
import static knižnica.Svet.*;

public class Príšera extends GRobot
{
	private final double odskoky[] = new double[12];
	private final Poloha body[] = new Poloha[odskoky.length];
	private final Rad zakrivenie = new Rad(-60, 60, 10);
	private final Rad nafúknutie = new Rad(-6, 6, 2);
	private final Rad pootočenie = new Rad(-15, 15, 3);

	// Príznak povolenia určitých aktivít (kreslenia svojho tvaru, posúvania
	// hodnôt radov). Keby sa príšera pokúšala vykonávať niektoré aktivity
	// (napríklad kresliť svoj tvar alebo posúvať hodnoty radov) pred
	// inicializáciou svojich atribútov (ako je pole odskokov, rad pootočenia
	// a pod.), vznikali by vnútorné chyby (zistiteľné napríklad v denníku
	// alebo na konzole v režime ladenia), ktoré by spôsobili uviaznutie
	// aplikácie (hry). Preto je dôležité, aby boli tieto situácie ošetrené.
	private boolean pripravená = false;

	public Príšera()
	{
		ohranič();
		uholOtáčania(360 / odskoky.length);
		farba(svetloružová);
		hrúbkaČiary(3);
		zdvihniPero();
		najväčšiaRýchlosť(4);
		zrýchlenie(1, false);
		obnov();
	}


	public void obnov()
	{
		zakrivenie.zamiešaj();
		nafúknutie.zamiešaj();
		pootočenie.zamiešaj();

		veľkosť(30);
		náhodnáPoloha();
		náhodnýSmer();
		zobraz();
	}

	public void zraň()
	{
		if (veľkosť() > 10)
			veľkosť(veľkosť() - 7);
		else
			skry();
	}


	@Override public void veľkosť(double veľkosť)
	{
		for (int i = 0; i < odskoky.length; ++i)
			odskoky[i] = veľkosť * (0 == i % 2 ?
				náhodnéReálneČíslo(0.8, 1) : náhodnéReálneČíslo(1, 1.2));

		pripravená = true;
		super.veľkosť(veľkosť);
	}

	@Override public void kresliTvar()
	{
		if (pripravená)
		{
			vľavo(pootočenie.hodnota());
			double nafúknutie = this.nafúknutie.hodnota();

			for (int i = 0; i < odskoky.length; ++i)
			{
				double skok = odskoky[i] + nafúknutie;
				skoč(skok);
				body[i] = poloha();
				odskoč(skok);
				vpravo();
			}

			skočNa(body[body.length - 1]);
			double zakrivenie = this.zakrivenie.hodnota();
			začniCestu();

			for (int i = 0; i < body.length; ++i)
			{
				otočNa(body[i]);

				if (0 == i % 2)
					vľavo(zakrivenie);
				else
					vpravo(zakrivenie);

				skočNaPoOblúku(body[i]);
			}

			if (Hlavná.vypĺňaj) vyplňCestu();
			farba(čierna);
			kresliCestu();
		}
	}


	@Override public void aktivita()
	{
		pasivita();
	}

	@Override public void pasivita()
	{
		if (pripravená)
		{
			zakrivenie.daj();
			nafúknutie.daj();
			pootočenie.daj();
			žiadajPrekreslenie();
		}
	}
}

~

import knižnica.Bod;
import knižnica.Farba;
import knižnica.GRobot;
import knižnica.Poloha;
import static knižnica.Svet.*;

public class Stena extends GRobot
{
	private final double[] polohyY = new double[41];

	// Krajné body steny, ktoré pomáhajú pri kĺzaní pažravca popri nej pri
	// jeho kolízii s ňou.
	private Bod ľavýBod, pravýBod;


	public Stena()
	{
		skry();
		veľkosť(40);
		mierka(1);
		zaoblenie(40);
		farba(hnedá);
		hrúbkaČiary(3);
		obnov();
	}


	public void obnov()
	{
		náhodnáPoloha();
		náhodnýSmer();
		náhodnáVeľkosť(2);

		double veľkosť = veľkosť();
		for (int i = 0; i < 41; ++i)
			polohyY[i] = náhodnéReálneČíslo(-2 * veľkosť, veľkosť);

		Poloha poloha = poloha();
		preskočVľavo(veľkosť - 20);
		ľavýBod = poloha();
		skočNa(poloha);
		preskočVpravo(veľkosť - 20);
		pravýBod = poloha();
		skočNa(poloha);

		Hlavná.prekresliSteny = true;
	}

	public Bod ľavýBod() { return ľavýBod; }
	public Bod pravýBod() { return pravýBod; }


	public void nakresli()
	{
		double veľkosť = veľkosť();
		Farba f = farba();
		if (Hlavná.vypĺňaj)
		{
			Poloha poloha = poloha();
			vyplňObdĺžnik(veľkosť, 20);
			kresliDo(vyplňObdĺžnik(veľkosť, 20));
			farba(tmavohnedá);
			vpravo(90);
			for (int i = -20; i < 20; ++i)
			{
				preskoč(i, polohyY[20 + i]);
				dopredu();
				skočNa(poloha);
			}
			vľavo(90);
			kresliVšade();
		}
		farba(čierna);
		kresliObdĺžnik(veľkosť, 20);
		farba(f);
	}

	@Override public boolean koliduje(GRobot r)
	{
		// TODO – vysvetliť príčiny takéhoto „komplikovaného riešenia“…
		// (konštantné zaoblenie by rozšírilo kolíznu oblasť a objekty by
		// sa „zadrhávali“ o „vzduch“ okolo steny – pozri BodVObdĺžniku.java)
		double veľkosť2 = r.veľkosť(); double[] zaoblenie = zaoblenie();
		zaoblenie(zaoblenie[0] + 2 * veľkosť2, zaoblenie[1] + 2 * veľkosť2);
		try { return bodVObdĺžniku(r, veľkosť() + veľkosť2, 20 + veľkosť2); }
		finally { zaoblenie(zaoblenie[0], zaoblenie[1]); }
	}
}