Spielkonzep

Status
Nicht offen für weitere Antworten.
E

Exodus

Gast
Hallo,

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

MFG
Exodus
 
S

SlaterB

Gast
am besten nüchtern,



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

Exodus

Gast
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
 
E

Exodus

Gast
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.
 
S

SlaterB

Gast
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
 
E

Exodus

Gast
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
 
E

Exodus

Gast
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
 
S

SlaterB

Gast
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,
 
E

Exodus

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

MFG DANKE
 

Quaxli

Top Contributor
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
 

Quaxli

Top Contributor
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 :)
 
E

Exodus

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

Code:
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
 
S

SlaterB

Gast
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
 
E

Exodus

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

SlaterB

Gast
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
 
E

Exodus

Gast
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
 
S

SlaterB

Gast
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 ;)
 
E

Exodus

Gast
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
 
E

Exodus

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

SlaterB

Gast
'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

Bekanntes Mitglied
Sagt dir der Satz des Pythagoras etwas?
entfernung zweier Punkte:
Code:
Wurzel(abs((x1-x2)²+(y1-y2)²));
wenn diese entfernung kleiner 7 hast du einen treffer.

junge junge junge. :roll:
 
S

SlaterB

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

junge selber ;)
 
E

Exodus

Gast
Ich kapier dass irgendwie nich.

Also hier ma ein ausschnitt.

Code:
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??
 
S

SlaterB

Gast
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..)
 

ARadauer

Top Contributor
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;

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

Code:
//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
 
G

Guest

Gast
Exodus hat gesagt.:
Ich kapier dass irgendwie nich.

Also hier ma ein ausschnitt.

Code:
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??

wenn
abstand der mittelpunkte < summe der radien
dann
kollision


Code:
 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++;
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben