【问题标题】:Creating game gravity in Android?在 Android 中创建游戏重力?
【发布时间】:2012-11-04 03:54:30
【问题描述】:

我正在尝试在 Android 中创建游戏重力。我创建了一个更新方法、一个显示和重力。现在应用程序不会强制关闭,但球不会移动。 .getHieght() 和 .getWidth() 方法是否需要使用画布?

public class MainActivity extends Activity {
private int c = Color.YELLOW;
private Canvas g;
@Override
public void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
draw();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}


// draws the ball
public void draw ()
{
Display display = getWindowManager().getDefaultDisplay();

int width = display.getHeight();
int height = display.getWidth();

Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);

g = new Canvas(bitmap);
g.drawColor(c);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
g.drawCircle(50, 10, 25, paint); //Put your values
update();

// In order to display this image, we need to create a new ImageView that we can        display.
ImageView imageView = new ImageView(this);

// Set this ImageView's bitmap to ours
imageView.setImageBitmap(bitmap);

// Create a simple layout and add imageview to it.
RelativeLayout layout = new RelativeLayout(this);
RelativeLayout.LayoutParams params = new     RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(imageView, params);
layout.setBackgroundColor(Color.BLACK);

// Show layout in activity.
setContentView(layout);   
}
private void update(){
// wall collisions;
    if (x + dx > sp.getWidth() - radius - 1) {
        x = sp.getWidth() - radius - 1;
        // bounce off right wall;
        dx = -dx;
        // bounce off left wall;
    } else if (x + dx < 0 + radius) {
        x = 0 + radius;
        dx = -dx;
    } else {
        x += dx;
    }

    // friction;
    if (y == sp.getHeight() - radius - 1) {
        dx *= xFriction;
        if (Math.abs(dx) < .8) {
            dx = 0;
        }
    }
    // gravity;
    if (y > sp.getHeight() - radius - 1) {
        y = sp.getHeight() - radius - 1;
        dy *= energyloss;
        dy = -dy;
    } else {
        // velocity formula;
        dy += gravity * dt;
        // position formula;
        y += dy * dt + .5 * gravity * dt * dt;

    }

}

}

【问题讨论】:

    标签: android eclipse gravity


    【解决方案1】:

    在我看来,您的方法完全错误,而且会造成复杂性。

    我会这样做。创建两个类,一个用于球,一个用于绘制它的某个地方。大致如下:

    public class Ball{
    
        private int radius;
        private int xPosition;
        private int yPosition;
        private int color;
        private Paint paint;
    
        public Ball(int x, int y, int radius, int color)
        { 
            this.xPosition = x; this.yPosition = y; this.radius = radius;
            paint = new Paint(color);
        }
    
        void moveBall(int x, int y){
             xPosition = x; yPosition =y;        
        } 
    
        void onDraw(Canvas canvas){
              canvas.drawCircle(x, y, radius, paint);
        }              
    
    }
    

    现在可以画它了。

    public class Playground extends ImageView{
    
           public Ball ball;    
    
           @Override
           public void onDraw(Canvas canvas)
           {
               super.onDraw(canvas);
               if (ball != null ){
                   ball.onDraw(canvas);
               }
           }
    
     }
    

    在您的活动中,可能在 onStart() 中:

    imageView.ball = new Ball(startX, startY, radius, Color.BLUE);
    

    将您的“更新”方法也移动到球类中,并在计时器上调用 ball.update()(或在您想要更新它时)。

    将布局中的 ImageView 替换为 Playground 类(我脑海中浮现的名字)。

    覆盖 ImageView 扩展中的 onMeasure() 以获取“游乐场”的高度和宽度。

    这为您提供了基础知识。我把这个写在我的头上,所以请原谅错别字等

    此外,请查看您在之前关于此主题的多个问题中给出的答案,并阅读有关扩展 View 类、onDraw 和 onMeasure 的 Android 文档。

    【讨论】:

    • 谢谢!不过,我有一些问题:我在 Ball 类中创建了一个 ImageView,当我放入 imageView.ball 时,它说“球无法解析或不是一个字段”另外,如何将 Imageview 替换为游乐场课?非常感谢您的帮助。
    • 约旦。我以为你已经离开了一段时间阅读一些教程和学习面向对象的编程。好像不是 ;) 你为什么把 ImageView 放在球类里?我的示例没有显示这一点,并且应该在不了解 ImageView 的情况下存在球类。要使用您的自定义 ImageView、Playground,请在您的布局 XML 中将 ImageView 替换为 com.package.whatever.Playground。但是,请在此处搜索或在 Google 上搜索如何执行此操作。
    • 哈哈抱歉,但是当人们将代码与实际单词混合时,我很难理解该怎么做:) 所以我有点困惑。我马上试试,谢谢
    • 祝你好运。看看代码有多干净?您有一个球类,您可以从中创建任意数量的球。每个人都会照顾自己,在您的“游乐场”中,您可以要求每个球自己画。将来,您可以将其更改为鸟类类、三角形类或飞行烤面包机类,并创建您想要的任何内容。
    • 我似乎最喜欢 Playground 类 ;) 到目前为止,我一直在寻找如何在 xml 中更改 ImageView,而一切都与 ImageView 按钮有关?这是我想用的,还是我把它和别的东西混在一起了?
    【解决方案2】:

    我想你只画一次,你可以添加一个定时器来触发 draw() 方法

    【讨论】:

    • 谢谢,如何添加计时器?
    • 这里有一些信息:stackoverflow.com/questions/1877417/…
    • 如果你看代码,球总是被画在同一个位置。添加一个计时器除了导致球在同一个地方被多次绘制外,什么也做不了。虽然 OP 在某些时候需要一个计时器,但这并不能解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多