# Strategie-Spiel



## christian8287 (6. Apr 2005)

Hallo!

Ich will ein Strategiespiel programmieren. Es soll so ähnlich werden wie Medieval, Rome, Hearts of Iron, oder so. Man hat halt eine Karte, wo Burgen in großer und in kleiner form daraufgebaut werden sollen, ... 

Meine erste Frage wäre, ob jemand schon Erfahrung mit so was hat oder einfach nur eine Idee, wie die Strategiekarte am besten zu realisieren wäre. Ich muss halt für jede provinz ein eigenes Feld haben. Ich glaube halt, dass es nicht viel anders gehen wird, als dass ich jede provinz als eigenes Bild einfüge. Dabei stellt sich wieder das problem, dass ich dann wahrscheinlich so eine art virtuelle karte brauchen werde. Weil ja die karte nich nur auf einmal sichtbar werden soll, sondern groß sein soll und man scrollen kann.

Ein weiteres problem werde ich wahrscheinlich mit den updates auf der karte haben. Vorerst sollen einmal keine Kämpfe statt finden. Da hätt ich sowieso momentan keine ahnung wie ich das realisieren sollte. Na ja ich hoffe, dass mir im bezug auf das noch so einiges einfallen wird.

Danke schon mal für die Hilfe!

mfg,
Christian.


----------



## DarKestSun (7. Apr 2005)

gibt zur zeit ne menge solcher themen.
schau mal ob bei den anderen ne antwort auf deine frage ist


----------



## Guest (7. Apr 2005)

ich das mal gemacht (aber in C)

- karte mit vektoren gezeichnet (nodes+links), diese dann im eigenen format abgespeichert
- mit füllalo die einzelnen bereiche gefüllt (jedes land eine farbe)
- mittelpunkt der pixel eines landes bestimmt (headquater als point(x,y))

identifizierung des landes bei mausklick: wieder füllalo, bis der pixel des headquaters gefunden wurde (oder anhand der landesIDfarbe: land0="farbe" 0, land1="farbe" 1 usw.)

darstellung: 
-wieder füllalgo, aber füllen mit prozeduraler textur (je nach besitzer und zustand)
-grenzen (die vektoren) auf extra bild, dieses "blurren" und auf die "grafikübersichtskarte" setzen 

im prinzip hatte ich 2 karten, eine mit den pixel der landesIDfarbe und eine schönere (mit den texturen) zum anzeigen

ist zwar aufwändig, hat aber den vorteil, dass du neue karten zeichnen kannst (nodes+links) (das programm zum zeichnen halt auch selber machen), die "schöne" grafische darstellung dann von alleine gemacht wird.

fürn anfang würde ich einen füllalo (floodfill oder so) machen, dann die bereiche der länder von den headquaters aus füllen.
dazu kannst du die karte auch mit nem malprogramm zeichnen und die headquaterpunkte in ein txtfile schreiben. beim zeichnen darauf achten, dass die grenzen keine lücken haben (wegen floodfill).


----------



## christian8287 (9. Apr 2005)

Ich hab jetzt ein bisschen im Forum gesucht, aber leider nicht das passende gefunden. Mein Problem ist momentan, wenn der Benutzer irendwo auf das spiel klickt, dass ich mir dann das land bestimme auf das er geklickt hat. Wie kann man das machen. Ich weiß zwar wie ich mir den Punkt des Mauszeigers bestimme, aber nicht, wie ich mir das Land dann bestimmen kann. Sind ja keine Rechtecke, sondern eine Grafik.

Hoffe mir kann wer helfen!

mfg,
christian.


----------



## Hansdampf (9. Apr 2005)

speicher die karte für jedes land komplett mitm malprogramm ab, bei jedem bild nur ein land stehenlassen, die anderen mit schwarz wegradieren. beim mausklick alle images durchprüfen, bei demjenigen mit pixel!=schwarz : bingo.

ist der noob-ansatz (braucht viel ram), komprimiert auf der festplatte wirds keinen unterschied machen.


----------



## christian8287 (11. Apr 2005)

Danke für die vielen Antworten!

Aber wie soll ich das mit den Karten machen. Ich will, dass immer alle angezeigt werden, die jemand besitzt. Aber das geht glaub ich zumindest so nicht. Kann ich ein Land (ist immer unregelmäßig) irgendwie einfärben?
Wenn das gehen würde, dann wäre mein Problem gelöst.

mfg,
christian.


----------



## Hansdampf (11. Apr 2005)

Das hab ich oben schon geschrieben (Gast).
Entweder du machst dir einen pixelbasierten Füllalgorithmus (wie FloodFilll) oder du benutzt die java API zum füllen von Polygonen. Die Polygone musst du dann halt selber bestimmen.

Beim eigenen FloodFill kannst du dann bei setPixel(x,y) machen : neuer pixel=mix(alterpixel,spielerfarbe); 


```
final public static int mix(int a, int b)
{
return 0xFF000000|((a&0xfcfcfc)>>1)+((b&0xfcfcfc)>>1);
}
```

Damit der Füllalgorithmus mit Einfärben funktioniert, brauchst du halt 2 Maps, eine zum Füllen (in Landesfarbe 0,1,2), die andere für die Mischfarbe.

Keine Angst, geht auch einfacher: nimm einfach das Image des jeweiligen Landes, kopier es in ein neues und gehst mit mix(a,b) über die Pixel, dann setzen.


----------



## christian8287 (11. Apr 2005)

hi!

jetzt glaub ich weiß ich was du meinst. Du meinst wahrscheinlich ich soll ca. den Mittelpunkt eines Landes herausfinden und dann einfach die Farbe aller nebenstehenden Pixel ändern bis ich auf einen schwarzen Pixel stoße. Würde funktionieren. Weiß jemand, ob es eine Methode gibt, die die Farbe eines Pixels zurückliefert und kann man die Farbe eines einzelnen Pixels setzen?

Danke!!

mfg,
christian.


----------



## Hansdampf (11. Apr 2005)

ok, bei der einfachsten Version (ohne Füllalgo, ist zu aufwändig) machst du folgendes:
1) komplette Karte im Malprogramm laden
2) bei 20 Ländern : 20 mal abspeichern (karte01.gif, Karte 02.gif,...)
3) Bilder nacheinander laden, dann alle Länder außer Land i wegradieren (nur noch ein Land im Bild, aber an der Origialposition), alle anderen Pixel sind schwarz


im Programm:
1) alle Bilder laden (macht ca. 40 mb bei 32 bit Farbtiefe und Kartengröße 1000*1000)


void zeigeKarte(){
for(int i=0;i<20;i++)setzeBild(i);
}

void setzeBild(int landIndex){
bild=getCopyof(bild[landindex]);

färbeBildEin(bild,farbeBesitzer);
bild.aufdenSchirm(); // transparent setzen (schwarze Pixel werden nicht gesetzt)
}


void färbeBildEin(Bild bild,int farbe){
int[] b=getIntsOf(bild);
for(int y=0;y<bild.h;y++)
for(int x=0;x<bild.w;x++){
int index=y*w+x:
int alt=b[index];
if(alt!=0xff000000)  //das ist schwarz  0xffff=rot 0xff00ff=grün 0xff0000ff =blau  (alpha+RGB) 
bild[index]=mix(alt,farbe);
}}


das int[] bekommst du mit 
DataBuffer db=((BufferedImage)image).getRaster().getDataBuffer();
DataBufferInt dbi=(DataBufferInt)db;
int[] b=dbi.getData();


das ganze geht auch einfacher mit der java image api. Aber Pixeloperationen sind geil,


----------



## christian8287 (12. Apr 2005)

hi!

so jetzt hab ich mal die vorgehensweise heraussen. Ich würde nur mehr hilfe bei ein paar programmiersprachen spezifischen fragen benötigen. Wie kann ich abfragen welche Farbe ein pixel hat? Ich habe eine JTextPane, in der ich ein ImageIcon hineingelegt habe (große Karte). Dann habe ich oben links noch eine kleine Karte -auch ImageIcon, aber ohne JTextPane (Übersichtskarte, wer welche Gebiete hat. Im ImageIcon will ich das jetzt so machen, dass ich jedem land eine farbe gebe und den bereich des landes mit dieser farbe ausfülle.

Dabei habe ich mir das folgendermaßen überlegt:
Wie in vorigen Antworten geschrieben, will ich für jede provinz einen mittelpunkt auswählen, an dem ich mich orientiere. Wenn jetzt ein land eingenommen wird, bestimme ich mir zuerst den mittelpunkt und von da ausgehend, mach ich alles in der bestimmten farbe, bis ich auf einen schwarzen pixel treffe. Dabei weiß ich jedoch nicht, wie ich das abfragen kann, ob ein Pixel schwarz ist. Malen dürfte glaube ich nicht so schwer sein. Dazu muss ich eigentlich nur für jedes pixel, dass sich in der eingenommenen provinz befindet ein drawLine(x,y,x,y) machen.

Müsste eigentlich so funktionieren oder?

Danke!

mfg,
christian.


----------



## Hansdampf (12. Apr 2005)

also noch ein letztes mal:

```
int R=0xffff0000;
int G=0xff00ff00;
int B=0xff0000ff;
SCHWARZ=0xff000000;
int WEISS=0xffffffff;

z.B. int 
hellblau=mix(B,WEISS);

void setPixel(int[] i,int x,int y,int farbe){
i[y*image.width+x]=farbe;
}

int getPixel(int[] i,int x,int y){
return i[y*image.width+x];
}
```
an deiner Stelle würde ich erst mal mit farbigen Kreisen für die Länder anfangen. Du wirst nie mit dem Spiel fertig, wenn du schon bei der ersten Hürde lange hängen bleibst (nicht böse gemeint). Kümmer dich erstmal drum, dass das Spiel überhaupt ein wenig spielbar ist, danach kann man immer noch optisch aufpolieren. Dann bekommst du auch ein Gefühl dafür, welche Probleme noch auf dich zukommen (zB. Graphentheorie: Wege finden, welches Land ist erreichbar und wie weit entfernt usw etc). Wichtig ist, dass das Spiel überhaupt fertig wird (sieht nämlich bisher nicht so aus). Überspitzt gesagt: mach erstma eine Textversion, die FUNKTIONIERT.
Das mit den Kreisen ist ernst gemeint. Kannst ja den Radius der Landesgrösse anpassen, füllen mit Spielerfarbe und nochmal kleine Kreise rein für Burgen, Städte und so.


----------



## christian8287 (13. Apr 2005)

Danke!

Ich weiß deine Hilfe wirklich sehr zu schätzen! Das Spiel brauch ich übrigens für die Schule, ist eine Aufgabe, und da muss ich halt schauen, dass es gut wird.

Aber ich glaube, bis auf das, dass der Füllalgorithmus viel rechenzeit braucht, wird er ja nicht so schwer sein. Ich hab mir das folgendermaßen vorgestellt:

1) alle Pixel bestimmen, die eine Provinz belegt
    -) solange kein schwarzes Pixel festgestellt wird, jedes pixel in ein feld speichern
2) for Schleife wo jedes Pixel auf eine bestimmte Farbe (die Farbe des Landes) gesetzt wird.

Das ist wirklich wichtig für mich. Wie gesagt, ich finde es total nett von dir, dass du mir schon soviele Beiträge geschrieben hast, aber ich würde, das was ich mir vorgenommen habe, auch gerne durchbringen. Wenn du z.B. auch zu diesem Thema (Füllalgorithmen, Karten zeichnen, ...) ein gutes Buch weißt würde ich es mir kaufen, weil es mich sehr interessiert.

Danke!

mfg,
christian.


----------



## Hansdampf (13. Apr 2005)

danke für die Blumen!
nach 3 Sekunden googlen:  http://www.cs.rit.edu/~swm/cs2/4/FloodFill.java (sehr billig und langsam, reicht aber, habs nicht ausprobiert)
Damit musst du auch keine Pixel für jedes Land merken.
Dann machs halt doch so, wie ichs ganz am Anfang vorgeschlagen hab:
Karte malen, einmal schön mit Schattierungen, Wald, Berge, blabala und einmal nur die Grenzen in schwarz.
Dann lässt du im Programm den Floodfill über die Pixel mit der Grenzkarte laufen, färbst bei jedem Pixel parallel die "schöne" Karte nach Besitzerfarbe. (Dabei wird die Grenzkarte nicht angezeigt)
Einen Punkt pro Land der Grenzkarte aufschreiben (z.B. 100,130), an dem Floodfill startet.
Bei dem FloodfillCode wird ein int[][] genutzt, wie man ein int[] vom Image bekommt, weisst du ja.
int[][] convert(int[] i){
int[][] a=new int[width][height];
for(int y=0;y<height;y++)
for(int x=0;x<width;x++)
a[x][y]=i[y*width+x];
return a;
}
müsste gehen...

Landschaften kann man supi mit PerlinNoise generieren. Kauf keine Bücher, Google hat es.


----------



## christian8287 (15. Apr 2005)

Sorry, dass ich nochmal was fragen muss, aber ich bekomm da immer eine NullPointerException.

Eigentlich weiß ich ja wie ich das Feld mit den Farben bekomme:

```
bi = (BufferedImage)lLittleImage.createImage(lLittleImage.getWidth(),lLittleImage.getHeight());
        
        int []x = new int[bi.getWidth()*bi.getHeight()];
        bi.getRGB(0,0,bi.getWidth(),bi.getWidth(),x,0,1);
        
        for(int i=0;i<x.length;i++) {
            System.out.println(x[i]);
```

Aber hier bekomm ich schon in der 1. (!) Zeile eine NullPointerException. Woran kann das liegen? Eigentlich müsste man mit createImage ein Image zurückbekommen, dass dann auf BufferedImage gecastet wird und sich dann problemlos in ein BufferedImage speichern lassen sollte (oder?).

Danke!

mfg,
christian.


----------



## Hansdampf (15. Apr 2005)

> bi = (BufferedImage)lLittleImage.createImage(lLittleImage.getWidth(),lLittleImage.getHeight());


ist lLittleImage ne Klasse? ewa ein Object?  ???:L 
mach dir ne WrapperKlasse für Images (namens Screen) und simsalabim werden alle Problem weg sein.


```
class Screen(){
public int w,h;
public int[] m;
public BuferedImage image;
public Screen(int w,int h){
this.w=w;
this.h=h;
image =new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
DataBuffer db=image.getRaster().getDataBuffer();
DataBufferInt dbi=(DataBufferInt)db; 
m=dbi.getData();

public void setPixel(x,y,int c){m[y*w+x]=c;}
public int getPixel(x,y)...
}
}

public static int[] getPixels(Image im, int width, int height)
{
int i[]=new int [width*height];
PixelGrabber pg= new PixelGrabber(im,0,0,width,height,i,0,width);
try{pg.grabPixels();}catch (InterruptedException e){}
return i;
}


laden mit ImageIO.read(file), dann convertieren mit:
public static Screen fromImage(BufferedImage im)
  {
  int w,h;
  w=im.getWidth();
  h=im.getHeight();
 
  Screen s=new Screen(w,h);
int[] m=m = getPixels (im,w,h);
System.arraycopy(m,0,s.m,0,w*h);

  return s;
}
```

edit: im fromImage() hab ich einen Fehler korrigiert, sind vielleicht noch mehr drin.
maps: http://www.profantasy.com/


----------



## christian8287 (15. Apr 2005)

hallo!

Na ja ein erster Erfolg ist geschafft! Ich habe die Provinz Navarra in Spanien gelb gefärbt!!! Das einzige Problem ist, dass es ca. 10 min. dauerte. Könntest du vl. schauen ob ich einen fehler in meinem Algorithmus habe, oder ist es normal, dass das so lange dauert?


```
/*
 * NewGame.java
 *
 * Created on 11. April 2005, 12:23
 */

/**
 *
 * @author  dv20010517
 */
package War;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.awt.image.*;

public class NewGame extends JDialog{
    
    private JButton bOK = new JButton("Ok"); // auf OK um Spiel zu starten
    private JButton bCancel = new JButton("Abbrechen"); // abbrechen kein neues spiel
    private JList lLaender = new JList(); // liste mit ländern
    private String []laenderString = {"Das Heilige Römische Reich","Frankreich","England","Russland","Italien"} ;
    private War father; // der Vater, der den Sohn Dialog aufruft
    private MyJTextPane jtp = new MyJTextPane(); // eine modifizierte JTextPane mit ca. den gleichen funktionen
    private ImageIcon bigImage = new ImageIcon(); // große Karte
    private ImageIcon littleImage = new ImageIcon(); // kleine Karte oben links
    private JTabbedPane tp = new JTabbedPane(); // tabbed pane für gebäude und soldaten
    private JButton bQuitRound= new JButton("Runde beenden"); // runde beenden neues jahr beginnen

    
    /** Creates a new instance of NewGame */
    public NewGame(War father) {
        this.father =father;
        lLaender.setListData(laenderString);
        bOK.addActionListener(new ActionListener() { // wenn neues spiel gestartet werden soll
            public void actionPerformed(ActionEvent e){
                createNewGame();
            }
        });
        bCancel.addActionListener(new ActionListener() { // wenn kein neues spiel gestartet werden soll
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        customizeLayout();
    }
    
    public void customizeLayout() { // layout festlegen
        JPanel p = new JPanel(new FlowLayout());
        JPanel pButtons = new JPanel(new GridLayout(2,1));
        p.add(new JLabel("Wählen Sie ein Land aus"));
        p.add(lLaender);
        pButtons.add(bOK);
        pButtons.add(bCancel);
        p.add(pButtons);
        this.getContentPane().add(p);
        setResizable(false);
        setModal(true);
        father.setTitle((String)lLaender.getSelectedValue());
        pack();
    } 
    public void createNewGame() {
        if(!lLaender.isSelectionEmpty()) {
            father.getContentPane().add(new JScrollPane(jtp,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS),BorderLayout.CENTER);
            bigImage = new ImageIcon(Toolkit.getDefaultToolkit().getImage("C:\\Dokumente und Einstellungen\\Christian\\WarAndDiplomacy\\src\\War\\Europe.jpg").getScaledInstance(1824, 1633, Image.SCALE_SMOOTH));
            littleImage = new ImageIcon(Toolkit.getDefaultToolkit().getImage("C:\\Dokumente und Einstellungen\\Christian\\WarAndDiplomacy\\src\\War\\Europe.jpg").getScaledInstance(324, 133, Image.SCALE_SMOOTH));
            int [][]a= getArray(littleImage.getImage(),littleImage.getIconWidth(),littleImage.getIconHeight());
            int []newA;
            newA=convert(fill2(22,80,Color.YELLOW.getRGB(),a));
            MemoryImageSource mis = new MemoryImageSource(littleImage.getIconWidth(),littleImage.getIconHeight(),newA,0,littleImage.getIconWidth());
            littleImage = new ImageIcon(Toolkit.getDefaultToolkit().createImage(mis));
            jtp.insertIcon(bigImage);
            jtp.setEnabled(false);
            JPanel pNorth = new JPanel(new GridLayout(1,2));
            JPanel pBuildingTab = new JPanel(new FlowLayout());
            JPanel pArmyTab = new JPanel(new FlowLayout());
            tp.addTab("Gebäude",pBuildingTab);
            tp.addTab("Einheiten",pArmyTab);
            WarLabel lLittleImage = new WarLabel(littleImage);
            pNorth.add(lLittleImage);
            pNorth.add(tp);
            pNorth.add(bQuitRound); 
            JPanel pFloat = new JPanel(new FlowLayout());
            pFloat.add(pNorth);
            father.getContentPane().add(pFloat,BorderLayout.NORTH);
            father.getContentPane().repaint();
            dispose();
        }
        else
            JOptionPane.showMessageDialog(this,"Sie haben kein Land ausgewählt. Sie müssen eines\nauswählen um ein neues Spiel starten zu können.\nWenn sie kein neues Spiel starten wollen, klicken\nsie auf abbrechen.","Kein Land gewählt",JOptionPane.OK_OPTION);
    }
    
    private int[] convert(int[][] a) {
        int j=0;
        int []newA = new int[a.length*a[0].length];
        for(int i=0;i<a.length*a[0].length;i++) {
            if(i%a.length==0&&i!=0)
                j++;
            newA[i] = a[i-j*a.length][j];
        }
        for(int i=0;i<newA.length;i++)
            System.out.print(newA[i]+" ");
        return newA;
    }
    
    private int[][] fill2(int x, int y,int color, int [][]a) {
        System.out.println(a[x][y]);
        if(a[x][y]==-1) {
            System.out.println("CL UMGESTELLT");
            a[x][y] = color;
            a=fill2(x,y+1,color,a);
            a=fill2(x,y-1,color,a);
            a=fill2(x+1,y,color,a);
            a=fill2(x-1,y,color,a);
        }
        for(int i=0;i<a[0].length;i++)
            for(int j=0;j<a.length;j++)
                System.out.print(a[j][i]+" ");
        System.out.println();
        return a;
    }
    
    private int[][] getArray(Image img, int width,int height) {
        
        int []array=new int[littleImage.getIconWidth()*littleImage.getIconHeight()];
        PixelGrabber grab = new PixelGrabber(img,0,0,width,height,array,0,width);
        try {
            grab.grabPixels();
        }
        catch(InterruptedException e) {}
        int[][] a=new int[width][height]; 
        for(int y=0;y<height;y++) 
            for(int x=0;x<width;x++) 
                a[x][y]=array[y*width+x];
        return a;
    }
}
```

Wenn du vl. einen Fehler im algo siehst, dann sag mir bitte bescheid. Sonst werde ich es so lassen. Ich glaube nicht, dass ich einen besseren algorithmus für das füllen verstehen würde   ???:L 

Besten Dank!

mfg,
christian.


----------



## Hansdampf (16. Apr 2005)

wenn du überall die System.out.println wegmachst, dürfte es ungefähr 1000 mal schneller sein. Oder 20000 mal.
So einfach kann das sein


----------



## christian8287 (16. Apr 2005)

Ja, stimmt danke. Jetzt geht es schneller. War nur zum kontrollieren. Das dürfte jetzt mal funktionieren, jetzt muss ich halt schauen wie ich einen algorithmus entwickle mit dem ich den mittelpunkt eines landes herausfinde, um dieses zu identifizieren. Weißt du wie man so einen algorithmus nennt und vl. eine Internetseite zum nachlesen?

Danke!

mfg,
christian.

P.S.: Danke für den link mit den Maps, ist voll super und bezüglich der Schnelligkeite hattest du auch recht. Geht jetzt ca. 20000 mal oder noch mehr schneller.


----------



## Hansdampf (16. Apr 2005)

alle Mittelpunkte bekommst du so: färbe jedes Land mit einer Farbe 0 bis n (also die Zahlen 0,1,2,3,4,5,6),
dann über das ganze Bild
int[] countx=new int[n];
int[] county=new int[n];
int[] count=new int[n];
for y
for x
{
int index=map.getPixel(x,y);
countx[index]+=x;
county[index]+=y;
count[index]++;
}

for i to n 
countx_/=count;
county/=count;
System.out.println(""+countx+" "+county);

fertsch. in count hast du dann praktischerweise die Landesgrösse in Pixel (vielleicht für Bevölkerungszahl oder so)_


----------



## christian8287 (16. Apr 2005)

hallo!

Wie soll das mit dem einfärben der länder funktionieren? Das verstehe ich leider noch nicht ganz, da ich ja den mittelpunkt brauche um mein floodfill anwenden zu können.

Die zweite frage wäre bezüglich des algorithmus: Was sind die variablen countx und county? Warum machst du ein getPixel? Das liefert ja einen Farbwert. Was ist wenn der Wert z.B. -43....... ist. Den Index kann man dann nicht ansprechen (meine Grenzen haben diesen wert.

Die Fragen wären noch offen  ???:L 

Danke!!!

mfg,
christian.


----------



## Hansdampf (16. Apr 2005)

Achso, im Malprogramm kannst du vielleich keine Farbe 0 einstellen sonder nur 0xff000000. 
Also in der Schleife: 
int col=getPixel(x,y);
col-=0xff000000;
if(col!=Grenzfarbe) //falls das schwarz ist, also 0xff000000 dann mal im Malprogramm mit 1bis n statt 0 bis n malen.
{
col--;
..
..
..
}

countx und y addiert die gesamten Koordinaten der Pixel eines Landes. Teilt man das durch die Anzahl der Pixel, bekommt man den Mittelpunkt.

Eine viel elegantere Möglichkeit, bei der du die Länder in beliebigen Farben malen kannst:


int[] farben=new int[anzahllaenderOderMehr]
int index=0;

boolean farbeSchonDrin(int col){
for(int i=0;i<index;i++)if(farben_==col)return true;
farben[index]=col;
index++;
return false;
}


for y
for x
{
int c=getPixel(x,y);
if(c!=grenzfarbe);
if(!farbeSchonDrin(c))System.out.prinln("neue Farbe gefunden "+c);
}

for i to index System.out.prinln(" Farbe +"i+farben);

Dann kannst du in der Mittelpunktschleife die Farbe auf einen index "mappen":
in farbe2index(int col){
for(int i=0;i<index;i++)if(farben==col)return i;
System.out.prinln("shit :farbe nicht gefunden");
return 0;
}

edit :schreib dir
public void p(String s){
//System.out.println(getClass.getName()+":"+s);
}

spart Zeit und Nerven. Bei Testmodus halt auskommentieren_


----------



## christian8287 (17. Apr 2005)

Hi! Ich wollte nur noch einmal nachfragen und sehen, ob ich deinen code verstanden habe:


int[] farben=new int[anzahllaenderOderMehr]  // ok das ist klar. einfach ein feld wo alle farben reinkommen
int index=0;                                                 // der index, wird glaub ich am ende die anzahl der länder sein oder??

boolean farbeSchonDrin(int col){                 // wann verwende ich diese methode?
for(int i=0;i<index;i++)if(farben_==col)return true; 
farben[index]=col; 
index++; 
return false; 
} 


for y 
for x 
{ 
int c=getPixel(x,y);                             // ist damit die farbe des pixels gemeint?
if(c!=grenzfarbe); 
if(!farbeSchonDrin(c))System.out.prinln("neue Farbe gefunden "+c); // bringt das was?
} 

for i to index System.out.prinln(" Farbe +"i+farben);  // wieso das? ist das nicht overhead?

Dann kannst du in der Mittelpunktschleife die Farbe auf einen index "mappen": // mappen?
in farbe2index(int col){ 
for(int i=0;i<index;i++)if(farben==col)return i; // dadurch bekomme ich aber nicht den mittelpunkt
System.out.prinln("shit :farbe nicht gefunden"); 
return 0; 
} 

edit :schreib dir 
public void p(String s){             // keine Ahnung was diese methode macht
//System.out.println(getClass.getName()+":"+s); 
} 

Könntest du mir vl. noch meine Fragen beantworten, weil den mittelpunkt zu finden doch eine sehr wichtige sache für mein spiel ist.

Vielen Dank!

mfg,
christian._


----------



## Hansdampf (17. Apr 2005)

1)ja
2)wird inner Schleife 13 Zeilen drunter benutzt
3)ruft die Methode 13 Zeilen drüber auf und erhöht den index, schreibt die neue Farbe rein
4)übersichtshalber. ja.
5)mappen: von einem Wertebereich in einen anderen transformieren. ZB Farbe->Zahl. Hier mit Hilfe einer Tabelle int[]
6) stimmt. Aber den index der Farbe!

dann zum Mittelpunkte ausrechen:
for x
for y
{
c=getPixel(x,y); //Farbe
if(c==grenzfarbe || c==hintergrundfarbe)continue; //das muss eigentlich auch noch beim Farbenzählen rein.
int index=col2index(c); //index
count[index]++;
.
.
}

das int[] mit den Farbwerten kannst du danach wegschmeissen, wird nur zum Mittelpunktausrechen und Farbenzählen (=Länderanzahl) gebraucht. 

damit rechnest du genau gesagt den Schwerpunkt eines Landes aus.
Wenn du den Anfangs- und Endpunkt einer Linie addierst und durch 2 teilst, bekommst du die Mitte.
Hier addierst du alle Koordianten und teilst durch die Anzahl der Koordinaten.


----------



## christian8287 (20. Apr 2005)

Ok, ich hab mir das ganze mit dem Mittelpunkt noch einmal überlegt.

Ich glaube am praktischsten wäre es einen MouseListener zu programmieren und dann die koordinaten auszugeben und für jedes land hart einzutragen. Dann hab ich auch gleich immer den Namen der Provinz und kann in dann am bildschirm ausgeben. Das wäre dann auch noch ganz praktisch in einer Map (vl. HashMap) anzulegen.

Das einzige Problem könnte auftreten: Ich richte mein Spiel immer nach der Auflösung des Bildschirms, aber da ich meine Map in ein FlowLayout stecke, glaub ich kann da nicht viel passieren, oder??

Ich meine halt dass dies eine einfache, performante und zielstrebige Lösung ist. Nur ob es so funktioniert ist eine andere sache   

Danke!

mfg,
christian.


----------



## Guest (13. Mai 2005)

Hallo, 

ich suche jemanden, der mir nach Vorgaben ein J2ME-Programm für mein Händy schreibt. Wäre gerne dabei um zu sehen wie es in etwa funktioniert und wie das Programm auf mein Handy kommt. 

Am besten kommt derjenige aus der Nähe von Köln und kann dann zu mir in die Firma kommen. Oder er kommt aus dem Raum Aachen und kann zu mir nach Hause kommen. Das ganze natürlich nicht umsonst. Den Spaß würde ich mir schon EUR 10,-/Std. kosten lassen. 

Bei Interesse bitte Mail an world-on-the-web@web.de 

Beste Grüße an Alle 
Mario Pfeiffer


----------



## christian8287 (15. Mai 2005)

hallo!

nun will ich die armeen pro land aufstellen. Ich hab jetzt einen code geschrieben:


```
public void setArmies(HashMap provinces, HashMap countryColor) {
        Iterator it = provinces.values().iterator();
        int i=0;
        for(;it.hasNext();i++) it.next();
        p = new Point[i+1];
        c = new Color[i+1];
        it = provinces.values().iterator();
        for(i=0;it.hasNext();i++) {
                ProvinceState ps = (ProvinceState)it.next();
                if(ps.isVisible()) {
                    p[i] = new Point(ps.getPoints()[0].x*8,ps.getPoints()[0].y*8);
                    c[i] = (Color)countryColor.get(ps.getCountry());
                }                
        }
        repaint();
    }
    public void paint(Graphics g) {
        super.paint(g);
        if(c!=null)
            for(int i=0;i<c.length&&i<p.length;i++) {
                try {
                g.setColor(c[i]);
                }catch(NullPointerException e) { System.out.println("Color "+c[i]);}
                try {
                g.fillOval(p[i].x,p[i].y, 10,10);
                }catch(NullPointerException e) { System.out.println(i+" "+p.length);}
            }
    }
```

Das Problem dabei ist, wenn ich auf das Image einen Kreis zeichne und dann die Farbe eines Pixels innerhalb des Kreises haben will, dann bekomm ich die Farbe des Bildes und nicht des Kreises. Ich weiß es müsste eine Möglichkeit geben von einer Component ein Bild zu bekommen und so irgendwie dann die Farbe des Kreises ermitteln zu können, aber wenn ich die Farbe habe, weiß ich trotzdem nicht in welchem Land die Armee steht (das müsste ich wahrscheinlich zusätzlich in irgendwie abspeichern, vl. mit einem Objekt (innere Klasse)??).

Hat jemand eine Idee, wie man das am besten hinbekommen könnte? Mir sind da leider mittlerweile schon die Ideen ausgegangen.

Danke!!

mfg,
Christian.


----------

