Превъртащ свят на играта
Авторът на блога Hi3 обясни доста ясно принципа на преместване на картата. Но, честно казано, аз лично не харесвам този подход. Смятам, че не е универсален, тъй като поради този подход могат да възникнат различни трудности в бъдеще. Затова ще говоря за малко по-различен подход.
Като начало, нека да разберем какво е превъртането на картата. Всъщност във всяка игра, където нивото на играта надхвърля екрана на играта, е необходимо внедряването на превъртане на картата. И по-често искате картата да се движи в обратна посока от героя, когато той се движи. Тоест сякаш камерата следва героя.
Тъй като във Flash няма камери, ще трябва да преместим целия свят на играта. Тоест в действителност се оказва, че гледаме през прозорец към определен свят и когато героят избяга от погледа, трябва да преместим целия свят, така че героят отново да попадне в зрителното поле на нашия прозорец - „камера“.
По този начин всичко се свежда до факта, че целият свят на играта трябва да бъде един голям обект - по този начин ще бъде по-лесно да го преместите и в същото време светът дори няма да подозира, че се мести. Всички игрови обекти живеят вътре в картата и тяхната позиция се определя в съответствие с нейните вътрешни координати, което намалява появата на различни неудобства до минимум.
Нека започнем примера с просто движение на картата на играта. Внедряваме два прости метода за класа карта на играта, чрез който ще се стартира превъртането на картата.
Тук всичко е съвсем просто_speedX и_speedY са локални променливи на картата на играта с текущата скорост на движение. Сега трябва да внедрим метод за движение на картата, който ще я премести.
Добавяме скоростта на движение към позицията на картата и след това забавяме скоростта, така че след като извикването на методитеhScroll() илиvScroll() спре, картата продължава да се движи с енергия за известно време.
Използването на превъртане изглежда така:
Резултатът изглежда така:
Щракнете върху мрежата и използвайте клавишите със стрелки, за да преместите картата.
Как да спрете превъртането, когато видимата област излиза извън картата?
Обикновено в игрите „камерата“ няма право да напуска картата - това не само помага на играча да разбере, че е достигнал границата на нивото и няма нищо по-нататък, но също така позволява на разработчика да не се занимава с детайлизиране на ненужни части от нивото. Ограниченията за движение по картата се правят доста лесно. Необходимо е само да проверите позицията на игралната карта и да не й позволявате да излиза извън установените граници. За да направим това, трябва да знаем размерите на игралната карта и размерите на прозореца. Методът за движение по картата е преработен, както следва:
_mapWidth — ширина на картата на играта;_mapHeight — височина на картата на играта;SCR_WIDTH — ширина на екрана на играта;SCR_HEIGHT - височина на екрана на играта.
Сега резултатът изглежда така:
Щракнете върху мрежата и използвайте клавишите със стрелки, за да преместите картата.
Как да накараш камерата да следва героя?
Внедрихме движението на картата с ограничения за движение и сега най-интересното е внедряването на следната "камера" зад героя.
Не знам за вас, но мен лично ме дразни, когато игрите прилагат мъртва камера, обвързваща се с герой. Обикновено изглежда така: героят бяга и целият свят също се движи в този момент. Предпочитам да внедря по-прощаващо превъртане. Това се изразява в това, че когато характерът не есе опитва да напусне екрана и остава в полезрението, камерата не го следва и по този начин не изморява играча с ненужни движения. Може би някои не се досещат, но такава камера е много лесна за изпълнение. Просто трябва да добавите условни граници на екрана на играта и когато героят ги пресече, активирайте превъртане в желаната посока.
Наблюдаваният обект се опитва да излезе извън обхвата, не го пропускайте! :)
Проверката на пресичанията с граници трябва да се извърши директно в кода на движение на обекта, който камерата трябва да следва, и ако той излезе извън зададените граници, извикайте картографските методиhScroll() илиvScroll(). Добавих обект като пример, който постоянно се движи и отскача от границите на картата. Начинът, по който се движи изглежда така:
Проверката дали даден обект е извън границите се премества в отделен методupdMapPos(). Изглежда така:
Принципът на работа е прост. Единственият индикатор за превъртане на картата са нейните координати и те винаги са отрицателни. Познавайки координатите на картата, можем да намерим текущата позиция на екрана върху нея и да изчислим границите, през които обектът позволява превъртане. Променливата_border съдържа размера на рамката.
Сега примерът изглежда така:
Топката винаги е в полезрението. Можете също да опитате да преместите картата с клавишите със стрелки.
Това е цялата основа за превъртане на самата карта, като променяте размера на границите, скоростта на превъртане и забавяте движението на картата, можете да персонализирате превъртането за почти всяка задача.
Между другото, ако замените летящия обект от примера с курсора на мишката, ще получите скролиране с мишката, както в повечето съвременни стратегии.
За тези, които искат да копаят по-дълбоко и да се справят с изходния код на примера, предлагам задачи:скролиране с мишката или управление на летяща топка от клавиатурата.