- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一些很久以前从互联网上下载的代码,我想玩一下。
所以我提取了有趣的部分,创建了一个代理 d3d9.dll 并连接到一个游戏。
现在我有一个问题,因为我无法在这两个代码片段之间的绘图中找到差异,这决定了顶点是否必须在屏幕上或在游戏场景中绘制
(我的意思是,就像 - HUD 在屏幕上,您总是能看到它,而车辆在游戏场景中,当您转身时却看不到它)。
第一段是我要编辑的代码,我想让它在游戏场景中显示文本,而不是在屏幕上作为静态文本显示。
DLL中使用的代码是这样的:
float m_fTexCoords[224][4];
float CD3DFont::DrawLength ( const char *szText ) const
{
float len = 0.0f;
float sub = ( m_dwCreateFlags & FCR_BORDER ) ? 2.0f : 0.0f;
for ( const char *p = szText; *p; p++ )
{
int c = *(unsigned char *)p - 32;
if ( c >= 0 && c < 224 )
len += ( (m_fTexCoords[c][2] - m_fTexCoords[c][0]) * m_texWidth - sub ) - m_chrSpacing * 2;
}
return len;
}
HRESULT CD3DFont::Print ( float x, float y, DWORD color, const char *szText)
{
if ( !m_isReady )
return E_FAIL;
float strWidth = DrawLength( szText );
x -= (float)m_chrSpacing;
if ( FAILED(this->BeginRender()) )
return E_FAIL;
DWORD fvf;
m_pD3Ddev->GetFVF( &fvf );
m_pD3Ddev->SetFVF( D3DFVF_BITMAPFONT );
m_pD3Ddev->SetTexture( 0, m_pD3Dtex );
m_pD3Ddev->SetStreamSource( 0, m_pD3Dbuf, 0, sizeof(d3dvertex_s) );
while ( *szText )
{
UINT usedTriangles = 0;
d3dvertex_s *pVertex;
if ( FAILED(m_pD3Dbuf->Lock(0, 0, (void **) &pVertex, D3DLOCK_DISCARD)) )
{
m_pD3Ddev->SetFVF( fvf );
this->EndRender();
return E_FAIL;
}
for ( ; *szText; szText++ )
{
int c = *(unsigned char *)szText - 32;
if ( !(c >= 0 && c < 224) )
continue;
float tx1 = m_fTexCoords[c][0];
float tx2 = m_fTexCoords[c][2];
float ty1 = m_fTexCoords[c][1];
float ty2 = m_fTexCoords[c][3];
float w = ( tx2 - tx1 ) * m_texWidth;
float h = ( ty2 - ty1 ) * m_texHeight;
*pVertex++ = Init2DVertex( x - 0.5f, y - 0.5f, color, tx1, ty1 ); //topleft
*pVertex++ = Init2DVertex( x + w - 0.5f, y - 0.5f, color, tx2, ty1 ); //topright
*pVertex++ = Init2DVertex( x - 0.5f, y + h - 0.5f, color, tx1, ty2 ); //bottomleft
*pVertex++ = Init2DVertex( x + w - 0.5f, y - 0.5f, color, tx2, ty1 ); //topright
*pVertex++ = Init2DVertex( x + w - 0.5f, y + h - 0.5f, color, tx2, ty2 ); //bottomright
*pVertex++ = Init2DVertex( x - 0.5f, y + h - 0.5f, color, tx1, ty2 ); //bottomleft
if ( m_dwCreateFlags & FCR_BORDER )
w -= 2.0f;
x += w - ( m_chrSpacing * 2 );
usedTriangles += 2;
if ( usedTriangles >= m_maxTriangles )
break;
}
if ( usedTriangles > 0 )
{
m_pD3Dbuf->Unlock();
m_pD3Ddev->DrawPrimitive( D3DPT_TRIANGLELIST, 0, usedTriangles );
}
}
m_pD3Ddev->SetFVF( fvf );
this->EndRender();
return S_OK;
}
然后我看到一个名为“DrawLine”的函数,所以我决定去看看它做了什么,它在游戏世界中画了一条线,而不是屏幕上的静态线,所以当我转身并看不到具体位置 - 我不会看到该行:
bool CD3DRender::DrawLine ( const D3DXVECTOR3 &a, const D3DXVECTOR3 &b, DWORD dwColor )
{
if ( FAILED(CD3DBaseRender::BeginRender()) )
return false;
////////////////////////////////////////////////////
// Make sure we have a valid vertex buffer.
if ( m_pD3Dbuf == NULL )
{
return false;
}
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
//m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
//m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_pD3Ddev->SetRenderState( D3DRS_CLIPPING, false );
m_pD3Ddev->SetRenderState ( D3DRS_ZENABLE, false );
//m_pD3Ddev->SetRenderState ( D3DRS_LIGHTING, false );
D3DLVERTEX lineList[2];
//////////////////////////////////////////////////
// Lock the vertex buffer and copy in the verts.
m_pD3Dbuf->Lock( 0, 0, (void **) &lineList, D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK ); // flogs: D3DLOCK_NOSYSLOCK, D3DLOCK_DISCARD
{
lineList[0].x = a.x;
lineList[0].y = a.y;
lineList[0].z = a.z;
lineList[0].color = dwColor;
lineList[0].specular = dwColor;
lineList[1].x = b.x;
lineList[1].y = b.y;
lineList[1].z = b.z;
lineList[1].color = dwColor;
lineList[1].specular = dwColor;
}
m_pD3Dbuf->Unlock();
// store FVF to restore original at the end of this function
DWORD fvf;
m_pD3Ddev->GetFVF( &fvf );
m_pD3Ddev->SetFVF( D3DFVF_LVERTEX );
//m_pD3Ddev->SetFVF( D3DFVF_PRIMITIVES );
////////////////////////////////////////////////////
// Draw!
m_pD3Ddev->DrawPrimitiveUP( D3DPT_LINESTRIP, 1, lineList, sizeof(lineList) / 2 );
// reset states
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_pD3Ddev->SetRenderState ( D3DRS_ZENABLE, true );
m_pD3Ddev->SetRenderState( D3DRS_CLIPPING, true );
// restore FVF
m_pD3Ddev->SetFVF( fvf );
CD3DBaseRender::EndRender();
return true;
}
现在的问题是:区别在哪里?这段代码在哪里告诉:
“嘿,在播放器屏幕上绘制文本并让它留在那儿”?
和
“嘿,在游戏世界里画这个,只画玩家能看到的部分”?
谁能指出我正确的方向?或者如何编辑打印功能以在游戏世界中显示文本?
提前致谢。
我想要实现的目标的简洁示例:
Print 现在做什么(绿框)和我想要它做什么(红框)
(截取自另一个存在此类“3d 文本”但该程序是封闭源代码的游戏):
您可以看到红色框中的文本位置在屏幕上发生了变化,但在游戏中却没有。我也想这样做。 (你也可以看到红色和蓝色的#)
DrawLine代码已经在游戏中创建了线条,但它只是一条线条,不是文本,那么最后怎么会出现一个是另一个不是呢?
最佳答案
我只能猜测您的其余代码的作用。看起来 Print
方法是在变换矩阵已设置为形成正交 View 的环境中调用的,而 DrawLine
方法使用游戏的矩阵。
但是,您不想在场景中绘制文本。这将导致文本未对齐和错误缩放。您真正想要做的是在屏幕上找到场景位置所在的位置,并在那里绘制文本。您可以使用 D3DXVec3Project功能。请务必提供正确的变换矩阵。不是用于 2D 渲染的更新版本。
关于c++ - 如何在场景中绘制文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14983793/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!