我试图让一个角色看起来像是直接跳到空中然后再回到他开始的同一水平。 (y = 100)下面的代码似乎让程序自己战斗并同时上下移动。
我尝试了无数的方法,所有这些方法导致这个人上升而不是回来或飞离页面。
Private Sub btnJump_Click(sender As Object, e As EventArgs) Handles btnJump.Click
tmrJump.Start()
End Sub
Private Sub tmrJump_Tick(sender As Object, e As EventArgs) Handles tmrJump.Tick
For intCounterUp As Integer = 100 To 15
picSpaceRunner.Location = New Point(intCounterX, intCounterY)
intCounterY = intCounterUp
Next intCounterUp
For intCounterDown As Integer = 15 To 100
picSpaceRunner.Location = New Point(intCounterX, intCounterY)
intCounterY = intCounterDown
Next intCounterDown
End Sub
End Class
答案 0 :(得分:0)
代码运行没有延迟,所以你受到了机器的支配。
我不是一个专业的游戏编码器,所以我无法解释现代游戏引擎的复杂性。然而,我很久以前学到的一个基本想法是控制你的游戏/动画循环。考虑每秒帧数。
在您的代码中,它可以像在每个循环迭代中添加延迟一样简单。如果你希望角色在2秒内完成跳跃(1秒向上,1秒向下),则将1000(1秒= 1000毫秒)除以每个循环中的迭代次数并延迟该量。例如,您有85次迭代,因此每次迭代大约需要12 ms。
如果您不介意阻止线程,可以使用Threading.Thread.Sleep(12)轻松完成此操作。如果阻塞是个问题,您可能需要使用外部计时器。
我在Google搜索期间找到了此链接。他解释了如何在VB.Net中设置托管游戏循环。
http://www.vbforums.com/showthread.php?737805-Vb-Net-Managed-Game-Loop
更新:根据OP的评论......
要使用计时器执行此操作,您需要直接在Timer事件处理程序(Tick)中操作角色对象。你根本不会使用循环。
将Timer的Interval设置为前面讨论的值 - 对应于移动1个像素所需时间的ms数。然后,在Timer的Tick处理程序中,将字符对象的Location设置为等于具有新值的新Point。同样在Tick处理程序中,检查您的上限(15),然后反转该过程,直到它达到下限(100)。
例如,
@NonNull
protected <T extends ViewGroup.LayoutParams> T createLayoutParamsForView(ViewGroup viewParent,
@IdRes int belowViewId)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
return createLayoutParamsForView(null,null,viewParent,belowViewId);
}
@NonNull
protected <T extends ViewGroup.LayoutParams> T createLayoutParamsForView(@NonNull Context context,
@NonNull Class<? extends ViewGroup> parentClass,
@IdRes int belowViewId)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
return createLayoutParamsForView(context,parentClass,null,belowViewId);
}
@NonNull
private <T extends ViewGroup.LayoutParams> T createLayoutParamsForView(@Nullable Context context,
@Nullable Class<? extends ViewGroup> parentClass,
@Nullable ViewGroup parent,
@IdRes int belowViewId)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
if(context == null && parent == null) throw new IllegalStateException("either context and parent class or must be non null!");
T layoutParams = (T) (parent != null ? generateDefaultLayoutParams(parent) : generateDefaultLayoutParams(context, parentClass));
if (belowViewId != NO_ID && RelativeLayout.LayoutParams.class.isAssignableFrom(layoutParams.getClass())){
((RelativeLayout.LayoutParams)layoutParams).addRule(RelativeLayout.BELOW, belowViewId);
}
return layoutParams;
}
@NonNull
private <P extends ViewGroup> P instantiateParent(Class parentClass, Context context)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor constructor = parentClass.getDeclaredConstructor(Context.class);
constructor.setAccessible(true);
return (P) constructor.newInstance(context);
}
@NonNull
private <L extends ViewGroup.LayoutParams, P extends ViewGroup> L generateDefaultLayoutParams(Context context, @NonNull Class<? extends ViewGroup> viewParentClass)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
P viewParent = instantiateParent(viewParentClass, context);
return generateDefaultLayoutParams(viewParent);
}
答案 1 :(得分:0)
不要将循环放在timer_tick中。相反,按设定的间隔增加或减少高度,然后检查图像是否达到最大或最小高度。