# Hilfe bei einfachen Game



## Chaosdesigner (22. Apr 2008)

Guten Abend Leute,

Ich hab seid kurzen angefangen Java zuprogrammieren und ich hab angefangen mit meinem Dad ein kleines simples Spiel zu Programmieren, nun möchte ichs aber alleine feritg machen und ihm das so als ne Art Geschenk machen da mitr schon immer beibringen wollte zu programmieren.

Jetzt aber zu meinem Problem, in meinem "Spiel" geht es darum die Spiel Figure (bis jetzt nur ein kleiner Punkt) in die Ziel Fläche zubegeben um so ins nächste Level zukommen. Ich hab mehrere Wände eingefügt die so eine art Labyrinth bilden und jedes Level werden es mehr aber es is ein bisschen zu leicht, deswegen wollt ich das os machen das man nur alles in dem Umfeld von der Spiel Figure macht, d.h. das dur ein kleiner Teil des Spielfelds beleuchtet is und der andere dunkel ist.


Ich weiß jetzt nicht wie Weit ihr mir folgen könnt aber wenn irgentjemand mir vielleicht ein paar tips geben könnt wie ich das machen kann, wäre das echt super nett.


Vielen Dank schon mal,

mfg


----------



## The_S (23. Apr 2008)

Hast du eine 2D-Draufsicht? Falls ja einfach alles wie bisher machen, und am Ende von deiner Zeichenmethode alles in einem bestimmten Umkreis deiner Spielfigur mit schwarz überzeichnen. Ein kleines Beispiel:


```
package de.shadow.test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

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

public class ShadowTest extends JPanel implements KeyListener {

	private static final long serialVersionUID = 1L;
	
	private int xPos = 20;
	private int yPos = 20;
	private int viewFieldSize = 20;
	private int figSize = 10;
	
	private BufferedImage shadow = null;
	private int transparent = 0;
	
	public ShadowTest() {
		transparent = new Color(0,0,0,0).getRGB();
		addKeyListener(this);
		setFocusable(true);
	}
	
	private void createShadow() {
		
		shadow = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = shadow.createGraphics();
		g2.setColor(getForeground());
		g2.fillRect(0, 0, getWidth(), getHeight());
		g2.dispose();
		for (int i = xPos + figSize / 2 - viewFieldSize; i < xPos + figSize / 2 + viewFieldSize && i < getWidth(); i++) {
			if (i < 0) {
				i = 0;
			}
			for (int j = yPos + figSize / 2 - viewFieldSize; j < yPos + figSize / 2 + viewFieldSize && j < getHeight(); j++) {
				if (j < 0) {
					j = 0;
				}
				shadow.setRGB(i, j, transparent);
			}
		}
	}
	
	public void paintComponent(Graphics g) {
		
		createShadow();
		g.setColor(getBackground());
		g.fillRect(0, 0, getWidth(), getHeight());
		g.setColor(getForeground());
		g.fillRoundRect(xPos, yPos, figSize, figSize, figSize, figSize);
		// restliche Zeichenoperationen
		g.drawImage(shadow, 0, 0, this);
	}

	public void keyPressed(KeyEvent e) {

		if (e.getKeyCode() == KeyEvent.VK_UP) {
			yPos -= 2;
			repaint();
		}
		else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			yPos += 2;
			repaint();
		}
		else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			xPos -= 2;
			repaint();
		}
		else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			xPos += 2;
			repaint();
		}
	}

	public void keyReleased(KeyEvent e) {}
	public void keyTyped(KeyEvent e) {}
	
	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		frame.setContentPane(new ShadowTest());
		frame.setSize(200, 400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## Chaosdesigner (23. Apr 2008)

Vielen Dank für die schnelle antwort, fast genau so hab ich mir das vorgestellt, aber ich weiß nich genau wie ich das jetzt bei mir reinpacken soll. Wie gesagt ich bin ziemlich neu mit Java....

Naja thx nochmal


----------



## The_S (23. Apr 2008)

Ja, aber ich soll das jetzt wissen oder wie? Ohne eine einzige Zeile Code/weiteren Erklärungen deinerseits ...


----------



## Chaosdesigner (23. Apr 2008)

Ich nehme mal an das einfach nur reinkopieren nix bringen wird oder? Wie genau müsste ich das dann reinkopiern?

thx


----------



## Chaosdesigner (23. Apr 2008)

Ja fast müsste ich denn hier von meinem code reinkopiern? Ich glaub das ganze hier reinzustellen wäre nicht nötig hab ich recht?

Du meintest ich soll das bei meiner Zeichen methode reinzun aber bis jetzt hab ich nur eine bei meinem DrawPanel


```
public void paintComponent(Graphics g)
   {  
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;

            Target.show(g2);
      
            for (GameFigure gf : GameObjs)
            {
             gf.show(g2);
            }
            
            for (GameWall gw : GameWalls)
            {
             gw.show(g2);
            }
            
            
   }
```


----------



## Gast (23. Apr 2008)

Sorry ich hab mich oben ein bisschen vertippt, ich meinte natürlich "was müsste ich denn hier von meinem code reinkopiern" und "methode reinzutun". Und ich hab hier mal ne Liste von all den Classes die ich hab vielleicht könnt ihr mit jetzt sagen was ihr braucht um zuwissen wo der code reinkommt.

DrawGameApplet
StartFrame
StartButtonPanel
GameFrame
DrawPanel
GameFigure
GameFigCircle
GameFigPlayer
GameFigTria
GameWall
GameTarget
TeleporterEntry
TeleporterExit


----------



## The_S (23. Apr 2008)

Naja, das bringt mir nicht viel, aber so wie ich das sehe, muss die createShadow (natürlich auf dein Programm angepasst) an den Anfang der paintComponent-Methode und am Ende solltest du das erzeugte Bild mit deinem Graphics2D Objekt zeichnen.


----------



## Chaosdesigner (23. Apr 2008)

Ok aufjedenfall schon mal vielen dank

Aber was von deinem Bespiel könnte ich denn weglassen? Bzw welche sachen brauche ich um den shadow effekt zu erstellen?


----------



## The_S (23. Apr 2008)

Also komm, ein bisschen eigeninitiative kann man schon verlangen. So schwer ist der Code nicht. Wir können das auch andersrum aufziehen  : Was verstehst du denn an meinem Code nicht?


----------



## Chaosdesigner (23. Apr 2008)

Ja sry du hast recht, ich muss mich aml ein bisschen mehr damit beschäftigen. Also ich nehme mal an das ich alles was ab "public void keyPressed(KeyEvent e)" kommt weg lassen kann. So ich denke mal ich muss jetzt auch erstmal ein ganz neue Klasse machen die die eigenschaften vom SHadow angeben, das einzige wo ich mir überhaupt nich sicher bin is mit der paintcomponent, soll ich die in der Shadow Class lassen oder in meine alte PaintComponent einfügen? Muss ich nich auch noch irgentwas in den Constructor eingeben? 

Tut mir echt leid das ich immer so dumme Fragen stelle aber ich hab bissher alles nur mit meinem Vater gemacht und ich möchte ihm einfach mal eine Freude machen und ihm zeigen das ich das auch alleine n bisschen lernen kann. Und was kann man schon von einem 14 jährigen verlangen...^^

mfg


----------



## Chaosdesigner (24. Apr 2008)

Noch eine Frage: was wäre in deinem Code Der constructor?


----------



## filth (24. Apr 2008)

```
public ShadowTest() {
      transparent = new Color(0,0,0,0).getRGB();
      addKeyListener(this);
      setFocusable(true);
   }
```

das ist ein konstruktor


----------



## The_S (25. Apr 2008)

sorry, hatte deine Frage irgendwie übersehen. Aber irgendwie stellste dich auch n bisschen an bzw. hat man nicht gerade den Eindruck, dass du weißt, was du tust. Aber OK:

Im Prinzip brauchst du nur das


```
private BufferedImage shadow = null;
   private int transparent = 0;
```

, das im Konstruktor


```
transparent = new Color(0,0,0,0).getRGB();
```

, das in angepasster Form für dein Programm


```
private void createShadow() {
      
      shadow = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2 = shadow.createGraphics();
      g2.setColor(getForeground());
      g2.fillRect(0, 0, getWidth(), getHeight());
      g2.dispose();
      for (int i = xPos + figSize / 2 - viewFieldSize; i < xPos + figSize / 2 + viewFieldSize && i < getWidth(); i++) {
         if (i < 0) {
            i = 0;
         }
         for (int j = yPos + figSize / 2 - viewFieldSize; j < yPos + figSize / 2 + viewFieldSize && j < getHeight(); j++) {
            if (j < 0) {
               j = 0;
            }
            shadow.setRGB(i, j, transparent);
         }
      }
   }
```

und das als letzten Aufruf in deiner paintComponent Methode


```
public void paintComponent(Graphics g) {
      // Deine Sachen in paintComponent
      createShadow();
      g.drawImage(shadow, 0, 0, this);
   }
```

Und eine neue Klasse brauchst du natürlich auch nicht.


----------



## Marco13 (25. Apr 2008)

```
// Von [url]http://www.java-forum.org/de/viewtopic.php?t=68157&highlight=&sid=00ff656850aba2f36e8dd0f238ba73e8[/url]
// Modified

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

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

public class ShadowTest extends JPanel implements KeyListener {

   private static final long serialVersionUID = 1L;

   private int xPos = 40;
   private int yPos = 40;
   private int viewFieldSize = 40;
   private int figSize = 10;

   private BufferedImage shadow = null;

   public ShadowTest() {
      addKeyListener(this);
      setFocusable(true);
   }

   private void createShadow() {

      shadow = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2 = shadow.createGraphics();
      g2.setColor(Color.BLACK);
      g2.fillRect(0, 0, getWidth(), getHeight());
      g2.dispose();


      int xMin = Math.max(xPos - viewFieldSize, 0);
      int xMax = Math.min(xPos + viewFieldSize, getWidth());

      int yMin = Math.max(yPos - viewFieldSize, 0);
      int yMax = Math.min(yPos + viewFieldSize, getHeight());

      for (int i = xMin; i<xMax; i++)
      {
         for (int j = yMin; j<yMax; j++)
         {
            int dx = xPos-i;
            int dy = yPos-j;
            double dist = Math.sqrt(dx*dx+dy*dy);
            double d = (dist / viewFieldSize);
            int opacity = 0;
            opacity = (int)(255 * d*d);
            opacity = Math.min(255, opacity);
            shadow.setRGB(i, j, opacity<<24);
         }
      }
   }

   public void paintComponent(Graphics g) {

      createShadow();
      g.setColor(getBackground());
      g.fillRect(0, 0, getWidth(), getHeight());
      g.setColor(getForeground());

      for (int y=20; y<getHeight(); y+=20)
      {
          g.drawString("Hallo "+y+" Welt", 20, y);
      }

      g.fillOval(xPos-figSize/2, yPos-figSize/2, figSize, figSize);
      // restliche Zeichenoperationen
      g.drawImage(shadow, 0, 0, this);
   }

   public void keyPressed(KeyEvent e) {

      if (e.getKeyCode() == KeyEvent.VK_UP) {
         yPos -= 2;
         repaint();
      }
      else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
         yPos += 2;
         repaint();
      }
      else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
         xPos -= 2;
         repaint();
      }
      else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
         xPos += 2;
         repaint();
      }
   }

   public void keyReleased(KeyEvent e) {}
   public void keyTyped(KeyEvent e) {}

   public static void main(String[] args) {

      JFrame frame = new JFrame();
      frame.setContentPane(new ShadowTest());
      frame.setSize(200, 400);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}
```
(  )


----------



## Guest (25. Apr 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> bzw. hat man nicht gerade den Eindruck, dass du weißt, was du tust.



Das sollte auch den Eindruck machen denn ich weiß es ja eben nich, ich hoffe nur das ich dann aus diesem Beispiel lerne und somit das nächste mal nicht so dumme Fragen stellen muss. Ich denke aber mal das es somit jetzt geklärt ist, ich bedanke mich an alle die hier geholfen habe und noch mal entschuldigung für meine dummen Fragen.

thx

mfg


----------

