我正在尝试制作飞行气球(上下无限),点击其中一个,它会改变方向。我尝试使用动画,但它不支持在当前时间点击当前位置的视图。我知道,至少有两种方法:
我不想使用OpenGL来放弃简单的动画。我不明白如何使用Canvas(阅读this,谷歌文档和一些谷歌搜索链接)。 我不需要代码,所有我需要它的方式是如何做到这一点和算法。
答案 0 :(得分:1)
好吧,这就是我为我的一个项目设置的,它可以完全按照你的需要工作......
您需要创建4个主要方面:
- 活动(扩展活动)
- SurfaceView(扩展SurfaceView实现SurfaceHolder.Callback)
- 线程(扩展线程)
- 交互的对象(扩展Drawable)
Activity启动并生成一个创建Thread的SurfaceView。视图或线程可以包含您绘制/交互的对象,它取决于您在此时如何存储数据,但如果您想出一个类之间耦合最少的设计,则最简单。
一旦启动,线程会一直运行直到停止(将isRunning
设置为false):
/**
* Processing loop
*/
public void run() {
while (isRunning) {
try {
sleep(25);
} catch (InterruptedException e) {
Log.e("Thread","Thread Interruption");
e.printStackTrace();
}
update();
}
Log.d("Thread", "Game Loop Stopped");
}
/**
* Main processing of the game loop.
*/
private void update() {
handleInput();
updatePhysics();
updateUI();
updateState();
updateAI();
updateAnimations();
updateSound();
updateVideo();
}
在这个类中,您会看到update()
方法,该方法在每次线程迭代时执行一系列操作。
您最感兴趣的方法是handleInput
,updateUI
和updatePhysics
方法。
在handleInput
中,您将对SurfaceView进行回调,以获取处理信息所需的数据。我的handleInput
非常简单,因为它只是从SurfaceView类的MotionEvent
中获取onTouchEvent
(这在使用SurfaceHolder.OnCallBack接口时实现)。
updateUI
方法调用SurfaceView的update
,在其中为每个对象重新绘制Canvas
,或者气球
public void update(List<Actor> actors) {
Canvas canvas = null;
try {
canvas = surface.lockCanvas();
synchronized (surface) {
//Blank the Canvas
for (int i = 0; i < actors.size(); i++) {
actors.get(i).draw(canvas);
}
}
} catch (NullPointerException e) {
e.printStackTrace();
} finally {
if (canvas != null) {
surface.unlockCanvasAndPost(canvas);
}
}
}
在这里我们可以看到它调用draw
方法将canvas对象传递给每个可交互对象。我在上面的代码中称我为“Actors”。您选择如何实施draw
取决于您,但听起来您将使用大量canvas.drawBitmap()
个功能。
回到线程的updatePhysics
方法,您将要使用它来在对象被绘制到屏幕之前或之后更新对象。对于你,你需要让它们在屏幕上改变它们的X和/或Y位置,或者在handleInput
决定你击中气球后改变它移动的方向。
很难在StackOverflow回复中解释这一点。如果你真的希望我可以尝试在本周末将更多信息放在一起并在外部为你发布(我可以提供我的UML类图表以及其他信息,如图片示例,结构和数据流。
如果我能帮助你,请告诉我!请注意,这不是我的全部工作。我在网上使用了很多教程来获得基本的Android游戏结构,但是现在没有可用的链接提供参考。