我正在使用SDL库在C++中编写一个简单的roguelike游戏,我在屏幕上移动我的角色时遇到了一些问题.每次需要渲染帧时,我都会使用update()函数更新精灵的位置,如果玩家静止不动,则不会执行任何操作.为了发出移动命令,从而开始动画,我使用每个玩家从一个瓦片移动到另一个瓦片时只调用一次的step()函数.在接收到"向上"命令时,游戏表现良好并且角色在一秒内平稳地移动到新位置.然而,当给出"向下"命令时,他以大约一半的速度移动,并且显然在经过一秒之后,他立即被"传送"到最终位置,突然闪烁.移动的代码基本相同,但是在一种情况下,delta移动被加到y位置,在另一种情况下被减去.也许这个位置是一个整数并且delta是一个双倍的事实会导致问题?sum和subract的行为是否不同(可能是不同的舍入)?这是相关的代码(抱歉长度):
void Player::step(Player::Direction dir)
{
if(m_status != STANDING) // no animation while standing
return;
switch(dir)
{
case UP:
if(m_currMap->tileAt(m_xPos, m_yPos - m_currMap->tileHeight())->m_type == Tile::FLOOR)
{
// if next tile is not a wall, set up animation
m_status = WALKING_UP;
m_yDelta = m_currMap->tileHeight(); // sprite have to move by a tile
m_yVel = m_currMap->tileHeight() / 1000.0f; // in one second
m_yNext = m_yPos - m_currMap->tileHeight(); // store final destination
}
break;
case DOWN:
if(m_currMap->tileAt(m_xPos, m_yPos + m_currMap->tileHeight())->m_type == Tile::FLOOR)
{
m_status …Run Code Online (Sandbox Code Playgroud) 我正在学习本教程,以了解更多关于OpenGL,特别是点精灵的内容.但是我坚持在页面末尾的一个练习中:
尝试通过更改片段着色器将点精灵旋转45度.
在本章中以及之前的章节中没有关于此类事情的提示.我没有找到任何关于如何做的文档.这些是我的顶点和片段着色器:
顶点着色器
#version 140
attribute vec2 coord2d;
varying vec4 f_color;
uniform float offset_x;
uniform float scale_x;
uniform float point_size;
void main(void) {
gl_Position = vec4((coord2d.x + offset_x) * scale_x, coord2d.y, 0.0, 1.0);
f_color = vec4(coord2d.xy / 2.0 + 0.5, 1.0, 1.0);
gl_PointSize = point_size;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
#version 140
varying vec4 f_color;
uniform sampler2D texture;
void main(void) {
gl_FragColor = texture2D(texture, gl_PointCoord) * f_color;
}
Run Code Online (Sandbox Code Playgroud)
我想在FS中使用2x2矩阵来旋转gl_PointCoord,但我不知道如何填充矩阵来完成它.我应该把它作为制服直接传递给FS吗?
我想要实现的目标如下:我有QGraphicsScene一个QGraphicsPixmapItem显示在其中.像素图有多种颜色,我需要在像素图上绘制一条线,必须在每个点上都可见并且可识别.
我的想法是绘制一条线,其中每个像素都具有像素图的相对像素的负(互补)颜色.所以我想到了子类化QGraphicsItem和重新实现paint()方法来绘制一条多色线.
但是我被卡住了,因为我不知道如何从paint函数中检索像素图的像素信息,即使我发现了,我也想不出以这种方式画线的方法.
你能给我一些关于如何进行的建议吗?