Главная » Статьи » Деццкий сад

Делаем игру вместе. Урок №1.
Первая статья из цикла "делаем игру вместе". Делать мы будем ни что иное как мега РПГ всех времён и народов smile Ведь именно этого желают почти все начинающие геймдевелоперы, за исключением тех, конечно, кто делает GTA smile

Для начала создадим структуру папок для нашей мегаРПГ
megarpg (корневая папка)
+modules (папка для созданных нами программных модулей)
+res (папка с ресурсами игры)
++textures (текстуры)
++actors (анимированные персонажи)
++geometry (обычная геометрия)
++sound (звуки)

Теперь создадим (пока пустые) файлы скриптов:
в корневой папке: main.py
в папке modules:
__init__.py - этот файл информирует питон о том, что папка, в которой он находится является модулем, из которого можно экспортировать нужные нам классы и функции
location.py - здесь у нас будут скрипты для работы с локацией
control.py - здесь - скрипты управления - камера, мышь

Пока хватит, приступим к коду. (Если ещё не запаслись подходящим редактором для питона, то сначала изучаем статью Быстрый старт)

Открываем файл location.py и пишем

Code

# -*- coding: utf_8 -*-

Это сообщит интерпретатору, что кодировка у нас будет utf-8. Она необходима для нормальной работы с кириллическими символами.
Для земли в нашей локации мы будем использовать карту высот и класс GeoMipTerrain. Для этого импортируем нужный нам класс

Code

from pandac.PandaModules import GeoMipTerrain

Теперь создадим класс gameLocation и процедуру его инициализации

Code

class gameLocation():
    def __init__(self):
        self.terrain=GeoMipTerrain("Terrain")

процедура __init__ всегда выплняется при создании нового экземпляра класса - это стандарт языка python, впрочем, об этом лучше почитать в любом учебнике по python-у. Так же как и о базовом синтаксисе. Поэтому будем считать, что хотя бы основы питона вы уже знаете (учебников и статей по питону в сети хватает).
В процедуре у нас пока одна строчка, которая создаёт новый экземпляр GeoMipTerrain с именем "Terrain"
Добавим к нашему классу новую процедуру loadTerrain для построения нашей земли на основе карты высот. В качестве второго (первым идёт обязательный self) параметра будем передавать имя файла, содержащего карту высот. Для тех, кто не в курсе - карта высот - обычно, файл, содержащий чёрно-белое изображение - чем темнее цвет, тем ниже уровень земли и наоборот. У меня карта высот - это файлик, созданный с помощью Different Clouds (Разностные облака) в гимпе. Аналогичный фильтр есть и в фотошопе, если кому-то удобнее он.

Code

    def loadTerrain(self,hfFile):
        self.terrain.setHeightfield(Filename(hfFile))
        self.terrain.setBlockSize(32)
        self.terrain.setFactor(64)
        self.terrain.setMinLevel(2)
        self.terrain.getRoot().reparentTo(render)
        self.terrain.getRoot( ).setSz (30)
        self.terrain.generate()
        self.terrain.setFocalPoint(base.camera)

Первая строка - объявление нашей процедуры в дальнейшем я этого пояснять не буду и первой строкой буду считать уже непосредственно код, поэтому первая строка - self.terrain.setHeightfield(Filename(hfFile))
Этой строкой мы назначаем карту высот, которая будет передана в параметре hfFile созданному нами при инициализации террайну. Обратите внимание - мы используем Filename для чего, как и зачем - читать здесь. Ну и конечно нужно его импортировать - строка импотра теперь выглядит так

Code

from pandac.PandaModules import GeoMipTerrain, Filename

Вторая строка - размер блока на основе которого будет строиться сетка - в нашем случае - 32 пикселя - т.е. изображение будет разбито на блоки 32х32 пикселя и на основе этого будет построена сетка.
Третья строка - качество создаваемой сетки вблизи камеры. Забыл сказать сразу - GeoMipTerrain умеет динамически генерировать сетку в зависимости от расстояния до камеры - чем ближе камера, тем больше полигонов в сетке. Вот, качество этой сетки мы и устанавливаем третьей строкой
Четвёртая строка - уровень минимальной детализации. По дефолту он 0 - максимальное качество, однако, мы его несколько снизим. Вообще говоря, эти параметры подбираются экспериментальным путём в зависимости от расстояния камеры до нашего террайна, разрешения карты высот, желаемого качества.
Пятая строка - присоединяем нашу землю к корневому узлу сцены чтоб она была видна. почитать1 почитать2
Шестая - устанавливаем масштабирование по оси Z - вертикальной для придания видимости рельефу, т.к. изначально рельеф минимален.
Седьмая - генерируем террайн на основе уcтановленных нами параметров
Восьмая - назначаем узел, который будет считаться камерой для нашей земли и на основе положения которого будет рассчитываться уровень детализации.
С генерацией пока закончили.
Теперь нужно добавить задачу обновления нашего террайна при изменении положения камеры.
Пишем процедуру для нашей задачи - всё в том же классе

Code

    def update(self,task):
        self.terrain.update()
        #self.terrain.getRoot().setRenderModeWireframe()
        return task.cont  

тут всё просто - первая строчка обновляет террайн, вторая закомментирована - если её раскомментировать, то мы будем видеть сетку (Wireframe) террайна - это если интересно посмотреть как наш террайн генерируется.
По поводу формы записи процедур для пандовского менеджера задач читать здесь
Ну и добавим написанную процедуру в менеджер задач - для этого вернёмся к процедуре __init__ и допишем строку

Code

taskMgr.add(self.update,'location_update')

taskMgr является глобальной переменной менеджера задач, которая создаётся при использовании DirectStart, так же как и некоторые другие базовые объекты, например, корневые узлы или камера. Мы конечно можем это всё создавать сами, но проще использовать готовый DirectStart.

Переходим к главному файлу main.py
Пишем следующее:

Code

# -*- coding: utf_8 -*-
import direct.directbase.DirectStart
from modules.location import gameLocation

loc=gameLocation()
loc.loadTerrain('res/textures/heightfield.png')

run()

Певая строка - понятно, уже пояснял.
Вторая - Импортируем DirectStart о котором я только что говорил.
Третья - Импортируем созданный нами модуль локации
Четыре - создаём экземпляр нашей локации и присваиваем её переменной loc
Пять - генерируем террайн - процедурой, которую мы только что с вами написали в модуле location.py. Естественно, карту высот нужно предварительно кинуть в res/textures
Шесть - "Мотор!"

Можно запускать, в итоге мы узреем серый экран с непонятной белой фигнёй

Если покрутить её при помощи зажатой средней клавиши мыши, то станет ясно, что это всё же какая-то поверхность.

Попробуйте повторить. Вот мой heightfield.

P.S. Вопросы и обсуждение лучше вести в соответствующей ветке форума.

Категория: Деццкий сад | Добавил: ninth (06.05.2009)
Просмотров: 17456 | Комментарии: 26 | Рейтинг: 4.0/7
Всего комментариев: 261 2 »
1 Stas-Malkov  
0
(all display modules loaded.)
Traceback (most recent call last):
File "main.py", line 3, in <module>
from modules.location import gameLocation
ImportError: No module named modules.location
Выдаёт ошибку =(

2 ninth  
0
Если файл location.py существует в папке modules, но он всё равно ругается - проверь там же должен лежать пустой файл __init__.py

3 pihto  
0
location.py в 11 строчке пробел self.ter rain.setFactor(64)

4 ninth  
0
это глюки местного bb code - он периодически пробелы в код втыкает.

5 Nedrovai  
1
цитата ninth "в папке modules, но он всё равно ругается - проверь там же должен лежать пустой файл __init__.py"
Stas-Malkov сам мучался целый вечер))) проснулся присмотрелся и вуаля, собака зарыта в имени файла __init__.py. у меня он записан был _init_.py. тоесть не две "__" (незнаю как назвать _ _ эти подчерки) а одна "_"

вывод.

максимум внимательности!

6 injbon  
0
Помогите, только учусь, - мне не понятно в каких файлах, что писать, пробывал разные варианты но всегда ошибка
ImportError: No module named modules.location
Помогите, что делаю не так?

7 serg-kkz  
0
injbon Это сообщение о том что не найден модуль(файл) 'location' в папке 'modules' проверте есть ли он в ней, так же проверьте наличие в ней файла '__init__.py' он пустой, если нет то скопируйте название отсюда(без ковычек) и создайте txt файл и вставьте в название. Ещё один момент, у кого винда. В любом окне, Сервис->Cвойства папки->Вид, убрать галочку, Скрывать расширения для зарегистрированных типов файлов. У этого урока есть тема на форуме, просить о помощи здесь. ДеЦЦкий сад "ПандЁнок"

8 injbon  
0
спасибо

9 3BiP  
0
У мя ошибочка...
:grutil(error): No valid heightfield image has been set!

Вроде все прально сделано, и картинка пральная... Подскажите в чем можт быть проблемка....
Ответ: Ответил на форуме.

10 Assasin145  
0
А как запускать файл? Надо создать ипольняемый exe файл? МОжете перед каждым кодом написать, где его писать? а то я новичок, разобраться не могу...

11 ninth  
0
python - интерпретируемый язык, Exe'шник создавать не требуется.
Загляни в эту статью http://panda3d.org.ru/publ/2-1-0-2

12 Vibrissa  
0
перепробовала всё, скачивала всё подряд, пробовала открыть написанное. eclipse сопротивляется, пишет "unable to find an Ant file to run", как это исправить хз. SPE вообще не открывается ни одна из скаченных версий.
как это вообще открыть? я посмотреть хочу что у меня получилось и получилось ли вообще

13 serg-kkz  
1
А может начать с базовых основ. Я как понял вам не понятно как и запустить панду-то. Вообщем начав с простого у вас сформируется четкое преставление о том как пользоваться движком.

14 Vibrissa  
0
панду я тоже скачала и установила, но не нашла ничего что можно было бы открыть о_О через командную строку, как я где то читала, открыть не получилось, чёрное окошко появляется и сразу исчезает
объясните как это делается или хотя бы ссыль киньте

15 serg-kkz  
1
Можно и не через командную строку. Создай обычный текстовый файл c именем например: start и напиши в нем код создания пандовского окна. И конечно переименуй его расширение с txt на py этот файл и будем запускать.

Вот код
Code
import direct.directbase.DirectStart
run()


А вместо командной строки, создай опять-таки простой текстовый файл рядом(в одной папке с кодом) и напиши в нем так:

C:\Panda3D-1.7.2\python\python.exe start.py
pause

где указывается питон в панде, и имя файла.

этому файлу задай имя(имена всегда при работе с пандой задавай латиницей) и смени расширение на bat

pause - чтоб консоль не закрывалась, полезно при ошибках.

ну и кликни по файлу с расширением bat.

16 Vibrissa  
0
спасибо, всё получилось))
но когда я таким же способом попыталась открыть то что я сделала по этому уроку, у меня вот что вылезло http://savepic.su/2709602.png перепроверила с уроком, ошибок вроде бы и нет.. или я что то неправильно вписала? может быть вам переслать сами файлы, посмотрите в чём дело (потому что вставлять тут коды как у вас тут я не умею)

17 serg-kkz  
0
Для дальнейшего разбирательства с этой проблемой приглашаю вас на форум, ДеЦЦкий сад "ПандЁнок" . Судя по скрину проблема с отступами. Ознакомиться bb кодами можно здесь Лучше прислать файлы.

1-10 11-15
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0