[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум Panda3D - по русски » Panda3D » Примеры кода » Карта а-ля Minecraft + прогрессбар
Карта а-ля 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()     
Прикрепления: 7453125.png (88.6 Kb)
 
serg-kkzДата: Понедельник, 18.07.2011, 13:16 | Сообщение # 2
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
А это так и должно быть?

Прикрепления: 2184471.png (403.6 Kb)


ООП  -  
 
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)
А какая разница?

Я вот видел темку, насчет разницы.

Попробуй вот из моёго архива wink . И да, батник и ярлык можно самому создать. Если сделаешь игрушку, то это обязательно нужно делать.
Прикрепления: Loading.rar (102.9 Kb)


ООП  -  
 
DancingOxДата: Понедельник, 06.02.2012, 22:59 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
Во, спасибо! biggrin В твоём батнике указал путь к своему интерпретатору, всё заработало.
Но, во-первых, такая же проблема
Quote (serg-kkz)
На скрине пестрота какая то, а я положил рядом вот эти текстуры 1.png 2.png 3.png

...а во вторых - я окончательно запутался с путями, когда хотел взять модельку кубика и "потереть в ней текстуры".
Модельки-то ни в папке интерпретатора, ни в папке самого скрипта нет.
Откуда тогда получает данные команда:
Code

          models.append(loader.loadModel("box"))

?
#=========================
Заработало, мне просто нужно быть внимательнее. Забыл переименовать файл с картой высот в "hf.png".
Всё хорошо, даже приложенные мной текстурки накладывает. biggrin
#=========================
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 или рядом со скриптом.
Прикрепления: box.egg (1.2 Kb)


ООП  -  
 
serg-kkzДата: Понедельник, 06.02.2012, 23:21 | Сообщение # 15
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (DancingOx)
Как твой скрипт находит модель кубика?

Это не мой скрипт. Ответил уже.


ООП  -  
 
Форум Panda3D - по русски » Panda3D » Примеры кода » Карта а-ля Minecraft + прогрессбар
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: