Tic Tac Toe

K

krackmoe

Neues Mitglied
1
Hab gestern mal geschafft, das er mal nen Punkt zeichnet dort wo ich hinklicke.

Jetzt hab ich aber das onTouchEvent in die Activity Klasse ausgelagert und greif jetzt mit gettern auf die Variablen wie x und y in der View Klasse zu.
In der View Klasse zeichne ich dann die kreise.

Jetzt ists aber so, dass wenn ich wo hinklicke, der Kreis nicht dort erscheint wo ich hinklicke sondern ca. 50 Pixel darunter.
Und ich versteh nicht woher die 50 Pixel kommen.
Kann ja nicht sein das ich immer -50 rechnen muss bei der Y Koordinate!?

Activty Klasse schaut so aus:
Code:
package com.tictactoe;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.Toast;

public class GameActivity extends Activity {
	private GameWindow gameWindow;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.game_window);
		
		gameWindow = (GameWindow)findViewById(R.id.game_window);
		gameWindow.setFocusable(true);
		gameWindow.setFocusableInTouchMode(true);
		
		
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if(event.getAction() == MotionEvent.ACTION_DOWN){
			float touchX = event.getX();
			float touchY = event.getY();
			
			findArea(touchX, touchY);
			gameWindow.invalidate();
		}
		return true;
	}

	private void findArea(float touchX, float touchY) {
		if(touchX < gameWindow.getX1TopBottom()){
			if(touchY < gameWindow.getY1LeftRight()){
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 1", Toast.LENGTH_SHORT).show();
			}
			else if(touchY > gameWindow.getY2LeftRight()){
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 7", Toast.LENGTH_SHORT).show();
			}
			else{
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 4", Toast.LENGTH_SHORT).show();
			}
		}
		else if(touchX > gameWindow.getX2TopBottom()){
			if(touchY < gameWindow.getY1LeftRight()){
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 3", Toast.LENGTH_SHORT).show();
			}
			else if(touchY > gameWindow.getY2LeftRight()){
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 9", Toast.LENGTH_SHORT).show();
			}
			else{
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 6", Toast.LENGTH_SHORT).show();
			}
		}
		else{
			if(touchY < gameWindow.getY1LeftRight()){
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 2", Toast.LENGTH_SHORT).show();
			}
			else if(touchY > gameWindow.getY2LeftRight()){
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 8", Toast.LENGTH_SHORT).show();
			}
			else{
				gameWindow.setNewCircle(new Circle(touchX, touchY, 10));
				Toast.makeText(gameWindow.getContext(), "Feld 5", Toast.LENGTH_SHORT).show();
			}
		}		
	}
}

View Klasse:
Code:
package com.tictactoe;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class GameWindow extends View {
	private Paint mLine;
	private int x1TopBottom;
	private int x2TopBottom;
	private int y1LeftRight;
	private int y2LeftRight;
	private int xRight;
	private int yBottom;
	public static List<Circle> circles = new ArrayList<Circle>();
	
	public GameWindow(Context context, AttributeSet attrs) {
		super(context, attrs);
		
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		int width = getMeasuredWidth();
		int height = getMeasuredHeight();
		mLine = new Paint();
		mLine.setColor(Color.BLACK);
		mLine.setStrokeWidth(3);
		
		x1TopBottom = width/3;
		x2TopBottom = x1TopBottom*2;
		int yTop = 0;
		int xLeft = 0;
		y1LeftRight = height/3;
		y2LeftRight = y1LeftRight*2;
		xRight = width;
		yBottom = height;
		
		canvas.drawLine(x1TopBottom, yTop+20, x1TopBottom, yBottom-20, mLine);
		canvas.drawLine(x2TopBottom, yTop+20, x2TopBottom, yBottom-20, mLine);
		canvas.drawLine(xLeft+20, y1LeftRight, xRight-20, y1LeftRight, mLine);
		canvas.drawLine(xLeft+20, y2LeftRight, xRight-20, y2LeftRight, mLine);
		
		if(circles.size() > 0){
			for(Circle c: circles){
				canvas.drawCircle(c.getX(), c.getY(), c.getR(), c.getmPaint());
			}
		}
		
	}
	
	public void setNewCircle(Circle circle){
		circles.add(circle);
	}

	public int getX1TopBottom() {
		return x1TopBottom;
	}

	public int getX2TopBottom() {
		return x2TopBottom;
	}

	public int getY1LeftRight() {
		return y1LeftRight;
	}

	public int getY2LeftRight() {
		return y2LeftRight;
	}

	public int getxRight() {
		return xRight;
	}

	public int getyBottom() {
		return yBottom;
	}

}
 
Ich hatte mal ein ähnliches Problem, das ich dadurch lösen konnte, dass ich bei der Koordinatenbestimmung nicht die Dimensionen des Views, sondern die ClipBounds des Canvas in onDraw() genommen habe.

Vielleicht hilft Dir das ja schonmal weiter...
 
Mh..

naja man soll ja das onTouchEvent eher in der Activity Klasse haben oder?
Die onDraw befindet sich ja in der View Klasse... darum bringt mir das leider nicht viel in der onDraw dort die ClipBounds zu bestimmen....
Oder denk ich da gerade zu kompliziert?
 

Ähnliche Themen

Muecke1982
Antworten
8
Aufrufe
1.033
Skyhigh
Skyhigh
R
Antworten
2
Aufrufe
698
swa00
swa00
L
Antworten
1
Aufrufe
712
louisbgt
L
Zurück
Oben Unten