背景
我正在尝试使用LWJGL 3.0在Java中创建FPS游戏.我已经设置了一个相机类,它具有俯仰和偏航(不使用滚动).相机本身扩展了实体,因为它有一个模型.我希望这款相机始终位于相机的"前方",无论相机指向何处.每个实体都有一个getTransformationMatrix()
返回a 的方法,Matrix4f
然后将其传递给实体着色器.
问题
模型需要指向摄像机的方向,并围绕摄像机旋转,使其始终位于前方.这种情况下的对象是带枪的手,如下图所示.
我的尝试
我知道基本的三角学,所以我得到的对象分别正确旋转俯仰和偏航.这是我目前的实施:
偏航
@Override
public Matrix4f getTransformationMatrix() {
modelX = getPosition().x + (radius * (float)Math.sin(Math.toRadians(getYaw())));
modelZ = getPosition().z + (radius * (float)Math.cos(Math.toRadians(getYaw())));
return Transform.createTransformationMatrix(new Vector3f(modelX, getPosition().y - 5, modelZ), new Vector3f(0, getYaw(), 0), getScale());
}
Run Code Online (Sandbox Code Playgroud)
沥青
@Override
public Matrix4f getTransformationMatrix() {
modelZ = getPosition().z + (radius * (float)Math.sin(Math.toRadians(getPitch())));
modelY = (getPosition().y - 5) + (radius * (float)Math.cos(Math.toRadians(getPitch())));
return Transform.createTransformationMatrix(new Vector3f(getPosition().x, modelY, modelZ), new Vector3f(getPitch(), 0, 0), getScale());
}
Run Code Online (Sandbox Code Playgroud)
我已经做了一些研究,但我担心我被困在这个问题太久了,需要一些新鲜的眼睛.当我尝试组合这两个计算时,当看到除0以外的任何偏转角时,模型似乎以图形的形式移动.下面是我尝试组合这些:
@Override …
Run Code Online (Sandbox Code Playgroud) 对于我的游戏,我实施了一个库存系统.单击屏幕时,a MousePressedEvent
将通过layers
游戏中的所有对象传递给所有继承EventListener
(My EventListener
)的对象.该EventListener
级工作正常,并使用它,如下图所示,我已经成功地让我的库存,这样你可以删除一个槽物品,将它们放回.然而,我想要做的是能够将它们从任何包含项目的插槽中取出,并将它们放在任何其他插槽中(只要目标插槽为空).我认为我所拥有的将允许这样做,因为在if
声明中我没有检查如果选择了插槽,我将其添加到插槽中.但这实际上并不奏效.有任何想法吗?
Slot.java
课堂代码:
public boolean onMousePressed(MousePressedEvent e) {
Point p = new Point(Mouse.getX(), Mouse.getY());
if (!this.getBounds().contains(p)) return false;
boolean left = (e.getButton() == MouseEvent.BUTTON1);
boolean right = (e.getButton() == MouseEvent.BUTTON3);
boolean hasItems = (items.size() > 0);
if (this.getBounds().contains(p)){
if (right && !selected && hasItems){
select(true);
s = new Slot(new Vector2i(Mouse.getX(), Mouse.getY()));
addComponent(s);
s.add(items.get(0));
remove(items.get(items.size() - 1));
} else if (right && selected){
s.add(items.get(0));
remove(items.get(items.size() - 1));
if (items.size() …
Run Code Online (Sandbox Code Playgroud) 我为我的A Level计算任务编写了一个侦察系统.该计划旨在存储侦察小屋的侦察员信息,包括徽章,排行榜系统,以及用于从列表中添加/查找/删除侦察员的管理系统.侦察信息必须存储在文件中.
删除功能的文件处理过程(我的问题所在):删除侦察按钮触发弹出窗口(使用tkinter).该窗口收集侦察员的ID,然后搜索侦察文件,扫描存储的侦察员的ID并将其与输入的ID进行比较.如果找到该ID,它将跳过该文件的这一行,否则该行将被复制到临时文件中.完成所有行后,temp中的行将复制到原始文件的新空白版本,并将临时文件删除/重新创建为空白.
我的问题:问题是当程序将要删除的ID(remID)与当前正在文件中查找的侦察程序的ID(sctID)进行比较时,它实际上在它们相等时返回false.这可能是我处理变量,分割行以获取ID,甚至我的数据类型的问题.我只是不知道.我尝试将两者都转换为字符串,但仍然是假的.本节的代码如下.先感谢您!
elif self._name == "rem":
remID = str(scoutID.get())
if remID != "":
#store all the lines that are in the file in a temp file
with open(fileName,"r") as f:
with open(tempFileName,"a") as ft:
lines = f.readlines()
for line in lines:
sctID = str(line.split(",")[3])
print("%s,%s,%s"%(remID, sctID, remID==sctID))
#print(remID)
if sctID != remID: #if the ID we are looking to remove isn't
#the ID of the scout we are currently looking at, move it to the temp file
ft.write(line) …
Run Code Online (Sandbox Code Playgroud) 我编写了一个扫描文件"ID"的算法,并将该值与整数i的值进行比较(我将整数转换为字符串进行比较,并修剪了"\n"前缀从线).该算法比较文件中每一行的这些值(每个ID).如果它们相等,则算法将i增加1并使用i的新值进行reccurtion.如果值不相等,则将其与文件中的下一行进行比较.它执行此操作,直到它具有不在文件中的i值,然后返回该值以用作下一条记录的ID.
我的问题是我有一个ID的文件列表1,3,2,因为我删除了ID为2的记录,然后创建了一个新的记录.这表明算法正常工作,因为它为新记录提供了之前删除的ID 2.但是,当我创建新记录时,下一个ID为3,导致我的ID列表读取:1,3,2,3
而不是1,3,2,4
.贝娄是我的算法,带有print()
命令的结果.我可以看到它出错的地方,但无法解决原因.有任何想法吗?
算法:
def _getAvailableID(iD):
i = iD
f = open(IDFileName,"r")
lines = f.readlines()
for line in lines:
print("%s,%s,%s"%("i=" + str(i), "ID=" + line[:-1], (str(i) == line[:-1])))
if str(i) == line[:-1]:
i += 1
f.close()
_getAvailableID(i)
return str(i)
Run Code Online (Sandbox Code Playgroud)
输出:(运行算法以查找ID应为4的记录的适当ID时的输出):
i=1,ID=1,True
i=2,ID=1,False
i=2,ID=3,False
i=2,ID=2,True
i=3,ID=1,False
i=3,ID=3,True
i=4,ID=1,False
i=4,ID=3,False
i=4,ID=2,False
i=4,ID=2,False
i=2,ID=3,False
i=2,ID=2,True
i=3,ID=1,False
i=3,ID=3,True
i=4,ID=1,False
i=4,ID=3,False
i=4,ID=2,False
i=4,ID=2,False
Run Code Online (Sandbox Code Playgroud)