Hallo,
kann mir jemand erklären, wie ich bereits im Konstruktor die Breite der canvas ermitteln kann? Ich würde das gerne dem Raumschiff mitgeben, damit das nicht immer halb über den Rand fliegt.
Ich hab es nicht hin bekommen im Konstruktor so was wie
canvas = ourHolder.lockCanvas();
breite = canvas.getWidth();
zu machen. Immer wenn ich die breite ermitteln will, stürzt die App ab. In der Run() Metode kann ich aber die Breite ermitteln.
Was mach ich denn falsch?
package de.fuckthesystem.thenewboston;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class SurfaceTestOneView extends SurfaceView implements Runnable {
SurfaceHolder ourHolder;
Thread ourThread = null;
boolean isRunning = false;
SpaceShip spaceship;
GreenBall greenBall;
SpaceBackground spaceBackground;
int breite;
boolean check = true;
Canvas canvas;
public SurfaceTestOneView(Context context) {
super(context);
/*this.spaceship = spaceship;
this.spaceBackground = spaceBackground;
this.greenBall = greenBall;*/
ourHolder = getHolder();
spaceship = new SpaceShip(BitmapFactory.decodeResource(getResources(), R.drawable.spaceship), 100, 100);
spaceBackground = new SpaceBackground(BitmapFactory.decodeResource(getResources(), R.drawable.verticalspace),50);
greenBall = new GreenBall(BitmapFactory.decodeResource(getResources(), R.drawable.greenball),50,50);
}
public void pause() {
isRunning = false;
while(true) {
try {
ourThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
ourThread = null;
}
public void resume() {
isRunning = true;
ourThread = new Thread(this);
ourThread.start();
}
@Override
public void run() {
long lastFrame = System.currentTimeMillis();
while(isRunning) {
//Framesberechnen ab hier
long thisFrame = System.currentTimeMillis();
float timeSinceLastFrame = ((float)(thisFrame-lastFrame))/1000f;
lastFrame = thisFrame;
if (!ourHolder.getSurface().isValid()) continue;
canvas = ourHolder.lockCanvas();
canvas.drawRGB(02, 02, 150);
canvas.drawBitmap(spaceBackground.getLook(), 0, (spaceBackground.getY()-spaceBackground.getLook().getHeight())+canvas.getHeight(), null);
canvas.drawBitmap(spaceBackground.getLook(), 0, ((spaceBackground.getY()-spaceBackground.getLook().getHeight())+canvas.getHeight())-spaceBackground.getLook().getHeight(), null);
canvas.drawBitmap(greenBall.getBitmap(), greenBall.getX(), greenBall.getY(), null);
canvas.drawBitmap(spaceship.getLook(), spaceship.getPosX(), spaceship.getPosY(), null);
Paint textPaint = new Paint();
textPaint.setARGB(50, 254, 10, 50);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTextSize(50);
canvas.drawText("get Y: "+ spaceBackground.getY(), canvas.getWidth()/2, 200, textPaint);
canvas.drawText("canvas x&y: "+ canvas.getWidth() + "/"+ canvas.getHeight(), canvas.getWidth()/2, 250, textPaint);
canvas.drawText("Rect w: "+ breite, canvas.getWidth()/2, 300, textPaint);
ourHolder.unlockCanvasAndPost(canvas);
//updaten der Bitmaps
spaceBackground.update(timeSinceLastFrame);
try {
ourThread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
spaceship.handleActionDown((int)event.getX(), (int)event.getY());
spaceship.handleSpaceshipMove((int)event.getX(), (int)event.getY());
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (spaceship.isTouched()) {
spaceship.setPosX((int)event.getX()-(spaceship.getLook().getWidth()/2));
spaceship.setPosY((int)event.getY());
}
if (spaceship.isTouchedToMove()) {
spaceship.setPosX((int)event.getX()-(spaceship.getLook().getWidth()/2));
}
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if(spaceship.isTouched()) {
spaceship.setTouched(false);
}
if(spaceship.isTouchedToMove()) {
spaceship.setTouchedToMove(false);
}
}
return true;
}
}