# ApoWomenInvasion



## Apo (1. Aug 2009)

Hi,

ich möchte euch kurz mein kleines neues Projekt präsentieren. Es ist ein Test , ob die online Highscoreliste funktioniert oder ob sie noch Probleme macht. Würde mich freuen, wenn ihr es testen könntet und Feedback geben würdet.

Worum geht es?
Ihr seid der letzte Mann auf der Welt und die Frauen wollen euch an die Wäsche. Ihr müsst euch irgendwie verteidigen. Zum Glück werden in der Gegend immer mal glitzernde Bomben abgeworfen. Eurer Ziel ist es, die Frauen dort hin zu führen. Weil Frauen bleiben bei glitzernden Sachen ja stehen.  =)
Gesteuert wird mit den Cursortasten. Wenn ihr euch nicht mehr bewegen könnt, weil die Damen euch eingekreist haben, dann drückt die Leertaste und ihr werdet schreinen, wodurch die Frauen kurzzeitig weglaufen werden. =)

Falls sich jemand durch die Thematik angegriffen fühlt ... es ist, wie ich glaube, zu merken alles nur Spass und wenn es sein muss ... dürft ihr den Maincharacter "verweiblichen" und vor Männern weglaufen. Aber ich habe gehört, dass  das Spiel dann schwerer wird. 

Wenn alles funktioniert, kann ich wieder an ApoSliding arbeiten, wo ich auch Onlinesachen einbauen möchte. =) Ist nur als Testspiel geplant gewesen, aber größer und besser geworden als erwartet. Deshalb musste ich es vorstellen. =)

Download und Applet: Klick mich

Screenshot:


----------



## Marco13 (1. Aug 2009)

http://www.java-forum.org/plauderec...eitungsverbot-von-action-computerspielen.html 

Ja, scheint zu funktionieren: Hab' mich gerade mal auf den 4. Platz hochgekäpft, und nach einem Neustart ist der Score immernoch da und so.... Das Spiel: :toll:


----------



## Schandro (1. Aug 2009)

lustiges Spiel.

Die Highscore ist aber verdammt einfach zu hacken, wenn man einen decompiler hat xD
(hab das natürlich nur gemacht, um dir die Schwachstelle im System aufzuzeigen...)


----------



## Apo (2. Aug 2009)

Hehe du hast recht, wenn man möchte kann man es leicht hacken. Da muss ich mir überlegen wie ich es verbessern kann ... Hat da jemand eine Idee? Das Problem ist die jar-Datei und damit der leicht zu entschlüssende Code. Ok ich könnte ihn durch einen Obfuscator "verschlüsseln". Aber es würde die Sache nur ganz leicht erschweren.

Danke fürs Testen auf jeden Fall.

Verbesserungspunkte wären noch das die Frauen/Männer große Gruppen bilden anstatt von "Linien". =)


----------



## Apo (2. Aug 2009)

So ich habe noch auf der Website nun die Highscoreliste hinzugefügt.
Außerdem habe ich das Spiel einen Tick einfacher gemacht. In Level 3, 5, 7 und 9 kommt nun eine Bombe extra hinzu und es kommen am Anfang einen Tick mehr Frauen, sodass die Action gleich beginnt. =)


----------



## Marco13 (2. Aug 2009)

Hab's nochmal getestet - ca. 10000 Punkte, aber die option zum Hochladen kam nicht... oder ich hab's übersehen


----------



## Apo (2. Aug 2009)

Ist jetzt schon ein bissl ärgerlich, aber du musst es übersehen haben. Bei mir erscheint es auf jeden Fall =)
Danke fürs Testen auf jeden Fall =)


----------



## icarus2 (3. Aug 2009)

Wie ich schonmal gesagt habe, ein cooles Spiel. Die Pfeile sind eine gute Hilfe, um die nächste Bombe zu finden. Auch das Blut am Boden sieht nett aus ;-)

Upload hat auch einwandfrei funktioniert.


----------



## Quaxli (3. Aug 2009)

In die Highscore-Liste hab' ich's nicht geschafft. Da steht zu oft "Apo" drin 
Aber auf jeden Fall kam der Dialog zum Upload.

Sonst ein schönes Spiel.  Wie gewohnt liebevoll programmiert. Die Pfeile sind eine gute Verbesserung, da kann ich zustimmen. Und daß sie langsam verblassen ist auch ein schöner Effekt.


----------



## Apo (3. Aug 2009)

Ich danke euch fürs Testen! *thumbsup*

Ich habe jetzt noch einige kleine Bugs entfernt, die bei der Story auftreten konnten und ein Namensfeld bei den Optionen hinzugefügt.
Als letztes könnte noch hinzugefügt werden, dass die Damen nicht mehr Linienförmig laufen. Aber irgendwie habe ich keine Idee bis jetzt, wie ich das anstelle, ohne alles ändern zu müssen.

Wenn mir keine Idee zur Lösung kommt, wird das die Endversion. =)


----------



## Quaxli (4. Aug 2009)

Och, ich finde dieses linienförmige Laufen eigentlich ganz nett, wenn so eine lange Schlange Mädels hinter dem Spieler her rennt.


----------



## Marco13 (4. Aug 2009)

Das hat aber zur Folge, dass immer mal wieder welche "am Haus hängenbleiben", die einem eigentlich folgen sollten. Abhilfe ist da, im Kreis zu laufen und sie zusammenzutreiben wie eine Herde Schafe, bis eine Glitzerbombe an der passenden Stelle auftaucht, um eine "Annhilation" zu bekommen :hihi: Cool wäre auch, wenn die Highscore-Liste auch die anderen Rekorde erfassen würde, und nicht nur die Punkte (62 killed in one blast und so )


----------



## Apo (4. Aug 2009)

Macht sie doch halbwegs 
Schaut mal hier Highscore
da wird angezeigt wieiviel Kills in einem Spiel gemacht wurde. Wie lange gezockt wurde und welches Level erreicht wurde. Die maximal Anzahl pro Bombe an Kills wird aber noch nicht mit gespeichert.
Das könnte noch eingefügt werden.


----------



## leibimatZe (4. Aug 2009)

BAM paltz 13..bester hinter APO xD


----------



## Apo (5. Aug 2009)

Habe jetzt noch einmal kurz es versucht zu erschweren zu cheaten. Ich habe in der php-Datei ein paar Überprüfungen hinzugefügt. Schwer ist es trotzdem nicht würde ich sagen, wenn man wirklich will, man braucht vielleicht unter Umständen nur länger. 
Congratz @ leibiMatze. Vielleicht sollte ich ein paar Highscores von mir löschen, damit es besser aussieht für die anderen. Aber sie sind wirklich alle fair erspielt worden. Ich laufe einfach immer nur und kreise die Frauen ein. Mehr mache ich gar nicht.


----------



## Quaxli (6. Aug 2009)

Rumlaufen und Frauen einkreisen. Kommt mir von irgendwoher bekannt vor


----------



## leibimatZe (6. Aug 2009)

in der nächsten frühstückspause hab ich dich! ;D 
bin scho platz 8^^ einfach fühlen wie am samstag im club um die "bar kreisen" und bei jedem anderen kerl schaun dass n paar hängen bleiben xD
udn schon funktioniert das spiel^^

die idee echt sau klasse gewesen xD


----------



## faetzminator (7. Aug 2009)

Marco13 hat gesagt.:


> Das hat aber zur Folge, dass immer mal wieder welche "am Haus hängenbleiben", die einem eigentlich folgen sollten. Abhilfe ist da, im Kreis zu laufen und sie zusammenzutreiben wie eine Herde Schafe [...]



A* Algo  A*-Algorithmus ? Wikipedia


----------



## moormaster (7. Aug 2009)

Unter Ubuntu 9.04 machen sowohl das Applet als auch der Download Probleme.

Downloadversion:
  - zeigt nur den "Apo-Games"-Banner und wirft eine Exception auf der Console


```
Exception in thread "main" java.lang.NullPointerException
	at org.apogames.sound.ApoMidiPlayer.<init>(ApoMidiPlayer.java:45)
	at apoZombie.game.ApoZombieGame.init(ApoZombieGame.java:46)
	at org.apogames.ApoMainBufferedStrategy.setComponent(ApoMainBufferedStrategy.java:99)
	at apoZombie.ApoZombieMain.init(ApoZombieMain.java:26)
	at org.apogames.ApoMainBufferedStrategy.<init>(ApoMainBufferedStrategy.java:56)
	at org.apogames.ApoMainBufferedStrategy.<init>(ApoMainBufferedStrategy.java:27)
	at apoZombie.ApoZombieMain.<init>(ApoZombieMain.java:16)
	at apoZombie.ApoZombieMain.main(ApoZombieMain.java:32)
```

Applet (im Firefox):
  - wirft die gleiche Exception und verhindert, dass das Applet überhaupt irgendetwas anzeigt

Ich benutze das Sun JRE 1.6.0_14


----------



## Marco13 (8. Aug 2009)

Dass das anscheinend _eigentlich_ als Zombiespiel gedacht war find' ich jetzt irgendwie lustig


----------



## Apo (8. Aug 2009)

Korrekt, es war als Zombiespiel geplant. Aber ich fand die Idee mit den Frauen letztlich besser  Die Idee kam mir einfach im Bett =)

Zum Midi-Problem. Das müsste nun behoben sein, wenn ich mich nicht irre. Danke für den Bug =)

Zum "Gehproblem" der Frauen. Das war eigentlich so geplant am Anfang. Müsste mal testen, ob es mit A* noch performant genug ist bei 100 Frauen. =)


----------



## leibimatZe (10. Aug 2009)

Apo hat gesagt.:


> Korrekt, es war als Zombiespiel geplant. Aber ich fand die Idee mit den Frauen letztlich besser  Die Idee kam mir einfach im Bett =)



Hattest ausnahmsweise ne Frau statt nem Zombie im Bett, or what? xD


----------



## Apo (10. Aug 2009)

leibimatZe hat gesagt.:


> Hattest ausnahmsweise ne Frau statt nem Zombie im Bett, or what? xD



*g* Dazu möchte ich nichts sagen. Außer natürlich ... vielleicht auch andersrum ... ansonsten kommt man doch nicht auf solch eine Idee oder? 

Habe jetzt nocheinmal einige kleine Bugs gefunden bei der Highscoreanzeige und diese verbessert. Des Weiteren wird nach dem Spiel nun angezeigt, wenn eine Internetverbindung besteht, der wievielte Platz erreicht wurde mit der Punktzahl.
Außerdem wird nun in der online Highscoreliste mehr angezeigt, als nur der Namen und die Punkte.
Kleinigkeit beim eigenen TextField verbessert.

Ich muss es am Mittwoch oder Donnerstag mal nachprüfen, aber vlt ist das Spiel in der PC Action. Auf mein Youtube Video hat jemand einen Kommentar abgegeben, dass er es aus der neuen PC Action hat. Falls das stimmt, wäre das genial. Wenn nicht ist schade, aber egal.


----------



## Spacerat (11. Aug 2009)

Quaxli hat gesagt.:


> Och, ich finde dieses linienförmige Laufen eigentlich ganz nett, wenn so eine lange Schlange Mädels hinter dem Spieler her rennt.


YEEESSSSS... "it's the Benny Hill Show" :lol:
Tolles Spiel... kommentar schreib ich weiter wenn ich mich wieder eingekriegt hab' :toll:


----------



## Apo (13. Aug 2009)

Ich danke dem Spacerat für das Auffüllen der Highscoreliste 

Mein Leserbrief an die PC-Action wurde wirklich fast in Gänze abgedruckt. Ich bin ja begeistert. Mit Screenshot und Link dazu. Hätte ich nicht erwartet. Mich freuts. =)


----------



## Spacerat (13. Aug 2009)

Apo hat gesagt.:


> Ich danke dem Spacerat für das Auffüllen der Highscoreliste


Hatte (bzw. habe zwischendurch) halt Zeit... Mal schauen wieviele Denkpausen es braucht, bis ich ganz oben steh'... Ist aber auch actionreich und amüsant. Ich vermisse allerdings irgendwie den Sound. Vllt. "Yakety Sax" als Hintergrundmusik und man hat 'n bissl' was vom oben erwähnten


----------



## Apo (13. Aug 2009)

Die Idee ist ja goldig. 
Habe mir mal die Midi zugelegt und werde sie in den nächsten Tagen mal einarbeiten. =)
Dazu könnten noch lustige Explosionssounds kommen und ein Knutschsound, wenn die Damen zu nah sind.
Hatte mich nur vorher noch nie mit Sound so richtig auseinandergesetzt. Wird nun mal Zeit.


----------



## L-ectron-X (14. Aug 2009)

In der Applet-Version solltest du in der stop()-Methode den Sound killen.
Wenn ich den Tab im Browser schließe, läuft die Musik weiter.


----------



## Spacerat (15. Aug 2009)

Hmmm... Wurde der Sound überhaupt schon implementiert? Ich sehe zwar, das man ihn unter Optionen einschalten kann, aber ich kann gar nichts verstehen :lol:
Cache geleert; Appletseite geöffnet; unter Optionen Sound eingestellt; Surviver Mode gestartet... kein Ton. Könnte das an dieser Meldung liegen
	
	
	
	





```
network: Keine Zertifikatsinformationen für unsignierte JAR-Datei:
   http://apo-games.de/apoWomenInvasion/ApoWomenInvasion.jar
```
oder brauch' ich tatsächlich ein Hörgerät? Ok... Nach dem der Chache geleert war gabs anfangs noch so'n paar Exceptions, die besagten, das irgend so eine indexdatei nicht gefunden werden konnte. aber das erschien mir normal bei frisch geleertem Cache. Das bezieht sich im übrigen alles auf FireFox.


----------



## Xams (15. Aug 2009)

Hast du mal ein Bild von dem Artikel in der PCAction?


----------



## Apo (15. Aug 2009)

Zu der Soundfrage ... ich höre persönlich bis jetzt auch nichts im Applet. Hab aber ka wieso. Ich fange alle Exceptions ab und gebe sie eigentlich auch aus. Egal ich stelle grad das Soundsystem komplett auf ein neues um. Und dann sollte alles funktionieren (so der Plan) 
Zum Beenden des Sounds beim Applet: Danke für den Bug. Wird in der nächsten Version sofort verbessert.

Screenshot aus der PC-Action: Klick mich. Sorry für die schlechte Qualität, aber ich habe nur mein Handy da. =)


----------



## sparrow (15. Aug 2009)

```
sparrow@sparrow:~$ uname -a && lsb_release -a && java -version
Linux sparrow 2.6.28-11-generic #42-Ubuntu SMP Fri Apr 17 01:58:03 UTC 2009 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID:	LinuxMint
Description:	Linux Mint 7 Gloria - x64 Edition
Release:	7
Codename:	Gloria
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
sparrow@sparrow:~$
```

Hier geht alles bis auf der Ton, der macht aber auch keine Fehlermeldung.


----------



## Apo (15. Aug 2009)

So nun habe ich mal an den Sounds gearbeitet. =)
Es gibt nun einen Explosionssound und ein Knutschsound, wenn ihr auf ein Button klickt.
Im Hintergrund läuft nun die Midi von "Yakety Sax".
Bei mir funktioniert nun alles wunderbar im Applet und in der Application. =)
Und der Sound wird im Applet nun auch gestoppt, wenn das Fenster geschlossen wird.


----------



## Spacerat (16. Aug 2009)

Ok... Sound kommt... aber wie... Ich würd's dir ja gerne zeigen. Wenn man Schall sehen könnte, würde ja ein Screenshot genügen. Also bleibt mir nur, es zu Umschreiben. Knutsch- und Explosionssounds sowie den Titel während des Spiels eigentlich so wie es sein soll. Alledings hört man auch ständig ein Maschinengewehr und so eine Art gestörte Funkwellen im Vordergrund. Klingt, als wenn die Sounds zu oft initialisiert werden. Als Anhaltspunkt kommt immer nur der, das das Applet nicht signiert ist. Du arbeitest bei den Sounds nicht zufällig mit Threads? Ist dir die Tatsache bewusst, dass Applets Threads zwar starten aber nicht wieder anhalten können ("interrupt()" -> Access Denied)? Ich hatte da mal (lange vor "concurreny") 'ne Thread-Klasse gebastelt, die dieses Problem umgeht.
	
	
	
	





```
/**
 * Der EThread ist im Prinzip mit "java.lang.Thread" vergleichbar bzw.
 * eigentlich nichts anderes. Entstanden ist EThread aufgrund diverser
 * Tatsachen "java.lang.Thread" betreffend.
 * 1. "java.lang.Thread" kann nicht erneut gestartet werden. Eine
 *    abgelaufene Instanz von "java.lang.Thread" belegt bei unsauberer
 *    Programmierung immer noch Speicher.
 * 2. Aufgrund von Punkt 1 laesst sich "java.lang.Thread" auch nicht im Sinne
 *    von pausieren unterbrechen. "interrupt()" von "java.lang.Thread"
 *    ermoeglicht statt dessen einen sauber beendeten "java.lang.Thread",
 *    was eigentlich dessen "stop()"-Methode von vorne herein haette tun
 *    muessen.
 * 3. "java.lang.Thread" kann zwar von unsignierten Applets gestartet
 *    jedoch nicht auf konventionellem Wege ("interrupt()") beendet
 *    werden.
 * 
 * Ein fuer einen EThread konzipiertes Runnable koennte nun folgenden
 * Grundaufbau haben:
 * 001 public void run()
 * 002 {
 * 003   while((EThread) runner).isRunning()) {
 * 004     if(!((EThread) runner).isPaused()) {
 * 005       //...running code goes here
 * 006     } else {
 * 007       //...paused code goes here
 * 008     }
 * 009     try {
 * 010       Thread.sleep(timeout);
 * 013     } catch(InterruptedException e) {
 * 014       ((EThread) runner).stop();
 * 015     }
 * 016   }
 * 017 }
 * @author 0x0badc0de
 */
public class EThread
{
	/*
	 * Interner Worker-Thread
	 */
	private Thread worker;

	/*
	 * Abzuarbeitendes Runnable
	 */
	private final Runnable runner;

	/*
	 * Status-Flaggen
	 * running => Thread wurde gestartet
	 * paused  => Thread wurde pausiert
	 */
	private boolean running, paused;

	/**
	 * Neue Instanz eines EThreads. Ein Runnable
	 * ist unbedingt Vorraussetzung.
	 * @param runner
	 */
	public EThread(Runnable runner)
	{
		if(runner == null) {
			throw new NullPointerException("runner = null");
		}
		paused = true;
		this.runner = runner;
	}

	/**
	 * Startet einen EThread.
	 */
	public synchronized void start()
	{
		start(false);
	}

	/**
	 * Startet einen EThread pausiert.
	 */
	public synchronized void start(boolean sw)
	{
		pause(sw);
		if(worker == null) {
			running = true;
			worker = new Thread(runner)
			{
				/**
				 * Thread.run() musste ueberschrieben werden,
				 * damit EThread ein Ende des Runnables
				 * mitbekommt.
				 */
				@Override
				public void run()
				{
					runner.run();
					running = false;
					worker = null;
				}
			};
			worker.start();
		}
	}

	/**
	 * Pausiert einen EThread (sw = true) oder laesst ihn
	 * fortfahren (sw = false).
	 * @param sw
	 */
	public synchronized void pause(boolean sw)
	{
		paused = sw;
	}

	/**
	 * Schaltet den Pause-Modus des EThreads um.
	 */
	public synchronized void pause()
	{
		pause(!paused);
	}

	/**
	 * Stopt einen EThread. Die Verwendung des Methodennamens
	 * "stop" soll die diesbezuegliche Verwirrung von
	 * "java.lang.Thread" beenden. Gestoppte EThreads koennen
	 * nicht fortgesetzt werden. Unterbrechen (interrupt)
	 * bedeutet "pausieren".
	 * @see pause(boolean sw)
	 * @see pause()
	 */
	public synchronized void stop()
	{
		if(running) {
			running = false;
		}
	}

	/**
	 * Gibt zurueck, ob der EThread gestartet wurde und
	 * immernoch laeuft. Auch ein pausierter EThread liefet
	 * hier "true".
	 * @return running flag
	 */
	public boolean isRunning()
	{
		return running;
	}

	/**
	 * Gibt zurueck ob ein EThread unterbrochen wurde. Das
	 * ist der Fall, wenn er pausiert oder noch nicht
	 * gestartet wurde.
	 * @return paused flag
	 */
	public boolean isPaused()
	{
		return paused;
	}

	/**
	 * Wartet auf Beendigung des EThreads.
	 * @throws InterruptedException
	 */
	public synchronized void join()
	throws InterruptedException
	{
		if(worker != null) {
			worker.join();
		}
	}

	/**
	 * Wartet die angegebene Zeitspanne auf Beendigung des
	 * ETrheads.
	 * @param timeout
	 * @throws InterruptedException
	 */
	public synchronized void join(long timeout)
	throws InterruptedException
	{
		if(worker != null) {
			worker.join(timeout);
		}
	}
}
```


----------



## Apo (16. Aug 2009)

Das mit dem Threads im Applet wusste ich noch nicht. Und da ich persönlich nicht das Soundproblem hatte, wäre ich ohne dich auch nie drauf gekommen.
Ich habe es mal implementiert und hoffe, dass es nun bei dir zu keinem Doppelsound mehr kommt =)
Danke für den Hinweis auf jeden Fall.

Ich habe jetzt erstmal wieder Platz 1 gesichert. Mit der richtigen Laufstrategie ist scheinbar noch mehr möglich


----------



## Spacerat (17. Aug 2009)

Neee, das Problem existiert weiterhin, leider. Ich könnte mich der Sache ja mal annehmen. Dazu brauch' ich allerdings Quellcode. Wenn er von dir kommt, unterschreibe ich auch 'ne Vertraulichkeitserklärung. Wenn nicht dauerts wegen decompile ein wenig länger 
@Edit: Ich editiere den EThread noch mal, so wie er anno dazumal ohne dieses ganze wait() und notify() Gedöns war. Ich glaube nämlich fast, das ist recht überflüssig.


----------

