• Login

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

1

Saturday, May 7th 2011, 11:58am

Kleines Spiel (SuM)

Hallo zusammen,

In Info arbeiten wir seit diesem Jahr mit Java, allerdings mit dem SuM- Packet (Stifte und Mäuse).
Da ich immer als erster mit den Aufgaben dazu fertig bin, soll ich nun ein Spiel programmieren, das, wenn möglich,
alles verbindet, was wir bisher gemacht haben, unter anderem Listen (mit Nachfolger = 0) und GUI (allerdings nicht ausführlich).
Dabei kam mir ein rundenbasiertes Kampfspiel mit 4 auswählbaren Helden für 2 Spieler in den Sinn.

Nun habe ich das erste Problem:
Bei dem SuM- Packet müsste ich die Helden aufwändig per Buntstift zeichnen lassen. Da wäre
es doch einfacher eine Grafik auf dem Bildschirm ausgeben zu lassen.
Dazu habe ich folgenden Befehl gefunden:

Source code

1
meinBildschirm.paint(Graphics g)

Allerdings verstehe ich nicht genau, wie der Befehl funktioniert.
Kann mir da einer weiterhelfen?

EDIT:
Habe jetzt was ausprobiert, aber ich bekomme eine
NullPointerException in sum.multimedia.Bild -.-
Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import sum.kern.*;
import sum.multimedia.*;
 
public class Spiel
{
 
	public static void main(String args[])
	{
 
  String Bild1 = "C:\\BlueJ\\Helden\\songoku.png";  	
 
  Bildschirm meinBildschirm;
  Bild meinBild;
 
  //Initialisierung
  meinBildschirm = new Bildschirm();
  meinBild = new Bild(200,200,200,523,Bild1);
 
  //Aktionsteil
  meinBild.ladeBild();
  meinBild.zeige();
 
//Aufräumen
meinBild.gibFrei();
meinBildschirm.gibFrei();
 
	}
}
highlight to read

This post has been edited 1 times, last edit by "Mitsch93" (May 7th 2011, 11:58am)


Motto: ich bin der brennende schinken

  • Send private message

2

Sunday, May 8th 2011, 5:37pm

poste mal bitte den ganzen konsolen inhalt.
ich kenn dieses SuM nicht, aber vllt stimmt dein bild pfad nicht.
\\ klappt nur auf windows, nimm / anstelle dessen oder aus system.getProperty
./ heißt das es vom aktuellen ausgefhrten ort aus gesucht wird.
Pack die grafiken am besten in ein package und lass sie daraus laden.
ansonsten würde nur noch der konsolen inhalt helfen.

Source code

1
meinBildschirm.paint(Graphics g);

solltest du niemals von deinen eigenen threads aufrufen.
sag anstelle desen:

Source code

1
meinBildschirm.repaint();

das ruft für dich die paint methode aus den richtigen thread heraus auf.

überschreibe deine paint methode mit:

Source code

1
2
3
4
@Override
public void paint(Graphics g){
g.drawImage(RENDERABLE_IMG, X, Y, null);
}
;( :jagen:

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

3

Sunday, May 8th 2011, 9:53pm

Das was ich im Edit stehen habe ist alles vom Programm. Kommt halt daher, dass wir alles mit diesen SuM machen.
Wir bekommen da paar Klassen vorgeliefert(Stift, Bildschirm, Rechner usw.), mit denen wir arbeiten, manche erstellen wir selbst
(z.B. eine Kugel die über einen Tisch rollt).
Deswegen verwenden wir sowas wie

Quoted

Source code

1
@Override public void paint(Graphics g){ g.drawImage(RENDERABLE_IMG, X, Y, null); }
leider nicht. Aus dem Grund suchte ich ne Klasse, womit man eine Grafik anzeigen lassen kann.
Aber mit der Klasse Bild bekomme ich die Nullpointerexception. Habe es auch schon mit
dem anderen Pfad ausprobiert.

Motto: ich bin der brennende schinken

  • Send private message

4

Sunday, May 8th 2011, 10:15pm

hat SuM keine docu?
da steht meistens drinne wann es Null returned

auf jedenfall kann man mit einer zeile vom fehler ohne zeilenangabe oder verlauf wenig anfangen.
;( :jagen:

5

Monday, May 9th 2011, 7:41pm

Hallo,
welche Zeile wirft denn den NullPointer und in deinem oberen Codebeispiel wird doch Bildschirm an sich überhaupt nicht verwendet. Von der Logik/Verständnis hier müsste man doch Bild irgendwann mitteilen, auf welchem Bildschirm es gehört, man kann es ja nicht im luft leeren Raum zeichnen.

Interessant wäre auch, von welchem Typ Bildschirm, Bild, … ist, bzw. hat sum auch ne homepage? Bzw. was heißst das ausgesprochen, bzw. baut das auf BlueJ auf/nutzt es?

Grüße Steve
:information: YAams
:rainbow: Random Signatur
Bild





Weitere Informationen | Download
Mit Support für RGSS Project 1!
Bild

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

6

Wednesday, May 11th 2011, 4:16pm

Das ist die HP von SuM (Stifte und Mäuse) SuM-Bibliotheken für BlueJ
Das ist ein Programm, was Schülern helfen soll mit BlueJ in Java einzusteigen.
Also wir arbeiten damit im Unterricht.

Die Klassen von SuM haben alle eine Doku, so habe ich mir ja auch die Klasse Bild rausgesucht.
Hier ist der Constructor. Da soll auch der Fehler drin liegen, weil die Zeile makiert wird.
Ich hab die zweitletzte Variante für den Constructor benutzt.

Spoiler

Bild(double pLinks, double pOben, double pBreite, double pHoehe)
Ein leeres Bild wird erzeugt.
Bild(double pLinks, double pOben, double pBreite, double pHoehe, Bild pBild)
Das Bild, das als Parameter uebergeben wird, wird uebernommen.
Bild(double pLinks, double pOben, double pBreite, double pHoehe, String pPfad)
Das Bild, dessen Pfadname uebergeben wird, wird von der Festplatte geladen.
Bild(double pLinks, double pOben, double pBreite, double pHoehe, String pPfad, Applet pApplet)
Das Bild, dessen Pfadname uebergeben wird, wird von der Festplatte in ein Applet geladen.
highlight to read


Theoretisch müsste das Bild gezeichnet werden. In der Doku steht nichts davon, dass das Bild den Bildschirm per Kennt-Beziehung o.a. kennelernen muss.
Die Klasse Stift zeichnet auch ohne eine Kennt- Beziehung Striche auf den Bildschirm, da reicht es eigentlich, dass der Bildschirm initialisiert wird (zumindest haben wir es nie
anders im Unterricht gemacht).
Bei dem Constructor für das Bild werden ja die Koordinaten mitgeliefert, von daher müsste es eigentlich funktionieren.

EDIT:
Ich hatte heute Info und habe mal nachgefragt, allerdings wusste meine Lehrerin auch nicht genau, wie
das mit den Graphics funktioniert.
Jetzt weiß ich schonmal, dass ich die Klasse aus java.awt importieren muss.
Kann mir jmd ein einfaches Beispiel zum Erzeugen von einem Bild per einer der "Image" Klassen
schicken?

This post has been edited 1 times, last edit by "Mitsch93" (May 11th 2011, 4:16pm)


Motto: ich bin der brennende schinken

  • Send private message

7

Wednesday, May 11th 2011, 5:27pm

Java Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// importier was du brauchst:
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import javax.swing.*;
// dein panel in das du malst
public class MeinSpiel extends JPanel{
    // constructor
    BufferedImage meinBild;
    public MeinSpiel(){
        // bild laden
        meinBild = javax.imageio.ImageIO.load(new File("./hallo.png"));
       // neu zeichnen
        repaint();
    }
    @Override
    public void paint(Graphics g){
        // jz zeichnen
        g.drawImage(meinBild, X, Y, null);
    }
}
;( :jagen:

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

8

Thursday, May 19th 2011, 6:08pm

Gut danke dir.

Jetzt hab ich ein neues Problem. Im SuM kann ich die Klassen "Knopf" "Etikett" usw nicht auf meinen
Bildschirm bzw auf mein Fenster regenerieren, der dazugehörige constructor ist buggy.

Deshalb habe ich einfach eine Klasse "Schaltfläche" erstellt, die eigentlich das selbe machen soll wie
ein Knopf.

Klasse Schaltfläche
Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import sum.kern.*;
import sum.werkzeuge.*;
 
public class Schaltflaeche
{
// Bezugsobjekte
Buntstift hatBuntstift;
Maus kenntMaus;
 
// Attribute
private double zBreite, zHoehe;
private int zXpos, zYpos;
private String zAttacke;
private boolean Gedrueckt;
 
// Konstruktor
public Schaltflaeche(double pBreite, double pHoehe, int pXpos, int pYpos, String pAttacke ,Maus pMaus)
{
    hatBuntstift = new Buntstift();
    hatBuntstift.setzeSchriftstil(1);
    zBreite = pBreite;
    zHoehe = pHoehe;
    zAttacke = pAttacke;
    zXpos = pXpos;
    zYpos = pYpos;
    Gedrueckt = false;
 
    //Lerne Maus kennen
    kenntMaus=pMaus;
}
 
// Dienste
    public double gibBreite()
{
    return zBreite;
}
 
public double gibHoehe()
{
    return zHoehe;
} 
 
 
public void Gedrueckt()
{
        if (kenntMaus.hPosition() >= this.zXpos && 
        kenntMaus.hPosition() <= this.zXpos+this.zBreite &&
        kenntMaus.vPosition() >= this.zYpos &&
        kenntMaus.vPosition() <= this.zYpos+zHoehe &&
        kenntMaus.istGedrueckt() == true )
        {
            //Knopf wurde gedrueck
            Gedrueckt = true;
        }  
}  
 
    public void setzeNichtGedrueckt()
{
    Gedrueckt = false;
}
 
public void zeichneDich()
{
    hatBuntstift.bewegeBis(zXpos,zYpos);
    hatBuntstift.zeichneRechteck(zBreite,zHoehe);
    hatBuntstift.bewegeBis(zXpos+zBreite/5,zYpos+zHoehe/2); 
    hatBuntstift.schreibeText(zAttacke);
}
 
public void loescheDich()
{
    hatBuntstift.radiere();
    this.zeichneDich();
    hatBuntstift.normal();
}   
 
public boolean wurdeGedrueckt()
{
    return Gedrueckt;
}
 
 
public void gibFrei()
{
    this.loescheDich();
}
 
 
}
highlight to read


Hier sind die Zeilen, bei denen ich Hilfe brauche. Aus der Klasse Spiel.
Spoiler

Source code

1
2
3
4
5
6
7
8
9
do
{
Held1Wahl.Gedrueckt();
Held2Wahl.Gedrueckt();
Held3Wahl.Gedrueckt();
Held4Wahl.Gedrueckt();
}
while((!Held1Wahl.wurdeGedrueckt()==true) || (!Held2Wahl.wurdeGedrueckt() ==true) || 
(!Held3Wahl.wurdeGedrueckt()==true) || (!Held4Wahl.wurdeGedrueckt() ==true));
highlight to read


Held1Wahl usw sind Objekte der Klasse Schaltfläche. Im Spiel erscheinen sie als
4 Schaltflächen, die untereinander angeordnet sind - ja, sie sind richtig initialisiert usw. also es gibt keinen Syntaxfehler irgendwo.
Die do Schleife soll dafür gut sein, dass es erst weiter geht, wenn genau einer der Knöpfe gedrückt wurde.

In der Klasse Schaltfläche gibt es dazu die Methode "Gedrueckt", die überprüft ob sich die Maus in der Schaltfläche
befindet und die Maus einen Klick darin macht. Wenn das der Fall ist wird Gedrueckt auf true gesetzt.
Da es immer wieder neu überprüft werden muss, habe ich die Methode "Gedrueckt" in die do Schleife geschrieben.

Bis hierhin funktioniert es alles wunderbar. Allerdings habe ich jetzt bei den 4 Knöpfen ein Problem.
Die Schleife ist erst zu Ende, wenn alle 4 Knöpfe gedrückt worden sind, eigentlich soll sie schon bei einem enden.
Ich habe extra in das while "oder" eingefügt. Ich denke, dass das der springende Punkt ist.
Irgendetwas muss ich in

Source code

1
2
while((!Held1Wahl.wurdeGedrueckt()==true) || (!Held2Wahl.wurdeGedrueckt() ==true) || 
(!Held3Wahl.wurdeGedrueckt()==true) || (!Held4Wahl.wurdeGedrueckt() ==true));


ändern. Allerdings weiß ich nicht was, da ich gedacht habe, dass es mit "oder" funktionieren würde.

Motto: ich bin der brennende schinken

  • Send private message

9

Thursday, May 19th 2011, 7:22pm

(!Held1Wahl.wurdeGedrueckt()==true)
heißt:
nicht gedrückt ist wahr ? => ja
mach das ! weg, das negiert dir den boolean.
;( :jagen:

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

10

Friday, May 20th 2011, 5:28pm

Wenn ich die Ausrufezeichen weg mache, beendet sich die Schleife sofort.
Ich habe es jetzt mal mit && probiert statt || und es funktioniert. Lag wahrscheinlich an der || + ! Kombination.

Jetzt stellt sich mir wieder ein neues Problem, was man warhscheinlich nur mit Polymorphie bzw späten Binden lösen kann.
Mit der obigen Knopfgeschichte konnte sich nun Spieler 1 einen Helden aussuchen.
Jetzt soll geregelt werden, welchen Held er bekommt:

Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
 //Spieler 1Held
  	Hero Spieler1Held;
  	if (zSpieler1Held ==1)
      	Spieler1Held = new Songoku(1); 
  	if (zSpieler1Held ==2)
      	Spieler1Held = new Pikachu(1);
  	if (zSpieler1Held ==3)
      	Spieler1Held = new Richard(1);
  	if (zSpieler1Held ==4)
      	Spieler1Held = new Yoda(1);
highlight to read


Songoku, Pikachu, Richard und Yoda sind alles eigene Klassen, die zur abstrakten Klasse Hero gehören.
Aber wenn ich jetzt nach den Ifs mit dem jeweiligen Helden, sprich "Spieler1Held" weiter arbeiten möchte, kommt folgende
Fehlermeldung:
variable Spieler1Held might not have been initialized - ist ja auch klar, da ich es in der If Bedingung initialisere.
Ich weiß, dass man dieses Problem mit Polymorphie bzw späten Binden lösen kann, ich weiß allerdings nicht, wie ich
es umschreiben muss.

11

Friday, May 20th 2011, 6:28pm

Nö, hat damit wenig zu tun. Ich gehe davon aus, dass zSpieler1Held immer einen der 4 Werte annehmen sollte, deswegen machst du daraus ein else if und dann merkt Java auch, dass der Kram zusammen gehört. Damit du alle Fälle abdeckst musst du entweder aus dem letzten Fall ein else machen oder etwas Fehlerresistenter ein else assert false; hinten dran hängen und fertig.

Source code

1
2
3
4
5
6
7
8
9
10
11
Hero Spieler1Held;
if (zSpieler1Held ==1)
      	Spieler1Held = new Songoku(1); 
else if (zSpieler1Held ==2)
      	Spieler1Held = new Pikachu(1);
else if (zSpieler1Held ==3)
      	Spieler1Held = new Richard(1);
else if (zSpieler1Held ==4)
      	Spieler1Held = new Yoda(1);
else
      	assert false;


Quoted

allerdings wusste meine Lehrerin auch nicht genau, wie
das mit den Graphics funktioniert.

oh je...

Quoted

Source code

1
Held3Wahl.wurdeGedrueckt()==true

ein vergleich mit true ist grundsätzlich überflüssig. Das gibt true zurück, wenn der erste Wert true ist, aber wenn du schon true hast, dann brauchste auch den Vergleich nicht mehr.

Quoted

Lag wahrscheinlich an der || + ! Kombination.

!a || !b || !c ist das selbe wie !(a && b && c)

Motto: ich bin der brennende schinken

  • Send private message

12

Friday, May 20th 2011, 6:33pm

Java Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(zSpieler1Held){
  case 1:
  default:
    Spieler1held = new Songoku(1);
    break;
  case 2:
    Spieler1held = new Pickachu(1);
    break;
  case 3:
    Spieler1held = new Richard(1);
    break;
  case 4:
    Spieler1held = new Yoda(1);
    break;
}

es würde auch schon reichen:

Java Source code

1
Hero Spieler1held = null;


vor die ifs zu schreiben, aber mit den switch kannste sicher sein das immer ein held da is, und in diesen fall falls du keinen helden definierst, wird es default zu songoku
;( :jagen:

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

13

Saturday, May 21st 2011, 10:36am

Danke, das kalppt jetzt schonmal super mit den Helden.

Bleibt nur noch das Problem mit den Grafiken. Leider ist meine Rechnung mit
"ich machen für jeden Held einen eigenen Bildschirm" nicht aufgegangen.

Entweder müsste ich jetzt versuchen, das Heldenbild auf den Bildschirm der Klasse Hero zu zeichnen und
nicht auf den Bildschirm vom Spiel, oder ich müsste versuchen mit dem von
Genocide geposteten Code eine Grafik zu zeichnen.
Aber da bekomme ich eine Fehlermeldung: cannot find symbol - class File
in der Zeile

Source code

1
meinBild = javax.imageio.ImageIO.load(new File("C:/Programme/Helden/songoku.png"));

14

Saturday, May 21st 2011, 11:58am

java File - Google-Suche
erster Link ist die Doku
File (Java 2 Platform SE v1.4.2)
-> java.io
Class File

=> import.java.io.File;

Mitsch93

Drachentöter

  • "Mitsch93" started this thread

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

15

Monday, May 30th 2011, 4:50pm

Danke an alle. Das komplette Spiel funktioniert nun.

Jetzt bin ich dabei es zu vereinfachen.
Die Schadensberechnung wir noch im Hauptprogramm durchgeführt. Allerdings sollen das
jetzt die Klassen übernehmen.

Abstrakte Klasse Hero
Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
import sum.werkzeuge.*;
 
public abstract class Hero
{
// Bezugsobjekte
Rechner hatRechner;
Hero hatHero;
Hero GegnerHero;
Fortschrittbalken hatTpBalken;
Fortschrittbalken hatMpBalken;
 
// Attribute
 
//Heldenattribute
protected double zMaxTP, zMaxMP, zTP, zMP, zAng, zDef;  
//Attackenstärke
protected double zAttacke1Ang, zAttacke2Ang, zAttacke3Ang, zAttacke4Ang;
//Mp Verbrauch
protected double zAttacke1Mp, zAttacke2Mp, zAttacke3Mp, zAttacke4Mp;
//Kritische Trefferchance
protected int zKritisch;
//Spielervariable (1 oder 2), Attackenwahl
protected int zSpieler;
//Bildvariablen
protected double zBreite,zHoehe;
//Kampfvariablen
protected double zZusatzSchaden, zProzent, zSchaden;
protected int zAttackenWahl, zZufall;
 
//Heldname
protected String zHeldName;
//Attackenfenster
protected String zAttacke1, zAttacke2, zAttacke3, zAttacke4;
//Sonstiges
protected String zAnsage, zAbsage, zGewonnen, zPfad;
 
// Konstruktor
public Hero()
{
    hatRechner = new Rechner();
    zZusatzSchaden=0;
    zSchaden=0;
}
 
// Dienste
//Rückgabewerte, die für
//den Kampf benötigt werden
 
//ZAHLEN
public double gibMaxTP()
{
    return(zMaxTP);
}
 
public double gibMaxMP()
{
    return(zMaxMP);
}
 
public double gibTP()
{
    return(zTP);
}
 
public double gibMP()
{
    return(zMP);
}
 
public double gibAng()
{
    return(zAng);
}
 
public double gibDef()
{
    return(zDef);
}
 
public double gibKritisch()
{
    return(zKritisch);
} 
 
public void setzeTP(double pInt)
{
    zTP=pInt;
} 
 
public void setzeMP(double pInt)
{
    zMP=pInt;
}  
 
//STRINGS
 
public String gibNamen()
{
    return(zHeldName);
}
 
public String gibAttacke1Namen()
{  
    return(zAttacke1);
}
 
public String gibAttacke2Namen()
{  
    return(zAttacke2);
}  
 
public String gibAttacke3Namen()
{  
    return(zAttacke3);
}  
 
public String gibAttacke4Namen()
{  
    return(zAttacke4);
}  
 
public double gibAttacke1Ang()
{
    return zAttacke1Ang;
}  
 
public double gibAttacke2Ang()
{
    return zAttacke2Ang;
}   
 
public double gibAttacke3Ang()
{
    return zAttacke3Ang;
}   
 
public double gibAttacke4Ang()
{
    return zAttacke4Ang;
}   
 
public double gibAttacke1Mp()
{  
    return(zAttacke1Mp);
}  
 
public double gibAttacke2Mp()
{  
    return(zAttacke2Mp);
}  
 
public double gibAttacke3Mp()
{  
    return(zAttacke3Mp);
}  
 
public double gibAttacke4Mp()
{  
    return(zAttacke4Mp);
}  
 
public double gibSchaden()
{
    return zSchaden;
}
 
public String gibPfad()
{
    return zPfad;
}
 
public String Ansage()
{
    return zAnsage;
}
 
public String Absage()
{
    return zAbsage;
}
 
public String Gewonnen()
{
    return zGewonnen;
}  
 
public void Kampf(Hero pHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken)
{
     //Kritisch mit brechenen
     zAttackenWahl = pAttackenWahl;
     hatHero = pHero;
     GegnerHero = pGegnerHero;
     hatTpBalken = pTpBalken;
     hatMpBalken = pMpBalken;
     zZufall = hatRechner.ganzeZufallszahl(1,100);
     if (0<zZufall && zZufall<=hatHero.gibKritisch())
         zKritisch=2;   
     else
         zKritisch=1;
     if (zAttackenWahl ==1)  
     hatHero.Attacke1(hatHero, GegnerHero, zAttackenWahl, hatTpBalken, hatMpBalken, zKritisch);
     if (zAttackenWahl ==2)  
     hatHero.Attacke1(hatHero, GegnerHero, zAttackenWahl, hatTpBalken, hatMpBalken, zKritisch);
     if (zAttackenWahl ==3)  
     hatHero.Attacke1(hatHero, GegnerHero, zAttackenWahl, hatTpBalken, hatMpBalken, zKritisch);
     if (zAttackenWahl ==4)  
     hatHero.Attacke1(hatHero, GegnerHero, zAttackenWahl, hatTpBalken, hatMpBalken, zKritisch);
}
 
 
//abstrakte Dienste
public abstract int BildBreite();
 
public abstract int BildHoehe();  
 
public abstract void Attacke1(Hero hatHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken, int pKritisch);  
 
public abstract void Attacke2(Hero hatHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken, int pKritisch);
 
public abstract void Attacke3(Hero hatHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken, int pKritisch);
 
public abstract void Attacke4(Hero hatHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken, int pKritisch);
 
//Freigeben
public void gibFrei()
{
    hatRechner.gibFrei();
}
 
}
highlight to read


Klasse Yoda
Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import sum.multimedia.*;
import sum.ereignis.*;
import sum.werkzeuge.*;
 
public class Yoda extends Hero
{
// Bezugsobjekte
 
// Attribute
String zPfad = "yoda.png";
 
// Konstruktor
public Yoda()
{
    //Attribute festlegen
    zHeldName = "Meister Yoda";
    zAttacke1= "Lichtschwert";
    zAttacke2= "Machtschub";
    zAttacke3= "Schwertkombo";
    zAttacke4= "Machtblitz";
    zAttacke1Ang = 1.0;
    zAttacke2Ang = 1.4;
    zAttacke3Ang = 1.8;
    zAttacke4Ang = 2.2;
    zAttacke1Mp = 5;
    zAttacke2Mp = 11;
    zAttacke3Mp = 13;
    zAttacke4Mp = 22;
    zMaxTP=zTP=300;
    zMaxMP=zMP=400;
    zAng=25;
    zDef=17;
    zKritisch=20;
    zAnsage="Wenn so mächtig ihr seid, warum dann schon gehen?";
    zAbsage="Ins Exil gehen ich werde müssen. Versagt ich habe.";
    zGewonnen="Viel zu lernen du noch hast.";
 
 
}
 
// Dienste
public int BildBreite()
{
    return 216;
}
 
public int BildHoehe()
{
    return 300;
}
 
public String gibPfad()
{
    return zPfad;
}   
 
public String Ansage()
{
   return zAnsage;
} 
 
public String Absage()
{
   return zAbsage;
}  
 
public String Gewonnen()
{
   return zGewonnen;
}
 
public void Attacke1(Hero pHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken,int pKritisch)
{
   zKritisch = pKritisch;
   hatHero = pHero;
   GegnerHero = pGegnerHero;
   //MP verringern
   hatHero.setzeMP(hatHero.gibMP() - hatHero.gibAttacke1Mp());
   hatMpBalken.aktualisiereProzent(hatHero.gibMaxMP(),hatHero.gibMP());
   //Schaden berechnen (mit Abweichung von 1-10%)
   zProzent = hatRechner.ganzeZufallszahl(1,10);
   zZusatzSchaden =(hatHero.gibAng()*hatHero.gibAttacke1Ang())/100*zProzent;
   zSchaden = (hatHero.gibAng()*hatHero.gibAttacke1Ang()+zZusatzSchaden)*zKritisch;
   zSchaden = zSchaden - GegnerHero.gibDef();
   //Verteidigung und Schadensberechnung
   if (zSchaden > 0)
   {
        GegnerHero.setzeTP(GegnerHero.gibTP() - zSchaden);
        hatTpBalken.aktualisiereProzent(GegnerHero.gibMaxTP(),GegnerHero.gibTP());
   }  
} 
 
public void Attacke2(Hero pHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken,int pKritisch)
{
   zKritisch = pKritisch;
   hatHero = pHero;
   GegnerHero = pGegnerHero;
   //MP verringern
   hatHero.setzeMP(hatHero.gibMP() - hatHero.gibAttacke2Mp());
   hatMpBalken.aktualisiereProzent(hatHero.gibMaxMP(),hatHero.gibMP());
   //Schaden berechnen (mit Abweichung von 1-10%)
   zProzent = hatRechner.ganzeZufallszahl(1,10);
   zZusatzSchaden =(hatHero.gibAng()*hatHero.gibAttacke2Ang())/100*zProzent;
   zSchaden = (hatHero.gibAng()*hatHero.gibAttacke2Ang()+zZusatzSchaden)*zKritisch;
   zSchaden = zSchaden - GegnerHero.gibDef();
   //Verteidigung und Schadensberechnung
   if (zSchaden > 0)
   {
        GegnerHero.setzeTP(GegnerHero.gibTP() - zSchaden);
        hatTpBalken.aktualisiereProzent(GegnerHero.gibMaxTP(),GegnerHero.gibTP());
   }  
} 
 
public void Attacke3(Hero pHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken,int pKritisch)
{
   zKritisch = pKritisch;
   hatHero = pHero;
   GegnerHero = pGegnerHero;
   //MP verringern
   hatHero.setzeMP(hatHero.gibMP() - hatHero.gibAttacke3Mp());
   hatMpBalken.aktualisiereProzent(hatHero.gibMaxMP(),hatHero.gibMP());
   //Schaden berechnen (mit Abweichung von 1-10%)
   zProzent = hatRechner.ganzeZufallszahl(1,10);
   zZusatzSchaden =(hatHero.gibAng()*hatHero.gibAttacke3Ang())/100*zProzent;
   zSchaden = (hatHero.gibAng()*hatHero.gibAttacke3Ang()+zZusatzSchaden)*zKritisch;
   zSchaden = zSchaden - GegnerHero.gibDef();
   //Verteidigung und Schadensberechnung
   if (zSchaden > 0)
   {
        GegnerHero.setzeTP(GegnerHero.gibTP() - zSchaden);
        hatTpBalken.aktualisiereProzent(GegnerHero.gibMaxTP(),GegnerHero.gibTP());
   }  
} 
 
public void Attacke4(Hero pHero, Hero pGegnerHero, int pAttackenWahl, Fortschrittbalken pTpBalken, Fortschrittbalken pMpBalken,int pKritisch)
{
   zKritisch = pKritisch;
   hatHero = pHero;
   GegnerHero = pGegnerHero;
   //MP verringern
   hatHero.setzeMP(hatHero.gibMP() - hatHero.gibAttacke4Mp());
   hatMpBalken.aktualisiereProzent(hatHero.gibMaxMP(),hatHero.gibMP());
   //Schaden berechnen (mit Abweichung von 1-10%)
   zProzent = hatRechner.ganzeZufallszahl(1,10);
   zZusatzSchaden =(hatHero.gibAng()*hatHero.gibAttacke4Ang())/100*zProzent;
   zSchaden = (hatHero.gibAng()*hatHero.gibAttacke4Ang()+zZusatzSchaden)*zKritisch;
   zSchaden = zSchaden - GegnerHero.gibDef();
   //Verteidigung und Schadensberechnung
   if (zSchaden > 0)
   {
        GegnerHero.setzeTP(GegnerHero.gibTP() - zSchaden);
        hatTpBalken.aktualisiereProzent(GegnerHero.gibMaxTP(),GegnerHero.gibTP());
   }  
} 
 
 
}
highlight to read


Ausschnitt aus Hauptprogramm
Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 //Knopf1
          if (Spieler1Knopf1.wurdeGedrueckt() == true)
          {
              if (Spieler1Mp>=Spieler1Held.gibAttacke1Mp())
              {
                  //Kritisch mit brechenen
                    Spieler1Held.Kampf(Spieler1Held, Spieler2Held,1,Spieler2TpBalken, Spieler1MpBalken);
                    Kampflog.setzeInhalt(Spieler2Held.gibNamen()+" erleidet "+Math.round(Spieler1Held.gibSchaden())+" Schaden!");
                    Kampflog.zeichneDich();
                    meineUhr.warte(750); 
                    Spieler2Tp = Spieler2Held.gibTP();
                  //Schleife beenden
                  SchleifeEnde = true;   
               }
               else
                  Spieler1Knopf1.setzeNichtGedrueckt();
          }
highlight to read


Die Methoden Attacke1-4 habe ich absichtlich nicht in die abstrakte Klasse gestopft, da ich sie später individueller
machen und auf jeden Held einzeln zuschneiden möchte (z.b. sollen sich manche heilen können usw.).

Das Problem hierbei ist das alle Attacken gleich wenig Schaden machen, so zwischen 3 und 7. Eigentlich macht nur
die erste Attacke so wenig Schaden, der rest ist deutlich drüber (kann ich ja im funktionierenden Programm sehen).
Ich habe auch schon zum nachprüfen folgende Zeile verändert.

Source code

1
zSchaden = zSchaden*5 - GegnerHero.gibDef();

Aber das *5 hat es auch nicht gebracht. Der Schaden war immer noch so niedrig.

Berechnet wird der Schaden eigentlich folgendermaßen:
Schaden = (Angriff * Attackenstärke) / 100 * Prozent - GegnerVerteidigung
Prozent ist eine Zufallszahl zwischen 1 und 10. Das soll bewirken, dass der Schaden z.b. nicht nur
5 beträgt sondern ein wenig hin und her schwankt.


Momentan sehe ich keinen Fehler im Programm, aber irgendwo bei der Schadensberechnung muss er liegen :hm:


EDIT:
So ich habe jetzt alles so hinbekommen, wie ich wollte. Nochmal danke an alle, die mir geholfen haben.
Hier zwei Screens vom Spiel.


Bild1
Bild2

This post has been edited 1 times, last edit by "Mitsch93" (May 30th 2011, 4:50pm)


Social bookmarks