Retro Arena

Hallo,

ich möchte euch heute mein Projekt „Retro Arena“ vorstellen. Ich würde mich sehr freuen, wenn ihr es mal runterladet und eure Meinung/konstruktive Kritik mir mitteilt.
Wenn ihr Idee habt, dann könnt ihr die auch gerne äußern.

Infos

Name: Retro Arena
Genre: Battle Arena/Action
Sprache: Deutsch
Größe: 8MB (14MB wegen Source Code)

Spielidee

Die Idee hinter Retro Arena ist im Prinzip sowas wie Gladiatoren, diese kämpfen auch mit Schwert und Schild in einer Arena um ihr Leben. So ist es auch bei Retro Arena, der einzige Unterschied ist, dass man gegen allerhand Monster kämpft.

Spielziel

Das Ziel von Retro Arena ist es, einen besonders mächtigen Spielstand/Charakter zu haben.
Später soll es noch Möglich sein, gegen andere Spieler lokal und übers Internet gegeneinander zu kämpfen und viele Coins für einen Sieg einzusahnen um noch besser zu werden.

Screenshots

Hautpmenü

Charakter/Spielstand statsmenü

Wüsten Arena

Download & Mindmap

Download: http://tinyurl.com/kvfzdsr
Virustotal: http://tinyurl.com/lx9z6p9
Mindmap: http://tinyurl.com/mlr8z7h

Mfg Richi

PS: Ich möchte hier keine Diskussion, warum ich schon wieder was neues mache!

Ich will auch keine beginnen, ich sehe mir dein spiel auch an, aber ganz ehrlich - das wird nie zum erfolg führen.

Zum Spiel:

[ul]
[li]Variablen bitte IMMER klein schreiben. du bist ja kein anfänger mehr.[/li][li]Bei jedem Menüpunkt wird ein neues Fenster aufgemacht… das wirkt echt mies. Wie wärs mit nem cardlayout?[/li][li]-[/li][li]Die schrift… ich glaube du hast dir sehr viel mühe gegeben (wenns nicht grad aus dem netz ist), aber die ist echt unleserlich. (in den menüs meine ich)[/li][li]Ist der sound aus dem netz oder selbst produziert?[/li][li]Wer braucht schon 12 Spielstände?? Sogar mario hat meistens 3…[/li][li]angreifen ist irgendwie unmöglich - irgendwas mit taste L ? Ich checks nicht[/li][li]Immer wenn man zu einem neuen menü punkt kommt beginnt die musik von neu. mies.[/li][li]Ich würde eher tauschen - im menü keine musik, in game mit. (oder eben bei beidem)[/li][li]Das glaub ich ja jetzt nicht: Fußling.add(new Fußling(new Point(Portal.get(0).getX(), Portal.get(0).getY())));[/li] Fußling.add(new Fußling(new Point(Portal.get(1).getX(), Portal.get(1).getY()))); Fußling.add(new Fußling(new Point(Portal.get(2).getX(), Portal.get(2).getY()))); Fußling.add(new Fußling(new Point(Portal.get(3).getX(), Portal.get(3).getY()))); Fußling.add(new Fußling(new Point(Portal.get(4).getX(), Portal.get(4).getY()))); Fußling.add(new Fußling(new Point(Portal.get(5).getX(), Portal.get(5).getY()))); Fußling.add(new Fußling(new Point(Portal.get(6).getX(), Portal.get(6).getY()))); Fußling.add(new Fußling(new Point(Portal.get(7).getX(), Portal.get(7).getY()))); wie wärs mit einer schleife? o.O
[li]schreit ebenfalls nach einer array deklaration und anschliessender schleife: [/li]code

[spoiler]``` walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_0.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_1.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_2.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_3.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_4.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_5.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_6.png“));
walk_northwest_animation.add(ImageLoader.loadImage(„skelett_northwest_7.png“));

	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_0.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_1.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_2.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_3.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_4.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_5.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_6.png"));
	walk_northeast_animation.add(ImageLoader.loadImage("skelett_northeast_7.png"));
	
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_0.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_1.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_2.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_3.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_4.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_5.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_6.png"));
	walk_north_animation.add(ImageLoader.loadImage("skelett_north_7.png"));
	
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_0.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_1.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_2.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_3.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_4.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_5.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_6.png"));
	walk_west_animation.add(ImageLoader.loadImage("skelett_west_7.png"));
	
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_0.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_1.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_2.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_3.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_4.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_5.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_6.png"));
	walk_east_animation.add(ImageLoader.loadImage("skelett_east_7.png"));
	
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_0.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_1.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_2.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_3.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_4.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_5.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_6.png"));
	walk_south_animation.add(ImageLoader.loadImage("skelett_south_7.png"));
	
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_0.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_1.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_2.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_3.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_4.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_5.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_6.png"));
	walk_southwest_animation.add(ImageLoader.loadImage("skelett_southwest_7.png"));
	
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_0.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_1.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_2.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_3.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_4.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_5.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_6.png"));
	walk_southeast_animation.add(ImageLoader.loadImage("skelett_southeast_7.png"));
	
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_0.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_1.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_2.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_3.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_4.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_5.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_6.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_7.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_8.png"));
	attack_east_animation.add(ImageLoader.loadImage("skelett_attack_east_9.png"));
	
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_0.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_1.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_2.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_3.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_4.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_5.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_6.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_7.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_8.png"));
	attack_west_animation.add(ImageLoader.loadImage("skelett_attack_west_9.png"));```[/spoiler]

[li]~[/li][li]Das hier: setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2 - getWidth() / 2, Toolkit.getDefaultToolkit().getScreenSize().height / 2 - getHeight() / 2); kann man auch einfach so machen: setLocationRelativTo(null); fertig ;)[/li][li]könnte man nicht arraylist orc, arraylist fußling… in arraylist zusammenfassen? also klasse enemy und alle davon ableiten…[/li][li]Man kann den Hintergrund schwarz weiss auch mit g2d.setPaint(new GradientPaint(black, white)); und g2d.fillRect(…); hinkriegen…[/li][li]Wieso für alles was diese komische schrift hat ein bild? Einfach schriftdatei reinladen und buttons usw entsprechend beschriften[/li][li]wieso erstelle ich save 1 und bekomme im saves ordner 1, 2, 4 ?[/li][li]Was bringt die verschlüsselung, wenn man das programm eh dekompilieren kann?[/li][li]Man sollte doppelte klassennamen vermeiden, auch wenn man die andere nicht benutzt: zB Frame[/li][li]Wäre es nicht sinnvoll im folgenden Teil mit else if zu arbeiten? (Eventuell werden die nicht aktiven zeiten übersprungen, oder nicht?) [/li]code

if(attack_animation_time>0){ image = attack_east_animation.get(0); } if(attack_animation_time>5){ image = attack_east_animation.get(1); } if(attack_animation_time>10){ image = attack_east_animation.get(2); } if(attack_animation_time>15){ image = attack_east_animation.get(3); } if(attack_animation_time>20){ image = attack_east_animation.get(4); } if(attack_animation_time>25){ image = attack_east_animation.get(5); } if(attack_animation_time>30){ image = attack_east_animation.get(6); }

[li]+[/li][li]Bei den animationen (also den bildern) hast du dir echt viel mühe gegeben. Manch andere (ich zB xD) hätten nie diese Geduld 30 verschiedene Bilder die fast gleich aussehen zu zeichnen…[/li][li]Ansonsten ganz witzige spielidee. (auch wenn nicht neu)[/li][li]Läuft im gegensatz zu deinen anderen dingern recht flüssig.[/li][li]Wünsch dir noch viel spass in der weiteren enwicklung, und hoffe das du mal bei einer sache bleibst :p[/li][/ul]

Und in wiefern ist das Hilfreich für den TO? Beschreibe konstruktiv was dir nicht gefällt, dann hat der TO auch eine Chance drauf zu reagieren. Aber dieser Kommentar von dir ist einfach nur provokant.

Sieht nach viel Mühe und Arbeit aus! Ich downloade es gerade :slight_smile:

das war keine provokation sondern nur ein gedanke. ausserdem habe ich bereits verbesserungsvorschläge gepostet. :slight_smile:

Das war wieder eine Provokation :stuck_out_tongue:

Streich „das wieder“ und nimm bitte meine entschuldigung an, ich das jetzt rausgenommen :wink:

Scherzbold, man sieht wann was editiert wurde ;-). Aber ja, jetzt schaut dein Post schon viel besser aus.

Die Animation sieht gut vom Spieler sieht gut aus, aber es ist etwas lahm find ich. Man sollte beim bewegen auch angreifen können etc.
Und die Zeit läuft bei mir viel zu schnell. Pro Sekunde +3 ca.

Noch eine Sache:

Statt immer wieder ein neues font objekt zu erzeugen g2.setFont(new Font("Parry Hotter", Font.ITALIC, 40)); würde ich diesen font einfach einmal speichern.

*** Edit ***

ich mach das aber immer so: erst eine meinung, und dann die bewertung usw als bearbeitung. :slight_smile:

Man hast du dir eine Mühe gegeben!
Rund 88 Bilder für jede Gegner Art… Macht es leider auch ziemlich schwer das Spiel später zu erweitern :wink:
Noch was ich kann die Gegner nicht schlagen! Oder sie gehen einfach nicht drauf!

Du musst stehen bleiben und die linke Maustaste gedrückt halten. Hatte auch Schwierigkeiten das herauszufinden.

Ich freue mich über das großartige Feedback von allen und möchte mich hiermit einmal herzlichst bedanken.
@mymaksimus

Ich werde eh nochmal einiges zusammenfassen, dass werde ich als nächstes in Angriff nehmen, um den Code noch weiter zu kürzen und zu verbessern.
Deine Ratschläge werde ich auch mit beachten und einarbeiten. Ebenfalls werde es noch so machen, dass alles in einem Fenster abläuft und nicht immer ein neues erstellt wird.

Welcher Variablenname ist den nicht klein? Mir ist nämlich nicht bekannt, dass welche groß sind.

Mfg Richi

[QUOTE=XxXRichiXxX]
Welcher Variablenname ist den nicht klein? Mir ist nämlich nicht bekannt, dass welche groß sind.[/QUOTE]
Fußling.add(new Fußling(new Point(Portal.get(0).getX(), Portal.get(0).getY())));

Da wars wohl schon nach 2 uhr morgens, als du es programmiert hast, aber hier ein auszug :wink:

du warst wohl müde^^
[spoiler]
```// Klassen
PlayerControler PlayerControler;
Frame Frame;
SaveFile SaveFile;
ImageLoader ImageLoader;
private Healthbar Healthbar;
private CastleArena CastleArena;
private int kills, total_enemys, wave;
private ArrayList Damage;
Time Time;
Coins Coins;
Wave Wave;
NewWave NewWave;
AudioLoader AudioLoader;
ArenaEnd ArenaEnd;

// Entities
private Player Player;
private ArrayList<Orc> Orc;
private ArrayList<Skelett> Skelett;
private ArrayList<Gnome> Gnome;

// Partikel
private ArrayList<Bloodmark> Bloodmark;

// Welt objekte
private Ground Ground;
private ArrayList<Portal> Portal;```

[/spoiler]

[QUOTE=mymaksimus]Da wars wohl schon nach 2 uhr morgens, als du es programmiert hast, aber hier ein auszug :wink:

du warst wohl müde^^
[spoiler]
```// Klassen
PlayerControler PlayerControler;
Frame Frame;
SaveFile SaveFile;
ImageLoader ImageLoader;
private Healthbar Healthbar;
private CastleArena CastleArena;
private int kills, total_enemys, wave;
private ArrayList Damage;
Time Time;
Coins Coins;
Wave Wave;
NewWave NewWave;
AudioLoader AudioLoader;
ArenaEnd ArenaEnd;

// Entities
private Player Player;
private ArrayList<Orc> Orc;
private ArrayList<Skelett> Skelett;
private ArrayList<Gnome> Gnome;

// Partikel
private ArrayList<Bloodmark> Bloodmark;

// Welt objekte
private Ground Ground;
private ArrayList<Portal> Portal;```

[/spoiler]
[/QUOTE]

Das sind Klassen, die schreib ich groß. Alles andere(alles was keine Klasse ist) ist klein.

Das sind aber Instanzen deiner Klassen also Variablen.

Da hast du recht… Werde ich noch abändern.

Retro Arena? Zur Erinnerung an ähhh… was? The First “The Elders Scrolls” ever? Naja, ich schau mal drüber.
Was bedeutet eigentlich die MindMap? Ist die wichtig fürs Spiel oder nur für dich?

BTW.: An Namenskonventionen muss man sich als Hobby-Progger ja nicht halten. Der JVM ist’s egal, ob Variablennamen groß, klein, camelCase oder nicht Camelcase geschrieben wurden. Was aber zuweilen in die Hose gehen kann, ist wenn man Umlaute (ä, ö, ü), sz usw im Quelltext (bzw im Bytecode) verwendet. Beschränke dich in dieser Angelegenheit sicherheitshalber auf ASCII, wenn du keine bösen Überraschungen (z.B. ClassNotFoundException) erleben willst.

[QUOTE=Spacerat]Retro Arena? Zur Erinnerung an ähhh… was? The First “The Elders Scrolls” ever? Naja, ich schau mal drüber.
Was bedeutet eigentlich die MindMap? Ist die wichtig fürs Spiel oder nur für dich?

BTW.: An Namenskonventionen muss man sich als Hobby-Progger ja nicht halten. Der JVM ist’s egal, ob Variablennamen groß, klein, camelCase oder nicht Camelcase geschrieben wurden. Was aber zuweilen in die Hose gehen kann, ist wenn man Umlaute (ä, ö, ü), sz usw im Quelltext (bzw im Bytecode) verwendet. Beschränke dich in dieser Angelegenheit sicherheitshalber auf ASCII, wenn du keine bösen Überraschungen (z.B. ClassNotFoundException) erleben willst.[/QUOTE]

Mittlerweile sind alle Sonderzeichen aus dem Quellcode verschwunden und die Variablen sind auch einheitlich (klein).

Mfg Richi