СЕМИНАРСКА РАБОТА ПО ВИЗУЕЛНО ПРОГРАМИРАЊЕ ДОКУМЕНТАЦИЈА
Име на проект: Spot the difference
Членови на тимот: Андреј Гаштеовски 111035 Сандра Деловска 111043
Проектот претставува имплементација на познатата игра “Spot the difference” (“Пронајди ја разликата”),
во која играчот добива две навидум идентични слики, кои се разликуваат во неколку ситни детали. Од играчот се бара, брзо и умешно да го искористи своето сетило за вид, со цел во определениот временски период да ги пронајде разликите во двете слики. Темите на сликите во оваа игра можат да бидат најразлични. Во конкретниот проект, на почетокот е понуден избор на четири категории на слики (ФИНКИ, Природа, Животни, Скопје). Секоја категорија опфаќа по 5 пара на слики со соодветна тема. Најголем дел од сликите се симнати од интернет, а криењето на деталите со цел да се направат разлики меѓу две слики е направено од страна на авторите. Откако играчот од почетната форма ќе ја избере категоријата на слики што му се допаѓа, се отвора нова форма, во која по случаен избор се бира и прикажува еден пар на слики од соодветната категорија. Со кликање врз било која од двете слики, играчот се обидува да го погоди местото каде што има разлика. При секој погодок, и на двете слики, се исцртува елипса околу местото каде што има разлика. За секој пар на слики, постојат пет разлики што треба да се пронајдат. Во текот на играта, се прикажува информација за тоа колку разлики има пронајдено, како и времето што му останува да ги најде другите. Доколку играчот не е во можност да ги пронајде сите разлики, има опција „Откажи се“, при што се означуваат сите разлики на сликите. Исто така, постои опција за промена на сликата, така што по случаен избор се бира и се прикажува една од преостанатите слики од истата категорија. Доколку во текот на играта, играчот сака да ја промени категоријата, има опција да се врати на почетната форма за избор на категорија.
Организација на податоците во играта
За чување на податоците поврзани со категоријата, имплементирана е класата Category,
додека податоците за сликите се чуваат во класата ImagePair. Во ImagePair се чува еден пар на слики (две слични слики со ситни разлики), претставени преку два Bitmap објекти, left и right. Исто така, за секој пар на слики се чува листа од точки (Point) кои ги претставуваат позициите каде се наоѓаат разликите на сликите. За секоја разлика, може истата точка да биде искористена и за левата и за десната слика затоа што како координатите на точките се определуваат за секоја PictureBox посебно, така што една иста точка, и на двете слики ќе го покажува истото место. Во оваа класа е имплемениран начин на добивање слика од ресурсите на проектот преку дадена string променлива во која се чува името на сликата, затоа што преку стандардниот начин за пристап до ресурси, мора директно да се напише името на потребниот ресурс. Во конструкторот на оваа класа се прима име на категорија и број од 1 до 5 кој го означува редниот број на сликата од соодветната категорија. Во Bitmap објектите се сместуваат сликите добиени од Resources. Исто така се повикува FillPoint() методот, кој листата со точки ја полни со вредностите кои ги означуваат местата на разликите во соодветниот пар на слики. Во класата ImagePair уште е имплементиран методот isAcquired() кој прима објект од класата Point и проверува дали таа точка е во близина на некоја од точките во листата на парот слики. Овој метод всушност проверува дали играчот при клик на некоја од сликите, има погодено некоја разлика. Се дозволува одредена толеранција, така што клик на оддалеченост од 20px од центарот на местото каде има разлика, се смета за погодок. Доколку играчот погодил разлика, погодената точка се брише од листата, со цел доколку повторно ја погоди истата разлика, да не се смета како нов погодок. Методот ја враќа погодената точка на формата, за околу неа да биде исцртана елипса. Во класата Category се чува податок за името на избраната категорија. Исто така, во оваа класа е имплемениран методот GetNewPair() кој враќа еден пар на слики од оваа категорија, изберени по случаен избор. Се зема во предвид, да не го врати истиот пар на слики при два последователни повици на оваа функција. При инстанцирање на објект од класата Category не се вчитуваат сите слики од оваа категорија, туку само при повик на овој метод, се вчитува еден пар слики по случен избор.
Симулација на една игра
Кога се вклучува играта, се отвора нова форма, на која се прикажани 4 слики кои ги означуваат категориите
со слики (животни, ФИНКИ, природа, Скопје). Со клик на една од сликите, играчот бира одредена категорија. Во останатиот дел од формата се наоѓаат две копчиња, за инструкции и за излез од играта.
При избор на категорија, се инстанцира нов објект од класата Category со соодветно име, за кој е овозможен пристап и од двете форми. Во тој момент се повикува втората форма преку инстанца од првата форма, со што на втората форма и се овозможува приспат до category објектот кој е property на првата форма. Се иницијализираат елементите за изгледот на формата, тајмерот, линијата која го прикажува останатото време и се повикува ShowImages() методот кој добива пар слики од соодветната категорија (повикувајќи го getNewPair() на category) и сликите ги поставува на формата. Во формата се чува објект од ImagePair во кој се сместени двете слики.
При клик на било која од сликите, се проверува дали е постигнат погодок, преку повикување на isAcquired() методор на pair објектот. Доколу е погодена некоја разлика, се повикува TargetAcquired(Point p) методот со референца од точката со која е означена погодената разлика, и се исцртува елипса врз двете слики околу таа точка. Исто така, се зголемува вредноста на лабелата која го означува бројот на погодени разлики.
Со клик на копчето „Next image”, повторно се повикува ShowImages() методот при што се добива нов пар на слики од истата категорија, и повторно се иницијализираат тајмерот и бројот на погодени разлики. Копчето „Give up!“ иницира настан со кој се повикува ShowDifference() методот за сите преостанати точки во листата на pair, така што се црта елипса и се означуваат останатите разлики. Change category повикува затворање на оваа форма и враќање на првата, со што се добива можност за избор на нова категорија. Со Exit се излегува од апликацијата.