Актуальность:
На сегодняшний день в мире существует средств для разработки игр. Наш проект использует движок Godotengine и создан для показа его возможностей в подобных играх, а также мы выложим исходный код и фалы, чтобы будущие разработчики на данном движке смогли понять как он устроено и как с ним нужно работать.
Также наша игра имеет малый размер и низкий расход компьютерных ресурсов, что позволяет играть в неё на любом ПК.
Цель проекта: создание игры
Задачи проекта:
1) Собрать и проанализировать информацию о подобных существующих играх;
2) Выбрать программную среду и движок для игры;
3) Разработать структуру, дизайн, идею и удобную навигацию в игре.
МЕТОДЫ:
1) Изучение и анализ литературы и материалов сети Internet;
2) Знакомство с программой и движком для создания игры;
3) Работа в разных средах программирования;
4) Создание графических объектов;
5) Создание и разработка структуры видеоигры;
6) Экспортирование проекта .
7) Загрузить его в библиотеку шаблонов
Инструменты:
Godotengine-игровой движок
Paint3D-инструмент для создания графических элементов
Windows 10-операционная система
Преимущества:
-Низкий размер игрового движка
-Редактор написан на C++ и работает в Windows, Linux, MacOSX;
-Исходный код открыт для доработки и модификации;
-Не нужны дополнительные программы (отдельный редактор карт и т.д.);
-Работает даже на весьма слабых компьютерах;
-Есть визуальный редактор, редактор анимации, тайлы и т.д.;
-Встроены скрипты, язык свой, но синтаксис от Python (куда проще C#, Java, C++);
-Экспортировать проект можно практически на любую платформу (кроме консолей).
Игровой движок:
Godotengine, пожалуй лучший инструмент для создания 2D игр и простеньких 3D. Данный инструмент также имеет русскоязычные источники обучения и полностью бесплатную модель распространения, чем и обусловлен его выбор.
Его задача быть максимально интегрированной и самостоятельной средой для разработки игр.
Основная часть
Для создания нашей игры мы использовали движок Godotengine, т.к. в отличие от других решений он имеет ряд преимуществ:
-Размер инструмента
-Простота освоения
-Возможность модификации пользователями
-Оптимизация почти под любые ПК
-Присутствие большинства инструментов непосредственно внутри движка
Задача Godot — быть максимально интегрированной и самодостаточной средой для разработки игр. Среда позволяет разработчикам создавать игры с нуля, не пользуясь более никакими инструментами, за исключением тех, которые необходимы для создания игрового контента (элементы графики, музыкальные треки и т. д.). Процесс программирования также не требует внешних инструментов (хотя при необходимости использовать внешний редактор это можно сделать относительно легко).
Также, пожалуй, наилучшим решением для создания пискелизированных текстур является Paint 3D - улучшенная версия старого paint с существенными доработками. Она позволяет создавать текстуры в любом разрешении, используя современные инструменты и возможности,
Результаты.
Изучив движок и проработав концепцию игры мы начали её создание. За основу геймплея была взята концепция “олдскульных” платформеров, а также некоторые идеи нашего коллектива.
Игрок:
Переменные в коде, отвечающие за физику игрока, его скорость, анимации и взаимодействие:
extends KinematicBody2D const GRAVITY_VEC = Vector2(0, 900) const FLOOR_NORMAL = Vector2(0, -1) const WALK_SPEED = 80 const STATE_WALKING = 0 const STATE_KILLED = 1 var linear_velocity = Vector2() var direction = -1 var anim="" var slime_p = false var state = STATE_WALKING onready var detect_floor_left = $detect_floor_left onready var detect_wall_left = $detect_wall_left onready var detect_floor_right = $detect_floor_right onready var detect_wall_right = $detect_wall_right onready var sprite = $sprite func _physics_process(delta): var new_anim = "idle" if state==STATE_WALKING: linear_velocity += GRAVITY_VEC * delta linear_velocity.x = direction * WALK_SPEED linear_velocity = move_and_slide(linear_velocity, FLOOR_NORMAL) if not detect_floor_left.is_colliding() or detect_wall_left.is_colliding(): direction = 1.0 linear_velocity.x = WALK_SPEED * delta if not detect_floor_right.is_colliding() or detect_wall_right.is_colliding(): direction = -1.0 linear_velocity.x = -WALK_SPEED * delta sprite.scale = Vector2(direction, 1.0) new_anim = "walk" # else: # new_anim = "explode" if anim != new_anim: anim = new_anim $anim.play(anim) #Bullet func kill(): queue_free() extends KinematicBody2D const GRAVITY_VEC = Vector2(0, 900) const FLOOR_NORMAL = Vector2(0, -1) const SLOPE_SLIDE_STOP = 25.0 const SIDING_CHANGE_SPEED = 10 const BULLET_VELOCITY = 1000 const SHOOT_TIME_SHOW_WEAPON = 0.2 export var WALK_SPEED = 250 # pixels/sec export var MIN_ONAIR_TIME = 0.2 export var JUMP_SPEED = 400 var vec = Vector2(-1, 0) var linear_vel = Vector2() var onair_time = 0 # var on_floor = false var shoot_time = 99999 #time since last shot var anim = "" var walk_p = false var Bullet = preload ("res://scenes/Bullet.tscn") #cache the sprite here for fast access (we will set scale to flip it often) onready var sprite = $sprite onready var tm = 0 onready var Global = get_node("/root/Global") func _physics_process(delta): #increment counters onair_time += delta shoot_time += delta |
### ANIMATION ### var new_anim = "stand" if on_floor: if linear_vel.x < -SIDING_CHANGE_SPEED: sprite.scale.x = -1 new_anim = "move" if linear_vel.x > SIDING_CHANGE_SPEED: sprite.scale.x = 1 new_anim = "move" else: # We want the character to immediately change facing side when the player # tries to change direction, during air control. # This allows for example the player to shoot quickly left then right. if Input.is_action_pressed("ui_left") and not Input.is_action_pressed("ui_right"): sprite.scale.x = -1 if Input.is_action_pressed("ui_right") and not Input.is_action_pressed("ui_left"): sprite.scale.x = 1 if linear_vel.y < 0: new_anim = "jump" else: new_anim = "fall" # if shoot_time < SHOOT_TIME_SHOW_WEAPON: # new_anim += "_weapon" if new_anim != anim: anim = new_anim $anim.play(anim) #Death&Teleport var cnt = get_slide_count() - 1 if cnt >= 0: var col = get_slide_collision(cnt) if col && col.collider.has_method('kill'): queue_free() Global.coins = 0 get_tree().reload_current_scene() if col && col.collider.has_method('teleport'): get_tree().change_scene("res://scenes/Main menu.tscn") extends RigidBody2D var tm = 0 func _physics_process(delta): tm += delta if tm >= 1: queue_free() func _on_Bullet_body_entered(body): tm = 1 if body.has_method('kill'): body.call('kill') extends Area2D var taken = false var player = preload("res://scripts/Player.gd") var coin = 0 onready var Global = get_node("/root/Global") func _on_Chest_body_entered(body): if not taken && body is player && coin == 0: $chest/anim.play("open") $audio.play() taken = true coin += 1 Global.coins += 1 if not taken && body is player && coin > 0: $chest/anim.play("open_no_coin") $audio.play() taken = true func _on_Chest_body_exited(body): if taken && body is player: $chest/anim.play("close") $audio.stop() taken = false |
Выводы.
Конечной целью нашего проекта было создание шаблона игры, для распространения в библиотеках godotengine, чтобы упростить его изучение новичками. Процесс создания данной игры помог нам лучше разобраться в данном движке. Также мы смогли улучшить свои познания в программировании и смогли написать сложные скрипты для создания комфортного геймплея.
Списокиспользованныхисточников.
1) Ariel Manzur, George Marques, Godot Engine Game Development in 24 Hours, Sams Teach Yourself: The Official Guide to Godot 3.0 /Ariel Manzur, George Marques//: Sams Publishing , 2018г-С. 99998
2)Бьерн Страуструп, Программирование. Принципы и практика с использованием C++ / Бьерн Страуструп// , 2015 -: С.: 1328
3) Крис Брэдфилд, Godot Engine Game Development Projects: Build five cross-platform 2D and 3D games with Godot 3.0/ Крис Брэдфилд// E:-Packt Publishing, 2018г – С. 298
4) Jason Gregory, Game Engine Architecture, Third Edition/ Jason Gregory // A K Peters/CRC Press, 2018г,- С. 1235
5) Colleen Macklin and John Sharp, Games, Design and Play/ Colleen Macklin and John Sharp// Addison-Wesley Professional, 2016г- С. 288
6) GitHub, GodotEngine - многоплатформенный 2D и 3D игровой движок/ GitHub// платформа кодов- URL: https://github.com/godotengine/godot( дата обращения: 21.01.2019).
7) SKANERSOFT, SKANERSOFT-Делать игры? Вот так!/ SKANERSOFT// платформа видео- URL: https://www.youtube.com/user/SkanerSoft (дата обращения: 19.12.2018г)