Android 线的星形触觉
这是我的代码:Android 线的星形触觉,android,multithreading,Android,Multithreading,这是我的代码: package gal.doron.ballinthehole; import android.content.Intent; public class BallMover extends Thread { private Ball[] balls; private Paddle paddle; private GameLevels levels; private GameView gameview;
package gal.doron.ballinthehole;
import android.content.Intent;
public class BallMover extends Thread
{
private Ball[] balls;
private Paddle paddle;
private GameLevels levels;
private GameView gameview;
private enum Directions {Top, Right, Bottom, Left, None};
public BallMover(Ball[] b, Paddle p, GameLevels levels, GameView view)
{
this.balls = b;
this.paddle = p;
this.levels = levels;
this.gameview = view;
}
@Override
public void run()
{
while(true)
{
if(levels.isFinishLevel())
{
levels.setCurrentLevel(levels.getCurrentLevel()+1);
for(int i=1;i<balls.length;i++)
{
balls[i].setVisible(false);
balls[i].restart();
}
balls[0].restart();
try
{
sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
for(int i=0;i<balls.length;i++)
{
if(this.balls[i].isVisible())
{
this.balls[i].moveBall();
checkHitPaddle(i);
checkHitBrick(i);
}
}
this.gameview.postInvalidate();
try
{
sleep(1);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public void checkHitPaddle(int ballI)
{
Ball ball = balls[ballI];
if(ball.Left()<=paddle.Right() && ball.Right()>=paddle.Left())
{
if(ball.Bottom()>=paddle.Top())
{
ball.bounceUp();
}
}
else if(ball.Bottom()>=paddle.Bottom()+10){
Intent GameOverScreen = new Intent(BallMover.this, GameOverScreen.class);
startActivity(GameOverScreen);
}
//ball.restart();
}
public void checkHitBrick(int ballI)
{
Ball ball = balls[ballI];
String direction = getHitBricksDirection(ballI).name();
if(direction.compareTo("Top")==0)
ball.bounceUp();
if(direction.compareTo("Bottom")==0)
ball.bounceDown();
if(direction.compareTo("Left")==0)
ball.bounceLeft();
if(direction.compareTo("Right")==0)
ball.bounceRight();
}
public Directions getHitBricksDirection(int ballI)
{
Ball ball = balls[ballI];
Bricks bricks = levels.getLevelBricks();
Brick brick;
for(int i=0;i<bricks.rows();i++)
{
for(int j=0;j<bricks.cols();j++)
{
brick = bricks.getBrick(i, j);
if(brick.getType()!=0)
{
if(ball.Left()<=brick.Right() && ball.Right()>=brick.Left())
{
if(ball.Bottom()-brick.Top()>=0 && ball.Bottom()-brick.Top()<=1)
{
brick.ballHitBrick();
return Directions.Top;
}
if(ball.Top()-brick.Bottom()<=0 && ball.Top()-brick.Bottom()>=-1)
{
brick.ballHitBrick();
return Directions.Bottom;
}
}
if(ball.Top()<=brick.Bottom() && ball.Bottom()>=brick.Top())
{
if(ball.Right()-brick.Left()>=0 && ball.Right()-brick.Left()<=1)
{
brick.ballHitBrick();
return Directions.Left;
}
if(ball.Left()-brick.Right()<=0 && ball.Left()-brick.Right()>=-1)
{
brick.ballHitBrick();
return Directions.Right;
}
}
}
}
}
return Directions.None;
}
}
我知道BallMover类是线程,它实际上需要是活动
有人有解决办法吗 Intent构造函数的第一个参数是其任何子类的
Context
类的任何对象。因此,解决此问题的方法之一是在BallMover
构造函数处传递Context
:
public BallMover(Ball[] b, Paddle p, GameLevels levels, GameView view, Context context)
{
this.balls = b;
this.paddle = p;
this.levels = levels;
this.gameview = view;
this.context = context;
}
例如,通过Context
可以传递应用程序上下文。之后,您可以创建Intent
,如下所示:
Intent myIntent = new Intent(context, GameOverScreen.class);
您的问题是什么?将上下文传递给线程,或使用代理要求活动启动
GameOverScreen
可以从某些活动调用您的线程类来启动活动。并将任何上下文传递给线程的构造函数,好吗。。。我这样做了,但行:星际触觉(游戏屏幕);如果类扩展线程而不是扩展活动,则无法工作。对吗?@user3545490我已经做了编辑,你不应该像你想开始的课程那样调用你的意图。是的,GameOverScreen应该是Activity的子类。我问的是BallMover类。很抱歉,此编辑对我不起作用:(.我完全像你一样..@user3545490为什么它不起作用?它应该起作用。你有运行时异常或编译错误吗?
Intent myIntent = new Intent(context, GameOverScreen.class);