# Spielkonzep



## Exodus (14. Nov 2007)

Hallo,

Kann mir einer sagen wie ein arraybassiertes spiel eigentlich zu machen ist?

MFG
Exodus


----------



## SlaterB (14. Nov 2007)

mit der Tastatur


----------



## Guest (14. Nov 2007)

lol ne ich meine wie man es am besten realisiert?


----------



## SlaterB (14. Nov 2007)

am besten nüchtern,



wenn du weiter so allgemeine Fragen stellst, 
dann können sich die Antworten da auch nur anpassen


----------



## Exodus (14. Nov 2007)

hihi lol ^^

Ne hab schon ein paar Sachen gelesen aber wie geht dass?= man erzeugt ein array und gibt es auf einem JFrame aus mit Graphics objekt?

MFG


----------



## Exodus (14. Nov 2007)

Also ich will einen SnakeClon machen zum anfangen mal. Aber hab noch keine ahnung wie ich dass realisieren kann mit arrays. hab mir die tutorials angeschaut aber dadurch nicht viel schlauer geworden.


----------



## SlaterB (14. Nov 2007)

so ein Array muss doch erstmal einen Sinn haben, bevor man es beim Programmieren braucht,
manche Minispiele kommen vielleicht ganz ohne Array aus

ein derartiger Focus auf dieses eine von vielen Sprachelementen ist mir fremd, 
daher wirst du wohl auch nirgendwo Literatur dazu finden,

lerne allgemein mit Swing und dessen Zeichenoperationen umzugehen,
idealerweise auch die anderen Java-Grundlagen, zu denen natürlich auch Arrays gehören,
dann ergeben sich die nächsten Schritte von selbst,

zu keinem dieser wochenlangen Themen wüßte ich persönlich jetzt was spezielles zu sagen, 
falls dir noch das Buch fehlt, ist hier ein Link:
http://www.galileocomputing.de/openbook/javainsel6/

ohne derartige Grundlagen machen auch alle speziellen Tutorials zu 'Spiele in Java', so es denn welche gibt, keinen Sinn


----------



## Exodus (14. Nov 2007)

Dass Javabuch hab ich. Grundlagen kenn ich schon und die Graphics objekte auch. 
Ich weiß nur nich wie ich anfangen soll ein Snake-Clone. Mit array oder ohne?

MFG
Exodus


----------



## Exodus (14. Nov 2007)

Dass Javabuch hab ich. Grundlagen kenn ich schon und die Graphics objekte auch. 
Ich weiß nur nich wie ich anfangen soll ein Snake-Clone. Mit array oder ohne?
Wie würdest du dass realisieren?

MFG
Exodus


----------



## SlaterB (14. Nov 2007)

es fängt an mit einem leeren JFrame, einem JPanel darin, auf dem gezeichnet werden kann,
tja, beim Zeichnen des Spielfelds kommt man schnell zu einem Raster an Einzelfeldern,
da brauchst du tatsächlich ein zweidimensionales Array
oder einen Haufen if-Bedingungen in der Doppelschleife um die Felder zu durchlaufen,
ob sie in einem Array stehen oder nicht (sondern implizit bearbeitet werden)

kommt bisschen drauf an, was im Spielfeld so alles los ist,
wenn man nur einen Rand und eine Schlange und einen Punkt zum einsammeln hat, dann kann man das noch ohne Spielfeld-Array zusammensetzen,
aber irgendwo braucht man garantiert mal Array oder Listen mit versteckten Arrays,
allein schon wenn die Schlange x-mal abgebogen ist muss man ja jeden Knick vermerken,


----------



## Exodus (14. Nov 2007)

Ah ok verstehe dann die einzelnen arrays überprüfen mit for schleife und mit Graphics objekt zeichnen.

MFG DANKE


----------



## Quaxli (15. Nov 2007)

Eine Bemerkung dazu: Snake auf einem gerastertem Spielfeld sieht nicht cool aus  weil die Schlange gezwungenermaßen beim Fortbewegen ruckelt. Ich habe das vor längerer Zeit mal selbst realisiert. Es ist relativ aufwändig, das ohne Raster hinzubekommen, aber das Ergebnis sieht meines Erachtens besser aus.
Snake-Klon


----------



## SlaterB (15. Nov 2007)

1 Pixel-Raster


----------



## Quaxli (15. Nov 2007)

Dann würde ich kein Array mehr nehmen, sondern mir eine Knotenpunkt-Klasse definieren (mit x/y-Positon und neuer Richtung). Spart mind 1 unnötiges Array


----------



## Exodus (15. Nov 2007)

SO hab ma hier nen Code geschrieben. Wie mach ich jetzt am besten die kollissionsabfrage  pro punkt?


```
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Snake extends JPanel implements Runnable {
	
    static int x_snake = 50;
	static int y_snake = 100;
	static int x_rect = 7;
	static int y_rect = 7;
	static int x_rect2 = 779;
	static int y_rect2 = 500;
	static int auf_snake = 0;
	static int mund_snake = 20;
	static int Fressen_x = 100;
	static int Fressen_y = 100;
	static int Fressen_radius = 10;
	static int snake_koerper = 0;
	int radius = 7;
    static boolean up = false; 
    static boolean down = false; 
    static boolean left = false; 
    static boolean right = false; 
	
	public static void Fenster()
	{
		JFrame f = new JFrame("S N A K E      V 1.0"); 
	    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	    f.setResizable(false); 
	    f.add(new Snake());
	    f.setSize(800,600);
	    
	    KeyListener al1 = new KeyListener()
		{
			public void keyPressed(KeyEvent event) {
				
		            switch (event.getKeyCode()) { 
		            case (KeyEvent.VK_LEFT): 
		                left = true; 
		            	right=false;
		            	up=false;
		            	down=false;
		                break; 
		            case (KeyEvent.VK_RIGHT): 
		                right = true;
		            	up =false;
		            	down=false;
		            	left=false;
		                break; 
		            case (KeyEvent.VK_UP): 
		                up = true; 
		            	right=false;
		            	down=false;
		            	left=false;
		                break; 
		            case (KeyEvent.VK_DOWN): 
		                down = true;
		            	up=false;
		            	right=false;
		            	left=false;
		                break; 
		            } 				
			}

			public void keyReleased(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}

			public void keyTyped(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}		
		};
		f.addKeyListener(al1);
	    f.setVisible(true);
	}
	
	Snake()
	{
		new Thread(this).start();
	}
	
	protected void paintComponent(Graphics g) 
    { 
       super.paintComponent(g); 
       Graphics2D g2 = (Graphics2D) g; 
        
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    		   			   RenderingHints.VALUE_ANTIALIAS_ON);
       
       g2.fillOval(Fressen_x,Fressen_y,Fressen_radius,Fressen_radius); 
       g2.fillOval(200,200,10,10); 
       g2.fillOval(300,300,10,10); 
       g2.fillOval(400,400,10,10); 
       
       if((x_snake) == (Fressen_x))
       {
    	   if(y_snake == (Fressen_y + 7))
    	   {
    	   snake_koerper = 1;       
    	   }
       }
       switch(snake_koerper)
       {
       case 1:
    	   g2.fillRect(x_snake - radius * 3 - 3, y_snake - 5, 14, 10);
       }
    	
       
       if(right)
       {
       if(auf_snake <= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 50, 260);   //SnakeKopf offen rechts             
       auf_snake++;
       } if(auf_snake >= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 5, 355);   //SnakeKopf offen rechts        
       auf_snake++;
       if(auf_snake == (mund_snake + mund_snake))
       {
       auf_snake = 0;
       }
       } 
       }
       if(left)
       {
       if(auf_snake <= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 230, 260);   //SnakeKopf offen links
       auf_snake++;
       } if(auf_snake >= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 175, 355);   //SnakeKopf zu links
       auf_snake++;
       if(auf_snake == (mund_snake + mund_snake))
       {
       auf_snake = 0;
       }
       }
       }
       if(up)
       {
       if(auf_snake <= mund_snake)
       {	   
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 140, 260);   //SnakeKopf offen auf
       auf_snake++;
       } if(auf_snake >= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 85, 355);   //SnakeKopf zu auf   
       auf_snake++;
       if(auf_snake == (mund_snake + mund_snake))
       {
       auf_snake = 0;
       }
       }
       }
       if(down)
       {
       if(auf_snake <= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 320, 260);   //SnakeKopf offen ab
       auf_snake++;
       } if(auf_snake >= mund_snake)
       {
       g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 280, 355);   //SnakeKopf zu ab	   
       auf_snake++;
       if(auf_snake == (mund_snake + mund_snake))
       {
       auf_snake = 0;
       }
       }
       }
       BasicStroke stroke = new BasicStroke(14);	//Rahmen    		   							   
       g2.setStroke(stroke);
       g2.draw(new Rectangle2D.Float(x_rect,y_rect,x_rect2,y_rect2));
    }
	
	public void run()
	{
		try {
			while(true){
				if(x_snake == 23)
				{
					left = false;					
				}
				if(x_snake == 772)
				{
					right = false;
				}
				if(y_snake == 23)
				{
					up = false;
				}
				if(y_snake == 492)
				{
					down = false;
				}
					if (left) { 
						x_snake -= 1;
	                } 
	                if (right) { 
	                	x_snake += 1;
	                } 
	                if (up) { 
	                   y_snake -= 1;
	                } 
	                if (down) { 
	                   y_snake += 1;
	                }
				repaint();
			Thread.sleep(10);}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}	
	
	public static void main (String[] args)
	{
		 Snake.Fenster();
	}
}
```
MFG


----------



## SlaterB (15. Nov 2007)

g2.fillArc(x_snake - radius, y_snake - radius, 2 * radius, 2 * radius, 50, 260);   
solltest du nicht 20x im Code schreiben,
zeichneKopf(g2,50,260);
reicht völlig, den Rest kann eine Hilfsoperation machen

-----

was meinst du nun mit Kollision?
du wirst doch sowas wie eine Bewegung oder aktuelle Position haben,
diese Position musst du mit allen kritischen Vergleichen,
zum Rand hin ist es leicht x<=0 usw,
für den Fresspunkt auch leicht, 
für den Schwanz nicht so leicht, hängt davon ab wie du den Schwanz gebaut hast, woher weißt du z.B. wo du ihn malen musst?
auf die gleiche Weise musst du die entsprechenden Punkte bestimmen und einzeln vergleichen


----------



## Exodus (15. Nov 2007)

Ja wie mach ich dass, wenn dass fressen ein kreis ist mit radius 7?


----------



## SlaterB (15. Nov 2007)

also ein Bereich von 30 Punkten?
und der Schlangenkopf ist ein Punkt davon? oder auch ein Radius von 7?

idealerweise hast du (zusätzlich) ein gröberes Raster, in dem das Fressen genau einen Punkt belegt und die Schlange auch (oder 2-4 wenn breiter)

ansonsten musst du rechnen, 
z.B. Schnitt zweier Kreise: Entfernung der Mittelpunkte und beide Radien beachten

Schulmathematik


----------



## Exodus (15. Nov 2007)

Wenn ich punkt von fressen und punkt von kopf habe dann muss ja dass genau überinstimmen wenn man drauffährt.

Ich glaub ich kapier deine antwort nich ganz sry ^^.  :### 

Kannst du es genauer beschreiben? 

MFG


----------



## SlaterB (15. Nov 2007)

Standardantwort: kannst du genauer erklären waas du daran nicht kapierst?

stelle doch konkrete Fragen wie 'Wenn ich punkt von fressen und punkt von kopf habe dann muss ja dass genau überinstimmen wenn man drauffährt. '

ja, das muss sein, wenn man die Kollision einfach berechnen möchte,
so wie auf einem Schachbrett (da hast du deine Arrays), Fressen steht auf A4, Schlange kommt von A3 nach A4 -> Kollision, gleiche Position,

wenn du dagegen deine Schlange und dein Fressen auf eine mbeliebigen der ~1 Mio. Pixel (1024x800) plazierst und per Radius einen echten Kreis beschreibst, völlig freie pixelgenaue Bewegungen erlaubst,
dann musst du eben zur Kollision Mathematik einsetzen


----------



## Exodus (15. Nov 2007)

Also wenn der kreis bei sagen wir ma bei x = 200px und y = 100 ist mit einem radius von 7. Wie berechne ich dass am schnellsten wenn die schlange bei x = 204px und y = 102 ist?

Jetz glaub ich die antwort konkreter oder?  :meld: 

MFG


----------



## SlaterB (15. Nov 2007)

ich habe dir das mathematische Verfahren genannt,
Schritt für Schritt erzähle ich persönlich dir das nicht 

http://www.google.de/search?hl=de&s...t=result&cd=1&q=Schnitt+zweier+Kreise&spell=1


----------



## Exodus (15. Nov 2007)

Ja dann muss ich ja sehr sehr viele berechnungen anstellen für ein fressenkreis?


----------



## SlaterB (15. Nov 2007)

'viele' ist relativ, genauso könnte ich sagen 'nein, nur wenige'
ist dir geholfen? 

natürlich nicht den Kreis mit vielen einzelnen Punkten vergleichen, die Schlage wird sich doch auch durch einen Kreis oder ähnliches darstellen lassen können?


----------



## der JoJo (15. Nov 2007)

Sagt dir der Satz des Pythagoras etwas?
entfernung zweier Punkte:

```
Wurzel(abs((x1-x2)²+(y1-y2)²));
```
wenn diese entfernung kleiner 7 hast du einen treffer.

junge junge junge.  :roll:


----------



## SlaterB (15. Nov 2007)

wenn du zwei Qudaratzahlen addiert, dann musst du davon nicht abs() nehmen,

junge selber


----------



## Exodus (15. Nov 2007)

Ich kapier dass irgendwie nich.

Also hier ma ein ausschnitt.


```
hier koords für fressen:
	static int Fressen_x = 100;
	static int Fressen_y = 100;
	int radius = 7;

hier koords für snake:
                static int x_snake = 50;
	static int y_snake = 100;
                int radius = 14;

if(() == ())
       {    	      	   
    	   snake_koerper = 1;     	   
       }
```

So wie würdet ihr dass jetz machen??


----------



## merlin2 (15. Nov 2007)

> wenn du zwei Qudaratzahlen addiert, dann musst du davon nicht abs() nehmen, junge selber



i^2+i^2 ist negativ. :bae: 
Wurzel(-1)^2+Wurzel(-1)^2 = -2 :wink:


----------



## SlaterB (15. Nov 2007)

mit Mathematik, zunächst auf einen Blatt Papier,
wenn du exakte Fragen stellen kannst, dann gehts weiter, 

wenn dir aber zu 'Schnitt zweier Kreise' trotz Tipps, gar schon etwas Rechnung und seitenweiser google-Links nur ?? einfällt, 
dann werde ich zumindest es nicht programmieren


(ich wußte, dass jemand noch mit komplexen Zahlen kommt..)


----------



## der JoJo (15. Nov 2007)

SlaterB hat gesagt.:
			
		

> wenn du zwei Qudaratzahlen addiert, dann musst du davon nicht abs() nehmen,
> 
> junge selber



ups


----------



## ARadauer (15. Nov 2007)

1. variablen klein schreiben!
2. wenn du die entfernung zu einem punkt nicht berechnen kannst, frag den mahte lehrer oder mach rechtecke daraus.
3. schon mal was von objekt orientierter programmierung gehört? ich würd aus den punkten und deiner schlange objekte machen, dann kannst dir eine Arraylist mit punkten machen und alle mit deiner schlange vergleichen.

wenn dir das mit den kreisen zu kompliziert ist, dann mach halt rechtecke draus!



> hier koords für fressen:
> static int Fressen_x = 100;
> static int Fressen_y = 100;
> int radius = 7;
> ...




```
//Rectangle(int x, int y, int width, int height) 
Rectangle fressen = new Rectangle(100, 100, 7, 7); //stimmt jetzt nicht ganz, da die position jetzt links oben ist
Rectangle snake =   new Rectangle(50, 100, 14, 14);

if(fressen.intersects(snake)){
    //behandlung des events
}
```
 das is nur ein beispiel


----------



## Guest (25. Nov 2007)

Exodus hat gesagt.:
			
		

> Ich kapier dass irgendwie nich.
> 
> Also hier ma ein ausschnitt.
> 
> ...



wenn 
abstand der mittelpunkte < summe der radien
dann
kollision



```
double abstand(int xPos1,int xPos2,int yPos1,int yPos2)
   {
 	 return Math.sqrt(Math.pow(xPos1-xPos2,2)+ Math.pow(yPos1-yPos2,2));  
   }



   if(abstand(....)<radius1+radius2)
       snakeKoerper++;
```


----------

