Карта а-ля Minecraft + прогрессбар
|
|
ninth | Дата: Понедельник, 18.07.2011, 11:43 | Сообщение # 1 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Загрузка довольно продолжительна, поэтому в качестве бонуса идёт демонстрация работы пандовского прогрессбара. К коду нужно положить текстурки с именем 1.png 2.png 3.png, которые будуи накладываться на кубики в зависимости от высоты и прикреплённую карту высот с именем hf.png Code #-*- encoding: utf_8 -*- from pandac.PandaModules import * loadPrcFileData("editor-startup", "show-frame-rate-meter #t") loadPrcFileData("", "win-size 1024 768") from direct.directbase import DirectStart
from random import random import time
from direct.gui.OnscreenText import OnscreenText from direct.gui.DirectGui import *
class LoaderFrame(): """ Класс для отображения загрузки """ def __init__(self): bk_text = "..." self.frame = DirectFrame(frameSize=(-1*base.getAspectRatio(), 1*base.getAspectRatio(), -1, 1)) self.textObject = OnscreenText(text = bk_text, pos = (0, -0.02), scale = 0.07,fg=(0,0,1,1), align=TextNode.ACenter, mayChange=1) self.bar = DirectWaitBar(text = "", value = 0, pos = (0,.4,.4), range = 100, frameColor = (1,1,1,1)) self.textObject.reparentTo(self.bar)
def progress(self, arg): self.bar['value'] = arg text = 'Progress is: %i' % arg self.textObject.setText(text) base.graphicsEngine.renderFrame() def hide(self): self.textObject.hide() self.frame.hide() self.bar.hide() #---------------------- Основной тест --------------------- start = time.time() models = [] for i in xrange(3): models.append(loader.loadModel("box")) tex = loader.loadTexture('%i.png' % (i+1)) tex.setMagfilter(Texture.FTLinearMipmapLinear) tex.setMinfilter(Texture.FTLinearMipmapLinear) models[i].setTexture(tex)
hf = PNMImage() hf.read('hf.png') hfx = hf.getReadXSize() hfy = hf.getReadYSize() bx, by = 5, 5 # кол-во RBC X на Y bs = 40 # сторона одного RBC в кубиках ) lf = LoaderFrame() lf.progress(0) for rx in xrange(bx): for ry in xrange(by): #print '%i/%i RBC of %i/%i' % (rx, ry, bx - 1, by - 1) lf.progress(int((rx * by + ry + 1) * (100/(bx*by)))) rbc = RigidBodyCombiner('rbc_%i_%i' % (rx, ry)) rbcnp = NodePath(rbc) rbcnp.reparentTo(render) for x in xrange(bs): for y in xrange(bs): px = x + rx*bs py = y + ry*bs pz = int(hf.getGray(int((hfx/((bx+1)*bs))*px), int((hfy/((by+1)*bs))*py)) * 10) if pz < 2: f = models[2].copyTo(rbcnp) elif pz < 9: f = models[1].copyTo(rbcnp) else: f = models[0].copyTo(rbcnp) f.setPos(px, py, pz) rbcnp.flattenLight() rbc.collect() f.detachNode()
lf.hide()
dlight = DirectionalLight('dlight') dlight.setColor(VBase4(0.8, 0.8, 0.5, 1)) dlnp = render.attachNewNode(dlight) dlnp.setHpr(0, -60, 0) render.setLight(dlnp)
colour = (0.5,0.8,0.8) linfog = Fog("A linear-mode Fog node") linfog.setColor(*colour) linfog.setLinearRange(0,320) linfog.setLinearFallback(0,500,550) fn = base.camera.attachNewNode(linfog) fn.setY(250) render.setFog(linfog) base.setBackgroundColor(*colour)
render.analyze()
print 'Load at %.2f sec' % (time.time() - start)
run()
|
|
| |
serg-kkz | Дата: Понедельник, 18.07.2011, 13:16 | Сообщение # 2 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| А это так и должно быть?
ООП -
|
|
| |
ninth | Дата: Понедельник, 18.07.2011, 15:46 | Сообщение # 3 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| что "это" имеется ввиду?
|
|
| |
serg-kkz | Дата: Понедельник, 18.07.2011, 15:52 | Сообщение # 4 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| На скрине пестрота какая то, а я положил рядом вот эти текстуры 1.png 2.png 3.png
ООП -
|
|
| |
ninth | Дата: Понедельник, 18.07.2011, 16:07 | Сообщение # 5 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Хм. На скрине встроенная в кубик дефолтная текстура. Почему-то он не увидел твои текстури или не применил их. В консоли ничего нет?
|
|
| |
serg-kkz | Дата: Понедельник, 18.07.2011, 16:36 | Сообщение # 6 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Нет, кроме инфы о сцене. Правда я перегнал их 24 бита, проверю может и за этого.
ООП -
|
|
| |
serg-kkz | Дата: Понедельник, 18.07.2011, 16:41 | Сообщение # 7 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Да нет, так же. Может где пробел чё натворил?
ООП -
|
|
| |
serg-kkz | Дата: Понедельник, 18.07.2011, 17:13 | Сообщение # 8 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Потер текстурку в модели кубика, и отобразились видимо приоритет те тот.
ООП -
|
|
| |
DancingOx | Дата: Понедельник, 06.02.2012, 18:26 | Сообщение # 9 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Попробовал запустить этот пример. Появляется окно с прогрессбаром 0%, и через пару секунд в консоли появлется сообщение: Code Assertion failed: x >= 0 && x < _x_size && y >= 0 && y < _y_size at line 301 of c:\buildslave\release_sdk_win32\build\panda3d\panda\src\pnmimage\pnmImage.I а винда мне сообщает, что работа python.exe прекращена.
Пробовал оборачивать поочерёдно все команды в коде конструкцией Code try: ... except: print "An error occured." Не помогло, будто проблемы и вовсе нет. Никакого трейсбека в консоли тоже нет, поэтому проследить происхождение ошибки не удаётся. Видимо, она возникает при работе сишного кода в pnmImage.I, и поэтому питон о ней ничего не знает. Папки с:\buildslave я тоже не обнаружил, видимо, она временная. Три .png-файла с текстурами 512x512, карта высот и модель куба находятся в той же папке, что и сам скрипт. Помогите справиться с ошибкой.
Сообщение отредактировал DancingOx - Понедельник, 06.02.2012, 18:27 |
|
| |
serg-kkz | Дата: Понедельник, 06.02.2012, 19:17 | Сообщение # 10 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Надеюсь запускал напрямую? т.е. через ярлык или батник.
ООП -
|
|
| |
DancingOx | Дата: Понедельник, 06.02.2012, 21:57 | Сообщение # 11 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| serg-kkz, по-разному запускал: и в редакторе, и напрямую, и через коммандную строку. А какая разница? А ярлыка и батника у меня вообще нет, - этож пример не из стандартных пандовских.
|
|
| |
serg-kkz | Дата: Понедельник, 06.02.2012, 22:34 | Сообщение # 12 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (DancingOx) А какая разница? Я вот видел темку, насчет разницы.
Попробуй вот из моёго архива . И да, батник и ярлык можно самому создать. Если сделаешь игрушку, то это обязательно нужно делать.
ООП -
|
|
| |
DancingOx | Дата: Понедельник, 06.02.2012, 22:59 | Сообщение # 13 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Во, спасибо! В твоём батнике указал путь к своему интерпретатору, всё заработало. Но, во-первых, такая же проблема Quote (serg-kkz) На скрине пестрота какая то, а я положил рядом вот эти текстуры 1.png 2.png 3.png ...а во вторых - я окончательно запутался с путями, когда хотел взять модельку кубика и "потереть в ней текстуры". Модельки-то ни в папке интерпретатора, ни в папке самого скрипта нет. Откуда тогда получает данные команда: Code models.append(loader.loadModel("box")) ? #========================= Заработало, мне просто нужно быть внимательнее. Забыл переименовать файл с картой высот в "hf.png". Всё хорошо, даже приложенные мной текстурки накладывает. #========================= P.S. Однако, вопрос про пути остаётся в силе. Как твой скрипт находит модель кубика?
Сообщение отредактировал DancingOx - Понедельник, 06.02.2012, 23:18 |
|
| |
serg-kkz | Дата: Понедельник, 06.02.2012, 23:19 | Сообщение # 14 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Вообщем так, у панды есть файл конфигурации, который ты найдешь в папке etc под названием Config.prc в нем прописаны пути поиска моделей. Вот строчка:
Quote model-path $MAIN_DIR model-path $THIS_PRC_DIR/.. model-path $THIS_PRC_DIR/../models
Тоесть где искать модели. Думаю понятно что кубик находится в папке models в корне папки с пандой. Это модели поставляемые с пандой.
Модель кубика прикрепил на всякий случай без текстур. Положи в папку models или рядом со скриптом.
ООП -
|
|
| |
serg-kkz | Дата: Понедельник, 06.02.2012, 23:21 | Сообщение # 15 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (DancingOx) Как твой скрипт находит модель кубика? Это не мой скрипт. Ответил уже.
ООП -
|
|
| |