我正在尝试创建自己的原始2D图形游戏引擎.游戏的核心部分是向敌人发射不同的射弹.在我继续工作之前,我需要让这个组件工作.
我现在所拥有的是沿着穿过起点(x,y)和目标点(x1,x2)的线移动我的射弹.我利用了线性函数y = mx + b.问题在于我如何更新射弹的位置会导致速度不一致,具体取决于线的斜率.(更大的斜坡使它更快地移开).
这是我正在运行的游戏循环的核心结构:
private void executeGameLoop()
{
long nextFrameStart = System.nanoTime();
while(panel.getRunning())
{
do
{
panel.update();
nextFrameStart += FRAME_PERIOD;
} while(nextFrameStart < System.nanoTime());
long remaining = nextFrameStart - System.nanoTime();
panel.repaint();
if (remaining > 0)
{
try
{
Thread.sleep(remaining / 1000000);
}
catch(Throwable e)
{
System.out.println(e.getMessage());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这只是更新结构和图形的机制.panel.update在某些情况下,每当这个叫炮弹更新它的位置时.以下是更新射弹的方法:
这告诉射弹它有一个目标并设置有关该线的信息.
public void setHasTarget(boolean hasTargetIn)
{
if(hasTargetIn)
{
deltaX = getTargetX() - getX();
deltaY = getTargetY() - getY();
slope = deltaY / …Run Code Online (Sandbox Code Playgroud) 我试图更多地了解各种设计选择的含义,并找到最有效的解决方案来防止我的代码中出现错误。在深入探讨之前,请允许我简要概括地陈述我的问题:
与 if 语句结构相比,try catch 块是处理越界异常的更有效解决方案吗?
我知道引发异常很昂贵,但是通过删除不必要的 if 语句来降低成本吗?
现在,请允许我陈述我的具体问题,以便为您提供更多有用的信息。
我正在构建一个游戏,该游戏的一部分是一个世界网格解决方案和一个探路者。游戏单元可以从世界网格请求节点(通过将坐标信息作为有序对 (x, z) 发送),然后发送到探路者或对它们执行一些其他杂项操作。因为节点被请求的频率很高,特别是探路者,这似乎是一个尝试优化的聪明地方。
这是我当前根据节点数组中的x和z值返回给定节点的代码:
public Node GetTile(int x, int z)
{
if (x < 0)
x = 0;
if (x >= length_X)
x = length_X - 1;
if (z < 0)
z = 0;
if (z >= length_Z)
z = length_Z - 1;
return tiles [x, z];
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我有几个 if 语句来避免在从世界网格的节点(图块)数组中检索节点时出现越界异常。这是最有效的解决方案吗?我可以删除 if 而是将返回放在 try catch 块中,如下所示:
public Node GetTile(int x, int z)
{
try
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用迭代器从列表中移除一个射弹,如果它超出了我的JPanel的边界.在使用迭代器之前它不会工作,但是只要我将方法放入try-catch中,迭代器就可以工作ConcurrentModificationException.代码现在可以工作,并且成功地从列表中移除了射弹,但是大约30%的时间,捕获命中并导致我的程序中出现断断续续的情况.我不知道为什么它只是偶尔捕获,但在有限的时间内,我的教授能够看到它,他认为这可能是一个同步问题.
这是运行我的程序的循环:
private void executeGameLoop()
{
long nextFrameStart = System.nanoTime();
while(panel.getRunning())
{
do
{
panel.repaint();
nextFrameStart += FRAME_PERIOD;
} while(nextFrameStart < System.nanoTime());
long remaining = nextFrameStart - System.nanoTime();
panel.update();
if (remaining > 0)
{
try
{
Thread.sleep(remaining / 1000000);
}
catch(Throwable e)
{
System.out.println(e.getMessage());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这由循环at调用panel.update.它现在处理弹丸的更新:
public void update()
{
randX = (int)((Math.random() * getWidth()) - (int)(Math.random() * getWidth()));
randY = (int)((Math.random() * getHeight()) - (int)(Math.random() * getHeight()));
int sizeX;
int sizeY;
try …Run Code Online (Sandbox Code Playgroud) 我的问题归结为Django中REST和Views的最佳实践之一.我正在为我当前的项目重新编写REST api,其中包括稍微修改我们的视图(传统MVC中的Controller).目前,所有内容都通过POST请求进行隧道传输,即使是简单的GET也是如此.
从休息的角度来看,应该返回所有作业的列表,其中包含以下URL:
API /职位/
应该检索单个作业(ID为1):
API /职位/ 1
最后,这应该返回作为工作1一部分的所有任务
API /职位/ 1 /任务/
这是我用于新系统的理念,但我对实现感到不满.如果这两个都在Django中获得自己的View,或者一个视图应该同时处理它们.
目前我正在使用一个View,其中所有相关的URL都路由到它,这样的逻辑;
def get(self, request, id=None, task_id=None):
if id is None:
return Job.objects.all() # This will be the LIST'
if task_id is not None:
return Job.objects.get(id=id).task_set.all()
return Job.objects.get(id=id)
Run Code Online (Sandbox Code Playgroud)
如果增加更多复杂性,这似乎会导致非常复杂和冗长的视图.如果我想为其他资源的任务逻辑添加类似的逻辑,我会继续添加到视图中,还是应该每个都获得自己的View?