# Ballspiel Teleport Einlauf/Auslauf



## RobJava (5. Jan 2012)

Hey, der folgende Code ist noch nicht ganz so wie er werden sollte, aber man sieht glaub ich ihn der Art was ich damit erreichen wollte. 
(    ex-(test.getWidth()/2)-ax = x-Position des Balles
     ey-(test.getHeight()/2)-ay = y-Position des Balles )
Allerdings bin ich mit dem Ergebnis nicht zufrieden, ich hätte gerne das der Ball aus dem Teleportgegenstück so wieder austritt als würde er gerade durchlaufen, also:


```
\
 \
  \
   \
   ( )          ( )
                  \
                   \
```

und nicht nur an eine der 4 Ecken wieder austritt und weiterläuft


```
public class Teleport {
	

	public float ex;
	public float ey;
	public float ax;
	public float ay;

	public void  tele(float ey,float ex,float ax,float ay,float telex1,
			float teley1, float telex2,float teley2,Bitmap teleport,Bitmap test,Canvas canvas,float scx, float scy){
		canvas.drawBitmap(teleport,telex1, teley1, null);
		canvas.drawBitmap(teleport,telex2, teley2, null);
		if(ex-(test.getWidth()/2)-ax+test.getWidth()>= telex1 
				&& telex1+teleport.getWidth() >=ex-(test.getWidth()/2)-ax  
				&& ey-(test.getHeight()/2)-ay+test.getHeight()>=teley1
				&& ey-(test.getHeight()/2)-ay<=teley1+teleport.getWidth()){

		
			if(scx<=0 && scy<=0 ){
				ex=telex2+teleport.getWidth();ax=0;
				ey=teley2+teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;	
			}
			if(scx>=0 && scy<=0 ){
				ex=telex2-teleport.getWidth();ax=0;
				ey=teley2+teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;		
			}
			if(scx>=0 && scy>=0 ){
				ex=telex2+teleport.getWidth();ax=0;
				ey=teley2-teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;		
			}
			if(scx>=0 && scy>=0 ){
				ex=telex2-teleport.getWidth();ax=0;
				ey=teley2-teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;		
			}
				
		
		
		}
	//	leve2 tele1
		if(ex-(test.getWidth()/2)-ax+test.getWidth()>= telex2 
				&& telex2+teleport.getWidth() >=ex-(test.getWidth()/2)-ax  
				&& ey-(test.getHeight()/2)-ay+test.getHeight()>=teley2 
				&& ey-(test.getHeight()/2)-ay<=teley2+teleport.getWidth()){

			if(scx<=0 && scy<=0 ){
				ex=telex1+teleport.getWidth();ax=0;
				ey=teley1+teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;	
			}
			if(scx>=0 && scy<=0 ){
				ex=telex1-teleport.getWidth();ax=0;
				ey=teley1+teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;		
			}
			if(scx>=0 && scy>=0 ){
				ex=telex1+teleport.getWidth();ax=0;
				ey=teley1-teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;		
			}
			if(scx>=0 && scy<=0 ){
				ex=telex1-teleport.getWidth();ax=0;
				ey=teley1-teleport.getHeight();ay=0;
				this.ex=ex;
				this.ey=ey;
				this.ax=ax;
				this.ay=ay;
				return;		
			}
			
		}
		this.ex=ex;
		this.ey=ey;
		this.ax=ax;
		this.ay=ay;
		return;
	
	}
public float gebeex(){
	return  ex;
	
}
public float gebeey(){
	return ey;
	
}
public float gebeax(){
	return  ax;
	
}
public float gebeay(){
	return ay;
	
}


}
```

Vielen dank für die Hilfe 
Und wenn ihr wisst wie man das schöner schreiben kann (weil ich glaube das ich da ziemlich viel unnötig/unschön geschrieben habe wäre das auch sehr nett  )
Lg RobJava


----------



## schlingel (5. Jan 2012)

Schau dir dein Problem doch mal genau an. Der Vektor den du beim Eintritt hast, den hast du ja auch noch beim Austritt.

Den kannst du also einfach weiterverwenden, was du benötigst ist also nur die Logik die bestimmt wo am Austrittsort dein Element erscheint.

Im folgenden stehen x und y für die Werte deines Richtungsvektors. Wobei in x gespeichert wird ob rechts oder links und y ob rauf oder runter.

Generell gibt es 2 Fälle:
1. Schräger Eintritt (also (x > 0 || x < 0) && (y > 0 || y < 0))
2. Gerader Eintritt (also (x > 0 || x < 0) ^ (y > 0 y < 0))

Im ersten Fall würde ich das ganze so machen:

```
// width ist die Breite deines Austrittportals
// height ist die HÖhe deines Austrittportals
// xAustritt ist relativ zum Punkt 0 auf der X-Achse deines Austrittportals
// yAustritt ist relativ zum Punkt 0 auf der Y-Achse deines Austrittportals
int xAustritt = x > 0 ? width : 0;
int yAustritt = y > 0 ?  0 : height; // bei der Annahme dass die Achse nach unten wächst

// voila, deine Koordinate (xAustritt, yAustritt)
```

Im zweiten Fall sieht es ähnlich aus:

```
int xAustritt = x == 0 ? width / 2 : width;
int yAustritt = y == 0 ?  height / 2 : height;
```

Im ganzen sieht dass dann so aus:

```
int xAustritt = -1;
int yAustritt = -1;

if(x > 0 || x < 0) && (y > 0 || y < 0)) {
  xAustritt = x > 0 ? width : 0;
  yAustritt = y > 0 ?  0 : height;
} else if(also (x > 0 || x < 0) ^ (y > 0 y < 0)) {
  xAustritt = x == 0 ? width / 2 : width;
  yAustritt = y == 0 ?  height / 2 : height
}
// else => x und y sind null. Wird also nicht teleportiert
```


----------



## RobJava (6. Jan 2012)

Vielen Dank für die Antwort 
Ich hab es Umgesetzt wie gesagt (glaube ich zumindest), 

```
float xAustritt = -1;
			float yAustritt = -1;

			if((scx > 0 || scx < 0) && (scy > 0 || scy < 0)) {
			  xAustritt = scx > 0 ? teleport.getWidth() : 0;
			  yAustritt = scy > 0 ?  0 : teleport.getHeight();
			} else if(also (scx > 0 || scx < 0) ^ (scy > 0 || scy < 0)) {
			  xAustritt = scx == 0 ? teleport.getWidth() / 2 : teleport.getWidth();
			  yAustritt = scy == 0 ?  teleport.getHeight() / 2 : teleport.getHeight();
			}
			xAustritt=ex;
			yAustritt=ey;	
			ax=0;
			ay=0;
			this.ex=ex;
			this.ey=ey;
			this.ax=ax;
			this.ay=ay;
			return;	
		
		}
```
Allerdings kickt es die Kugel nur ein kleines Stück zurück und lässt sie dann genauso wie vorher drauf zulaufen. Dies wiederholt sich dann unendlich.
Ich selbst finde aber den Fehler nicht :bahnhof:.
Was genau stimmt jetzt noch nicht?
Vielen Dank im vorraus 
Lg RobJava


----------



## schlingel (6. Jan 2012)

Ich vermute mal das Problem ist, das mein Code relativ zum Portal ist, die Zeichenlogik aber von einem 0-Punkt der Komponente auf die du zeichnest ausgeht.


----------

