В первой версии была у меня система текстовых меток и подсказок. И хотя результат меня худо-бедно устраивал, наличие большого количества дополнительных объектов и второй оверлейной сцены меня несколько напрягало.Но тогда у меня было стремление любой ценой довести проект хотя бы до промежуточного результат и я не стал искать других путей. А они были, между прочим...
Есть в составе инструментов Блендера весьма полезная функция blf, правда, чтобы ей пользоваться, никак не обойтись без дао обезъяны, а именно - для начала иметь хоть какой-то исходный код, который можносплагиатить, извратить переработать. Такой код с выводом текст а"Хелло Ворлд" в АПИ Блендера имелся.
Однако тут воспоследовали проблемы. Сам текст, понятно, как сформировать, но надо его запихнуть в нужное место экрана, а потом еще и дать ему нужный цвет для удобоваримого чтения. После трехдневной возни с подсказками dron-a, на свет божий явился промежуточный результат. Скрин приводится ниже.
На ИЛС присутствует надпись F-16_цифры. Синего цвета. Это говорит о том, что радар взял на сопровождение F-16C "синих", плюс до него указывается дистанция. В перспективе охота получить возможность маркировать все цели в округе, как свои, так и чужие, плюс иметь возможность отключать или включать это маркирование. Пока вариант весьма сырой, хотя и работающий, поэтому приведу код. Часть первая - скрипт ClassHud с функциями чтения и отсчета экранных координат цели с возможностью вывода положения метки в пределах ИЛС.
import bge
#МЕТКИ ЦЕЛИ НА КОЛЛИМАТОРЕ - ОБЕСПЕЧИВАЕТСЯ ЕЕ ПЛАВНОЕ ПЕРЕМЕЩЕНИЕ ВСЛЕД ЗА ЦЕЛЬЮ
#Чтение экранных координат
def readCoord():
cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()
own = cont.owner
camera = bge.logic.getCurrentScene().active_camera
targetMarka = scene.objects['targetMetka']
#collimatorRight = scene.objects['collRight']
#collimatorLeft = scene.objects['collLeft']
targetLabel = scene.objects['targetMarka']
camera = scene.active_camera
#Метка цели работает только при включенном радаре и выставленной дальности
try:
targetMarka.worldPosition[0] = bge.logic.globalDict['targetCoord'][0] * 20.0
targetMarka.worldPosition[1] = -bge.logic.globalDict['targetCoord'][1] * 11.3
plusX = targetLabel['limX'] #collimatorRight.worldPosition[0]
minusX = -targetLabel['limX'] #collimatorLeft.worldPosition[0]
plusY = targetLabel['limY'] #collimatorRight.worldPosition[2]
minusY = -targetLabel['limY'] #collimatorLeft.worldPosition[2]
targetLabel.worldPosition[0] = targetMarka.worldPosition[0] - 10.0
targetLabel.worldPosition[2] = targetMarka.worldPosition[1] + 5.65
if targetLabel.worldPosition[0] < minusX:
targetLabel.worldPosition[0] = minusX
elif targetLabel.worldPosition[0] > plusX:
targetLabel.worldPosition[0] = plusX
if targetLabel.worldPosition[2] < minusY:
targetLabel.worldPosition[2] = minusY
elif targetLabel.worldPosition[2] > plusY:
targetLabel.worldPosition[2] = plusY
except:
targetLabel.worldPosition = [0.0, 0.0, 0.0]
import RenderText
RenderText.init()
#Передача экранных координат
def writeCoord():
cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()
own = cont.owner
try:
target = scene.objects.from_id(int(own['idTarget']))
camera = scene.active_camera
#if camera.getVectTo(target)[2][2] > 0:
bge.logic.globalDict['targetCoord'] = camera.getScreenPosition(target)
#print(target['unitName'], bge.logic.globalDict['targetCoord'])
winXcoord = bge.render.getWindowWidth(target)*camera.getScreenPosition(target)[0]
winYcoord = bge.render.getWindowHeight(target)*camera.getScreenPosition(target)[1]
infoTarget = target['unitName'] + str(int(own.getDistanceTo(target)/1000))
bge.logic.globalDict['targetPixel'] = [winXcoord, winYcoord, infoTarget]
targetDistance = own.getDistanceTo(target)
targetSpeed = target.localLinearVelocity[1]
targetHeight = target.worldPosition[2]
bge.logic.globalDict['targetData'] = [targetDistance, targetSpeed, targetHeight]
except:
bge.logic.globalDict['targetPixel'] = [0, 0, '']
bge.logic.globalDict['targetCoord'] = [0, 0]
bge.logic.globalDict['targetData'] = [0, 0, 0]
И второй скрипт - тот самый, для отрисовки текста. Изменения коснулись прежде всего вывода самого текста и его положения на экране. Думаю, здесь понятно, откуда берутся данные - из глобального словаря. В тексте присутствуют следы неудачных проб и ошибок в виде неиспользуемых переменных. Скрипт будет подвергаться дальнейшей доработке.
# import game engine modules
from bge import render
from bge import logic
# import stand alone modules
import bgl
import blf
winXcoord = logic.globalDict['targetPixel'][0]
winYcoord = logic.globalDict['targetPixel'][1]
infoText = logic.globalDict['targetPixel'][2]
def init():
logic.font_id = 0 #blf.load(font_path)
scene = logic.getCurrentScene()
scene.post_draw = [write]
#print(logic.globalDict['targetPixel'][2])
def write():
width = render.getWindowWidth()
height = render.getWindowHeight()
bgl.glMatrixMode(bgl.GL_PROJECTION)
bgl.glLoadIdentity()
bgl.gluOrtho2D(0, width, 0, height)
bgl.glMatrixMode(bgl.GL_MODELVIEW)
bgl.glLoadIdentity()
font_id = logic.font_id
blf.position(font_id, logic.globalDict['targetPixel'][0], logic.globalDict['targetPixel'][1], 0)
blf.size(font_id, 25, 36)
bgl.glColor3f(0.0,0.0,1.0)
#bgl.glColor4f
bgl.glDisable(bgl.GL_LIGHTING)
blf.draw(font_id, logic.globalDict['targetPixel'][2])
Есть в составе инструментов Блендера весьма полезная функция blf, правда, чтобы ей пользоваться, никак не обойтись без дао обезъяны, а именно - для начала иметь хоть какой-то исходный код, который можно
Однако тут воспоследовали проблемы. Сам текст, понятно, как сформировать, но надо его запихнуть в нужное место экрана, а потом еще и дать ему нужный цвет для удобоваримого чтения. После трехдневной возни с подсказками dron-a, на свет божий явился промежуточный результат. Скрин приводится ниже.
На ИЛС присутствует надпись F-16_цифры. Синего цвета. Это говорит о том, что радар взял на сопровождение F-16C "синих", плюс до него указывается дистанция. В перспективе охота получить возможность маркировать все цели в округе, как свои, так и чужие, плюс иметь возможность отключать или включать это маркирование. Пока вариант весьма сырой, хотя и работающий, поэтому приведу код. Часть первая - скрипт ClassHud с функциями чтения и отсчета экранных координат цели с возможностью вывода положения метки в пределах ИЛС.
import bge
#МЕТКИ ЦЕЛИ НА КОЛЛИМАТОРЕ - ОБЕСПЕЧИВАЕТСЯ ЕЕ ПЛАВНОЕ ПЕРЕМЕЩЕНИЕ ВСЛЕД ЗА ЦЕЛЬЮ
#Чтение экранных координат
def readCoord():
cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()
own = cont.owner
camera = bge.logic.getCurrentScene().active_camera
targetMarka = scene.objects['targetMetka']
#collimatorRight = scene.objects['collRight']
#collimatorLeft = scene.objects['collLeft']
targetLabel = scene.objects['targetMarka']
camera = scene.active_camera
#Метка цели работает только при включенном радаре и выставленной дальности
try:
targetMarka.worldPosition[0] = bge.logic.globalDict['targetCoord'][0] * 20.0
targetMarka.worldPosition[1] = -bge.logic.globalDict['targetCoord'][1] * 11.3
plusX = targetLabel['limX'] #collimatorRight.worldPosition[0]
minusX = -targetLabel['limX'] #collimatorLeft.worldPosition[0]
plusY = targetLabel['limY'] #collimatorRight.worldPosition[2]
minusY = -targetLabel['limY'] #collimatorLeft.worldPosition[2]
targetLabel.worldPosition[0] = targetMarka.worldPosition[0] - 10.0
targetLabel.worldPosition[2] = targetMarka.worldPosition[1] + 5.65
if targetLabel.worldPosition[0] < minusX:
targetLabel.worldPosition[0] = minusX
elif targetLabel.worldPosition[0] > plusX:
targetLabel.worldPosition[0] = plusX
if targetLabel.worldPosition[2] < minusY:
targetLabel.worldPosition[2] = minusY
elif targetLabel.worldPosition[2] > plusY:
targetLabel.worldPosition[2] = plusY
except:
targetLabel.worldPosition = [0.0, 0.0, 0.0]
import RenderText
RenderText.init()
#Передача экранных координат
def writeCoord():
cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()
own = cont.owner
try:
target = scene.objects.from_id(int(own['idTarget']))
camera = scene.active_camera
#if camera.getVectTo(target)[2][2] > 0:
bge.logic.globalDict['targetCoord'] = camera.getScreenPosition(target)
#print(target['unitName'], bge.logic.globalDict['targetCoord'])
winXcoord = bge.render.getWindowWidth(target)*camera.getScreenPosition(target)[0]
winYcoord = bge.render.getWindowHeight(target)*camera.getScreenPosition(target)[1]
infoTarget = target['unitName'] + str(int(own.getDistanceTo(target)/1000))
bge.logic.globalDict['targetPixel'] = [winXcoord, winYcoord, infoTarget]
targetDistance = own.getDistanceTo(target)
targetSpeed = target.localLinearVelocity[1]
targetHeight = target.worldPosition[2]
bge.logic.globalDict['targetData'] = [targetDistance, targetSpeed, targetHeight]
except:
bge.logic.globalDict['targetPixel'] = [0, 0, '']
bge.logic.globalDict['targetCoord'] = [0, 0]
bge.logic.globalDict['targetData'] = [0, 0, 0]
И второй скрипт - тот самый, для отрисовки текста. Изменения коснулись прежде всего вывода самого текста и его положения на экране. Думаю, здесь понятно, откуда берутся данные - из глобального словаря. В тексте присутствуют следы неудачных проб и ошибок в виде неиспользуемых переменных. Скрипт будет подвергаться дальнейшей доработке.
# import game engine modules
from bge import render
from bge import logic
# import stand alone modules
import bgl
import blf
winXcoord = logic.globalDict['targetPixel'][0]
winYcoord = logic.globalDict['targetPixel'][1]
infoText = logic.globalDict['targetPixel'][2]
def init():
logic.font_id = 0 #blf.load(font_path)
scene = logic.getCurrentScene()
scene.post_draw = [write]
#print(logic.globalDict['targetPixel'][2])
def write():
width = render.getWindowWidth()
height = render.getWindowHeight()
bgl.glMatrixMode(bgl.GL_PROJECTION)
bgl.glLoadIdentity()
bgl.gluOrtho2D(0, width, 0, height)
bgl.glMatrixMode(bgl.GL_MODELVIEW)
bgl.glLoadIdentity()
font_id = logic.font_id
blf.position(font_id, logic.globalDict['targetPixel'][0], logic.globalDict['targetPixel'][1], 0)
blf.size(font_id, 25, 36)
bgl.glColor3f(0.0,0.0,1.0)
#bgl.glColor4f
bgl.glDisable(bgl.GL_LIGHTING)
blf.draw(font_id, logic.globalDict['targetPixel'][2])