# [Game]"Plumbo - Lost in Depth" Preview und Fragen



## Samake03 (30. Dez 2011)

Hallo liebe Java - Mitstreiter,

da es mein erster Post ist stelle ich mich erst einmal kurz vor und komme dann zu meinem Anliegen. Mein Name ist Maik, ich bin 32 Jahre alt und hatte bis vor kurzem mit Java nichts am Hut. Ich bin eigentlich kein "Programmierer", sondern hab früher eher mal für mich "gemoddet" und mit Java betrete ich absolutes Neuland. 

Mein Interesse an Java wurde durch Minecraft geweckt und durch "Quaxli´s Spiele Tutorial" beschäftige ich mich nun eben doch damit ein wenig intensiver. Ein wenig "Erfahrung" hatte ich schon mit LUA, allerdings bin ich ehrgeizig genug um mich jetzt durch das hier auch durch zu wursteln. 

Um was geht es? Naja ich nenne es mal schon vorsichtig "Spiel" da ich nun schon ein paar Stunden Arbeit investiert habe und man sich ein paar Minuten lang damit beschäftigen kann. Der Spieletitel ist noch nicht fest, ich habe mich aber im Moment auf dem im Threadtitel "geplatzhaltert".  

Basieren tut das Ganze wie Vieles hier im Board auf _"Quaxli´s" Spiele-Tutorial._ Ich weiß bei manchem verfliegt das Interesse schon hier, allerdings bitte trotzdem mal ein Blick darauf werfen, weil ich brauch ja auch noch Hilfe.  Danke schonmal im voraus!

*"Plumbo - Lost in Depth"*

Screenshot:

Anhang anzeigen 3891

Das Spielprinzip ist im Prinzip dasselbe geblieben, es wurde nur angefangen es weiter auszubauen. Das Setting ist ein anderes (siehe Screenshot) und es gibt schon erste Items zu sammeln. Ideen wie es weitergeht, habe ich noch genug jedoch wende ich mich aus einem bestimmten Grund an euch. Viel mehr will ich noch gar nicht verraten, das bißchen derzeit vorhandene Content kann jeder selber entdecken.

Gesteuert, wird wie gehabt mit den Pfeiltasten oder alternativ mit "w,a,s,d". "Space" lässt euch später mal was schießen, im Moment macht es nur Sound und zählt Munition (ich bin mir noch nicht sicher welche Art oder ob überhaupt Waffen final reinkommen werden). "F3" zeigt sowas wie ein kleines Debug-Menü.

Alle Informationen rund um´s derzeitige "Mini-Game" stehen in einer beiliegenden Readme.

*Download:* "Plumbo - Lost in Depth" - Version 0.3

Für die Helferlein:
*Download:* Source

*(Musste leider extern hochladen, da zu groß für´s Board  )*


_*Nun zu meinen Fragen:*_

1. Wie realisiere ich so etwas wie eine absichtlich schwammige Steuerung? So dass es sich eben Schiffstypischer verhält? Die Frage ist eigentlich mein Hauptanliegen. 

2. Ich habe manchmal ein Problem mit dem "ListIterator" und einem scheinbar bekanntem Problem, nur wo setz ich an so etwas zu lösen? Komischerweise läuft alles zu 90% korrekt, aber ab und an schlägt der Teufel da unten mal zu. Mehr gibt die Konsole oder testweise "System.out.println" Meldungen nicht her.

Fehlercode:

```
Exception in thread "Thread-4" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
	at java.util.AbstractList$Itr.next(Unknown Source)
	at GameMain.doLogic(GameMain.java:471)
	at GameMain.run(GameMain.java:431)
	at java.lang.Thread.run(Unknown Source)
```

Vielen lieben Dank für das viele Lesen und schonmal viel Spaß mit dem was schon da ist. Updates werden sehr regelmäßig folgen. (Zumindest jetzt noch wo vieles Schlag auf Schlag geht  )


----------



## Helgon (30. Dez 2011)

```
ConcurrentModificationException
```

Habs zwar noch nie ausprobiert, aber eine "schammige schaukel Bewegung" würd ich einfach dadurch simulieren, dass zu der dx/dy Bewegung immer ein kleiner Zufallswert dazu kommt.


```
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.
```

Du iterierst wahrscheinlich durch ne Liste, die grad vom Thread behandelt wird.
Mach ne Kopie der Liste und iteriere mit der. Du hast doch das Quaxli Tutorial bearbeitet, da wird das doch erwähnt und behandelt?

Grüße


----------



## Samake03 (30. Dez 2011)

Deswegen wurmt mich ja der Fehler auch ein wenig.

Da der Ur-Source-Code ja aus dem Quaxli Tutorial stammte, existieren seit jeher zwei Listen. Dennoch tritt selten aber ab und wann der Fehler auf. 

Liste "actors" wird gefüllt, die daraus geklonte Liste "painter" wird abgearbeitet. Der Fehler bezieht sich komischerweise auf die Liste "actors".  

Vielleicht sieht ja jemand was im Code.  Wie setzt man an sowas zu lösen? Google brachte mich nicht wirklich weiter.


----------



## Samake03 (3. Jan 2012)

Hallo ihr,

heute bekommt ihr eine neue Version zum testen:

*Download: "Plumbo - Lost in Depth" v0.3.b

Download: SourceCode*

Es sind grötenteils Bugfixes gemacht worden und ein paar Neuerungen dabei. Sollte jetzt recht stabil sein und bis auf ein paar FrameDrops recht gut spielbar sein. Alle Änderungen im Deteil stehen in der Readme im SourceCode Download.

Ich danke euch für´s testen und wäre für ein wenig Feedback ebenfalls dankbar. 

PS: Warum kann ich den Originalthread nicht mehr bearbeiten?


----------



## Helgon (3. Jan 2012)

Hier ist nach ner Stunde ca. das Edit weg, deswegen
Viel getan hat sich ja nicht, von der "schwammigen" Steuerung spür ich leider nix und ich check auch nach 5min nicht wie dieses Scheis MG oder was auch immer (Munition) funktioniert


----------



## Samake03 (7. Jan 2012)

Vielen Dank für´s testen. 

Wieder eine neue Version mit ein paar Neuerungen und Veränderungen. Vieles ist auf dem ersten Blick nicht ersichtlich aber unter Haube wird kräftig gewerkelt und umgeschrieben.  

Die neue Steuerung ist noch nicht dabei. Ich such eigentlich nichts "schwammiges" sondern eher verzögerte Beschleunigung, Richtungswechsel und abbremsen. Bisher verlaufen die Tests dazu aber nicht so zufriedenstellend. Zumindest nicht in alle 4 Richtungen.

*Download: "Plumbo - Lost in Depth" v0.4*

Viel Spaß (soweit der schon da sein sollte) 

EDIT: Das Waffensystem ist derzeit auch in einer *ersten Version* implementiert, dazu musst du jedoch erst ein Item einsammeln, somit wird das Schiff dann geupgraded bis die Munition alle ist. 

Updates kommen regelmäßig und zur Zeit hab ich noch eine Menge Kontent im Kopf.


----------



## Helgon (7. Jan 2012)

Habs mir angeguckt, hat sich echt etwas getan, aber was bringt das AA? Ich seh keinen Unterschied


----------



## Fisch123 (8. Jan 2012)

Kurze Anmerkung: Wenn man vergiftet wurde und stirbt, dann ist man beim Neustart anfangs auch vergiftet.


----------



## Samake03 (15. Jan 2012)

Vielen Dank für die Rückmeldungen und für´s ansehen. 

Heute kommt wieder ein kleines Update, welches die meisten bekannten Bugs ausgemerzt haben sollte. Außerdem ist eine erste Version der neuen verzögerten Steuerung enthalten, damit man nicht mehr wie auf Schienen durchs Wasser gleitet.

DOWNLOAD: *"Plumbo - Lost in Depth v0.5"*

Im nächsten Update werden wieder paar Neuerungen gegen die Eintönigkeit folgen.

*Changelog zur neuen Version v0.5:*

_- mit F4 kann zwischen 2 Grafikoptionen "Schnell" und "Qualität" umgeschalten werden
- Bug behoben welcher den Spieler nach dem Sterben während er vergiftet war, 
im neu gestarteten Spiel weiter Leben abgezogen hat
- Fehler behoben welcher dem Spieler beim vergiften im "Godmode" trotzdem Schaden abgezogen hat
- Fehler behoben welcher manchmal beim einsammeln des "Schild-Items" auftrat während man
vergiftet war
- Fehler behoben welcher manchmal beim einsammeln des "Gift-Items" auftrat wenn während das Schild-Item aktiv war
- Fehler behoben der das Schiff manchmal "hüpfen" ließ, wenn man das "Schild-Item" oder "Gift-Item" einsammelte
- erste Version der komplett neuen Steuerung, welche nun verzögerte Bewegungen und abbremsen 
zulässt, sodass man nicht wie auf Schienen schwimmt und es mehr zum Unterwasser Szenario passt_


----------



## Helgon (15. Jan 2012)

Find die Steuerung wesentlich passender, lediglich die ersten paar ms des "anfahrens" scheinen leicht zu ruckeln?


----------



## Marco13 (15. Jan 2012)

Von der "ConcurrentModificationException" wird im Zusammenhang mit dem Tutorial öfter mal berichtet  da gab's ja auch extra einige Änderungen dazu... ich dachte, das sollte inzwischen gefixt sein.

Für eine "schwammige" Bewegung wäre es vielleicht "realistisch", wenn die Steuerung nicht so abgehackt wäre. Im Moment bewegt man sich, solange die Taste gedrückt ist, und wenn man losläßt, bleibt man stehen. "Realistischer" wäre, wenn man beim Drücken langsam beschleunigen und beim Loslassen langsam stehen bleiben würde - wenn also schlicht und einfach die "Physik" mit Trägheit und Beschleunigung berücksichtigt werden würde. Ob das Spiel dann mehr Spaß machen würde, ist eine andere Frage... 

Hab' den Code noch nicht angesehen, werde das aber vielleicht bei Gelegenheit mal...


----------



## xehpuk (15. Jan 2012)

Marco13 hat gesagt.:


> Für eine "schwammige" Bewegung wäre es vielleicht "realistisch", wenn die Steuerung nicht so abgehackt wäre. Im Moment bewegt man sich, solange die Taste gedrückt ist, und wenn man losläßt, bleibt man stehen. "Realistischer" wäre, wenn man beim Drücken langsam beschleunigen und beim Loslassen langsam stehen bleiben würde - wenn also schlicht und einfach die "Physik" mit Trägheit und Beschleunigung berücksichtigt werden würde.


Genau dieses Verhalten konnte ich im Spiel feststellen. Und ich finds gut. 

Die Vergiftung wird noch immer nicht richtig aufgehoben. Man sieht zwar nicht mehr vergiftet aus, die Lebenspunkte werden aber dennoch abgezogen (und dann bis zum Ende des Spiels). So kann man dann übrigens auch eine negative Lebenspunkteanzeige haben. 

Was ich sonst noch verbesserungswürdig finde, ist der Sound, der abgespielt wird, wenn man einen Fisch abknallt. Das ist dann ja dieses Fressgeräusch.


----------



## Samake03 (15. Jan 2012)

Uiuiui....so jetzt aber, nun sollte das Vergiften funktionieren und nach dem Tod auch anständig aufgehoben sein. 

Download: *"Plumbo - Lost in Depth v0.5b"*

Download Source: *SourceCode v0.5b*



Helgon hat gesagt.:


> Find die Steuerung wesentlich passender, lediglich die ersten paar ms des "anfahrens" scheinen leicht zu ruckeln?



Ja an der Performance muss ich noch kräftig schrauben. Aber das bekomm ich noch hin mit der Zeit.



Marco13 hat gesagt.:


> Von der "ConcurrentModificationException" wird im Zusammenhang mit dem Tutorial öfter mal berichtet  da gab's ja auch extra einige Änderungen dazu... ich dachte, das sollte inzwischen gefixt sein...



Den Fehler wegen "ConcurrentModificationException" hab ich mit Hilfe des Forums hier in den Griff bekommen. Im Tutorial (*.pdf) tritt er noch auf aber im Thread dazu selber gab es zum Glück noch Lösungsansätze. 

Die "schwammige" Steuerung sollte nun auch funktionieren. Noch nicht perfekt aber im Ansatz ist sie nun da.  Ich kann nur leider die Beiträge oben nicht mehr ändern. :/



xehpuk hat gesagt.:


> ...
> Die Vergiftung wird noch immer nicht richtig aufgehoben. Man sieht zwar nicht mehr vergiftet aus, die Lebenspunkte werden aber dennoch abgezogen (und dann bis zum Ende des Spiels). So kann man dann übrigens auch eine negative Lebenspunkteanzeige haben.
> 
> Was ich sonst noch verbesserungswürdig finde, ist der Sound, der abgespielt wird, wenn man einen Fisch abknallt. Das ist dann ja dieses Fressgeräusch.



Danke dir für den Hinweis. Nun muss es aber behoben sein.  Wegen Sounds muss ich generell mal sehen, ebenso das schießen. Passt ja generell nicht unter Wasser, war aber noch ein Überbleibsel aus Zeiten als es noch ein Helicopter war. 

PS: Ich habe mal den Source für diese letzte Version mit hochgeladen, falls sich wer was abschauen möchte. Aber nicht erschrecken, bin wie gesagt Anfänger und das dürfte für viele nach Chaos aussehen. Komischerweise komm ich klar damit. 


Vielen Dank für´s testen und mich rumprobieren lassen.


----------



## Helgon (15. Jan 2012)

Hey.



> Den Fehler wegen "ConcurrentModificationException" hab ich mit Hilfe des Forums hier in den Griff bekommen. Im Tutorial (*.pdf) tritt er noch auf aber im Thread dazu selber gab es zum Glück noch Lösungsansätze.




Hab zwar momentan nix mit am Hut, aber da wurden so viele Ansätze gepostet, könntest du vllt grad grob skizzieren was der für dich hilfreiche war?

Grüße


----------



## Samake03 (15. Jan 2012)

Helgon hat gesagt.:


> Hey.
> 
> Hab zwar momentan nix mit am Hut, aber da wurden so viele Ansätze gepostet, könntest du vllt grad grob skizzieren was der für dich hilfreiche war?
> 
> Grüße



Ich habe auch allesmögliche probiert. Extra noch eine dritte Liste angelegt damit die sich nicht in die Quere kamen, hat alles nichts so recht geholfen. Komischerweise haben mir dann Codeschnipsel die mal in einer viel früheren Version des Tutorials an der betroffenen Stelle drin waren geholfen. 

Ob es eine ober die richtige Lösung ist, weiss ich nicht aber für meine Zwecke hat sie geholfen. (Wenn auch glaub ein wenig zu Lasten der Performance).

Orginalcode der betroffenen Stelle im Tutorial:


```
@SuppressWarnings("unchecked")
	private void cloneVectors(){
		painter = (Vector<Sprite>) actors.clone();
	}
	
	
	private void moveObjects() {
		
		for(ListIterator<Sprite> it = actors.listIterator();it.hasNext();){
			Sprite r = it.next();
			r.move(delta);
		}
				
	}

	private void doLogic() {
		
		for(ListIterator<Sprite> it = actors.listIterator();it.hasNext();){
			Sprite r = it.next();
			r.doLogic(delta);
			
			if(r.remove){
				it.remove();
			}
		}
		
		for(int i = 0;i < actors.size();i++){
      for(int n = i+1; n<actors.size(); n++){
    
         Sprite s1 = actors.elementAt(i);
         Sprite s2 = actors.elementAt(n);
         
         s1.collidedWith(s2);
         
      }
		}
		
		if(copter.remove && gameover==0){
			gameover = System.currentTimeMillis();
		}
		
		if(gameover>0){
			if(System.currentTimeMillis()-gameover>3000){
				stopGame();
			}
		}
		
	}
```


Die selbe Stelle wie sie jetzt bei mir in etwa in Verwendung ist (die Methode moveObjects() hab ich entfernt und mit in doLogic integriert. Ebenso nutze ich mittlerweile andere Listennamen):


```
@SuppressWarnings("unchecked")
	public void cloneVectors() {
		painter_list = (Vector<HelperSprites>) objects_list.clone();
		collision_list = (Vector<HelperSprites>) objects_list.clone();
	}

	
	/* game logic - fixed source code without Iterator to prevent "java.util.ConcurrentModificationException" */
	private void doLogic() {
		
        for(int i=0;i<objects_list.size();i++){
        	objects_list.get(i).doLogic(delta);
        	objects_list.get(i).move(delta);
        	
        	HelperSprites s1 = objects_list.elementAt(i);
			if(s1.remove){
				objects_list.remove(s1);
			}
        }
        
        for (int i = 0; i < collision_list.size(); i++) {
			for (int n = i + 1; n < collision_list.size(); n++) {

				HelperSprites s1 = collision_list.elementAt(i);
				HelperSprites s2 = collision_list.elementAt(n);

				s1.collidedWith(s2);
			}
		}

		if (gameover == 0 && actor.remove && life <= 0) {
			gameover = System.currentTimeMillis();
		}

		if (gameover > 0) {
			if (System.currentTimeMillis() - gameover > 3000) {
				stopGame();
			}
		}
	}
```


----------



## Fu3L (15. Jan 2012)

Allgemein und etwas auf den Punkt gebrachter:

Ist man so bequem eine for-each Schleife zu nutzen, muss man eben die zu löschenden Objekte in einer extra Liste speichern (was nicht aufwändig ist, da ja nur die Referenzen kopiert werden) und diese dann am Ende alle entfernen:

(Beispiel aus meinem BlockSpiel.. War der einfachste Anwendungsfall... Normal ist hier nur ein Block zu entfernen, habs extra etwas umgebaut zur Demonstration. blocks ist eine Map<Integer, Block>)

```
public synchronized void deleteBlock(Point loc) {
		List<Integer> remove = new LinkedList<Integer>();
		for(Block b : blocks.values()) {
			if(b.contains(loc)) {
				remove.add(b.getID());
			}
		}
		if(!remove.isEmpty()) {
			Fct.removeAll(blocks, remove);
		}
	} // End deleteBlock
```

Ein wenig wundert mich immer, dass ich keine removeAll-Funktion bei den Map-Klassen gefunden habe, deswegen habe ich selbst eine gebaut.


```
public class Fct {
  public static <K, V> void removeAll(Map<K, V> map, List<K> list) {
		for(K k : list) {
			map.remove(k);
		}
	}
}
```

Gibts dafür schon was fertiges?


----------



## Marco13 (15. Jan 2012)

map.keySet().removeAll(toRemove);


----------



## Fu3L (15. Jan 2012)

Danke  Wusste nicht, dass es "vernünftig löscht"^^ Hatte es nur überflogen und dachte, dass dann die Values für immer in der Map leben^^


----------



## Samake03 (25. Mrz 2012)

Hallo ihr,

seit nach langer Zeit gibt es mal wieder eine neue Version. Da ich ungern in bestehendem Code rumprobiere hab ich die letzten Wochen viel Zeit in einem zweiten Projekt verbracht und die Ergebnisse hierhin wieder zurückfließen lassen.

Spielinhalt gibt es noch nicht viel Neues, die Neuerungen liegen im Detail. Als erstes sollte die Performance nun um einiges besser sein, der Gameloop wurde komplett neu gemacht und alles in allem ein wenig umstrukturiert. 

Ziel ist es immernoch solange wie möglich den Piranha´s auszuweichen und zu überleben. Benutzt die Items um euch das Leben zu erleichtern oder zumindest euer Punktekonto zu füllen. Manche Item geben euch viel Punkte, schädigen euch aber dafür für einige Zeit, also gut abwägen. 
Technische Neuerungen sind eine Pause Funktion (die war seeeehr frickelig für mich Anfänger  ) und die Möglichkeit Screenshots zu machen (Es wird ein Ordner dafür am Ort der *.jar erstellt).

*Steuerung:*

"W, A, S, D" oder "Pfeiltasten" -> steuern des Schiffs
"Leertaste" -> schießen (funktioniert nur mit eingesammelten Gun Item)
"P" -> Pause
"F2" -> Debug Modus (für euch eher unwichtig)
"F3" -> Stats anzeigen (für euch wahrscheinlich ebenso unwichtig)
"F4" -> Grafik umschalten
"F5" -> Godmode (der ist primär zum testen)
"F12" -> Screenshot erstellen

Download: PLiD v06 Alpha

Ich denke für einen Anfänger ist es eine recht gute Basis und ein tolles Übungsprojekt geworden, Lust und Ideen sind noch einige da so wirds wohl jetzt wieder schneller weitergehen. Im nächsten Update kommen dann ein Menü und neue Spielinhalte. Spielidee, Inhalte und vor allem die Texturen sind noch nicht final. Bugs sollte es soweit keine mehr geben *hoff*.

Danke an alle Tester, an alle die immer sehr nett helfen und an Quaxli  auf dessen Tutorial es ja mal beruhte, wenn auch nicht mehr viel davon übrig ist.

Grüße,
Maik


----------

