Tic Tac Toe

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von krackmoe, 09.03.2011.

  1. krackmoe, 09.03.2011 #1
    krackmoe

    krackmoe Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2011
    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;
    	}
    
    }
    
    
     
  2. DieGoldeneMitte, 09.03.2011 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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...
     
  3. krackmoe, 09.03.2011 #3
    krackmoe

    krackmoe Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    02.03.2011
    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?
     

Diese Seite empfehlen