我是游戏开发初学者,目前我的游戏出现问题.... 我希望游戏每次循环时更新画布,以便在一次按下图像时显示我的角色移动... Invalidate()在这里对我不起作用,因为它只显示我角色的结束位置 这是代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int)event.getX();
final int y = (int)event.getY();
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
if (rollbounds.contains((int)x, (int)y))
{
//dice roll
Random rand = new Random();
move = rand.nextInt(6) + 1;
//end of dice roll
//move counting
for (int loop=move;loop>0;loop--)
{
if ((charypos >= 220)&&(charxpos == 9))
{
Toast toast = Toast.makeText(getContext(), "You Win", Toast.LENGTH_SHORT);
toast.show();
loop=1;
}
if (charxpos != 205&&charLeftMove==false)
{
for (int loop2 = 28;loop2>0;loop2--)
{
charxpos+=1;
//update or invalidate here
}
这是一个棋盘游戏,当我触摸滚动按钮时,我会让角色平滑地移动空间数,因为无效会使它立即移动到最终位置。 非常感谢帮助
答案 0 :(得分:0)
你知道触摸事件实际上是在UI线程吗?即使您调用了invalidate,画布也不会绘制任何内容,直到您的整个代码块被执行。这意味着系统将在代码
之后呈现UIfor (int loop=move;loop>0;loop--)
这就是为什么你发现总是移动到最终位置。您应该将代码移动到
case MotionEvent.ACTION_MOVE
。不要在事件中使用循环。只需每次触摸事件计算一次。例如,全局声明一个变量,并通过touchEvent
int a = 0;
public boolean onTouchEvent(MotionEvent event) {
final int x = (int)event.getX();
final int y = (int)event.getY();
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
++a;
invalidate();