Archief - RPG in Java

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Linus41

Legacy Member
Hey,

We zijn met een groepje bezig om een soort RPG te maken in Java dit is allemaal basic. Nu zijn we bezig met de console versie alleen hebben we wat problemen. We krijgen een fout bij het runnen wanneer we ons personage willen verplaatsen op het spelbord. Ik kan de code hier niet posten omdat het geprogrammeerd is in 3 lagen model. Wel heb ik het geupload(zie link).
https://rapidshare.com/files/458168734/Project.rar
Als iemand zich geroepen voelt ons te helpen laat het dan weten aub... Dan kan ik misschien nog wat meer uitleg geven..

Alvast bedankt,

Linus41

NeverwinterX

Legacy Member
Het lijkt me nuttiger om hier te plaatsen welke fout je krijgt en bij welk stuk code dat die zich voordoet, dan de hele source code maar te plaatsen.

Linus41

Legacy Member
het is el moeilijker om het op te maken uit de code aangezien we programmeren in 3 lagen... maar ik zal het even bekijken

Linus41

Legacy Member
ja nee heb het net bekeken en je zou eigenlijk 2 klassen helemaal moete bekijken om te weten wat het doet... dus dit kan alleen als je de rar file dload. daar zitten ook de opdrachten in.

Linus41

Legacy Member
package Domein.DomeinModel.Domein;

import java.util.List;

import Domein.DomeinModel.Domein.*;
import Persistentie.persistentieBeheerder;

public class Spel {
private Spelbord bord;
private Dobbelsteen d;
int dimensiex;
int dimensiey;
private Vak vak;
private Personage p;

public Spel(Personage p){

bord = persistentieBeheerder.getInstance().geefSpelbord("level1");
p.setVak(getVak(bord.getStartpositieX(), bord.getStartpositieY()));
bord.getVak(bord.getStartpositieX(), bord.getStartpositieY()).setPersonage(p);

d = new Dobbelsteen();
}

public Spelbord getBord() {
return bord;
}


public Vak getVak(int x, int y) {
if (x >= dimensiex || y >= dimensiey) {
return null;
}
return bord.getSpelBord()[x][y];
}

public int getDimensiex() {
return dimensiex;
}
public void setDimensiex(int dimensiex) {
this.dimensiex = dimensiex;
}
public int getDimensiey() {
return dimensiey;
}

public void setDimensiey(int dimensiey) {
this.dimensiey = dimensiey;
}

public String getSpelBord() {
return bord.getSpelBord().toString();
}


public int gooiDobbelsteen(){
return d.genereerGetallen();
}
public int[] geefGetallen(){
return null;
}
public Spelbord verplaatsPersonage(int x, int y, Personage p){
System.out.println(p);
System.out.println(x);
System.out.println(y);
// HIER ZIT DE FOUT, hier geeft hij een nullpointer maar we weten niet waarom..
System.out.println(p.getVak().getX());
System.out.println(p.getVak().getY());

vak = bord.getVak(x,y);
System.out.println(vak.toString());
if(bord.isVakVrij(vak)){
System.out.println(p.getVak().getX());
bord.getVak(p.getVak().getX(), p.getVak().getY()).setPersonage(null);
bord.getVak(x, y).setPersonage(p);
p.setVak(vak);

}
else System.out.println("Vak is al bezet");
return bord;
}
}

Dit is de code waar het misloopt..

Zievereir

Legacy Member
De Personage instantievariabele wordt niet toegekend. Probeer dit eens:

Code:
public Spel(Personage p){

this.p = p; //toe te voegen
bord = persistentieBeheerder.getInstance().geefSpelbord(" level1");
p.setVak(getVak(bord.getStartpositieX(), bord.getStartpositieY()));
bord.getVak(bord.getStartpositieX(), bord.getStartpositieY()).setPersonage(p);

d = new Dobbelsteen();
}

Wolf2000me

Legacy Member
Een stacktrace gaat ge altijd hebben als er iets misloopt. Daar staat dan de regel bij waar het misloopt. Zorg er dus altijd voor dat wanneer er zoiets misgaat in je code dat je altijd die stacktrace kan opvragen/zien/logt.

Verder.. Je maakt dus je Personage aan in een andere class, en dat is goed. Het is duidelijk dat wanneer je een spel aanmaakt (new Spel()) dat er wel degelijk een Personage p bestaat. Je fout is dus te zoeken op de plaats waar je je "verplaatsPersonage" aanroept. Daar is je Personage dus null, maw. niet geïnstantieerd. Het spreekt dan ook voor zich dat als je getVak() opvraagt van null, niks dus, dat dit een fout oplevert.

Ik zou je sowieso al aanraden van je te bezinnen over welke plaats je je Personage aanmaakt.

Verder kan ik je ook alleen maar aanraden van een IDE te gebruiken. Persoonlijk zou ik als gratis IDE IntelliJ Community of Eclipse voorstellen. Mijn voorkeur gaat uit van het eerste.
Plaats in je IDE een "breakpoint" op de lijn die de fout geeft en run in "debug mode". Dan kan je zien welke inhoud je variabelen hebben en je kan dan ook door je "thread" lopen om dieper in de code te gaan. Je ziet dan waar en wanneer je methode wordt opgeroepen die de fout geeft.

Noem je variabelen ook aub niet "p" of "a" ofzo maar gewoon "personage" of "spel" etc. Wanneer je dit steevast zo doet zal je code een stuk leesbaarder worden.

Verder zou ik eigenlijk de raadgeving van Zievereir niet helemaal opvolgen want op die manier zet je een 1 op 1 relatie tussen Spel en Personage. Dit gaat op als je maar 1 personage in je spel hebt, maar anders is dit natuurlijk geen goed idee. Indien dit wel de bedoeling is, maak dan je Personage aan in de constructor van spel en maak er een class variable van.

Royalflush_1

Legacy Member
wolf

bedankt voor de uitleg, ik ben ook lid van het groepje van linus en ik heb net geprobeerd wat zevereir zei en daar is het probleem inderdaad niet met opgelost.

deze foutmelding geeft hij:

Exception in thread "main" java.lang.NullPointerException
at Domein.DomeinModel.Domein.Spel.verplaatsPersonage(Spel.java:82)
at Domein.DomeinModel.Domein.DomeinController.verplaatsPersonage(DomeinController.java:96)
at GUI.Console.verplaatsPersonage(Console.java:119)
at GUI.Console.NieuwSpel(Console.java:44)
at GUI.Console.run(Console.java:20)
at StartUp.main(StartUp.java:14)

en hier is regel 82 van de klasse spel:

System.out.println(p.getVak().getX());

afgeleid uit dit stuk code:
if(bord.isVakVrij(vak)){
System.out.println(p.getVak().getX()); // hier geeft hij de nullpointer
bord.getVak(p.getVak().getX(), p.getVak().getY()).setPersonage(null);
bord.getVak(x, y).setPersonage(p);
p.setVak(vak);

}
else System.out.println("Vak is al bezet");
return bord;

Alvast bedankt voor de snelle reacties!

Mvg

forloRn_

Legacy Member
Je drukt p al af. Als dat geen null is, is p.getVak() null en moet je zien te weten te komen waarom dat zo is. Moeten we het komen voordoen?

Royalflush_1

Legacy Member
forloRn_ zei:
Je drukt p al af. Als dat geen null is, is p.getVak() null en moet je zien te weten te komen waarom dat zo is. Moeten we het komen voordoen?

ja dat weten we dat p.getVak() null is, maar we weten niet waarom..

NeverwinterX

Legacy Member
getVak geeft null omdat dimensiex en dimensiey in Spel niet geinitialiseerd zijn (en die worden gebruikt in getVak). Leer debuggen.

Wolf2000me

Legacy Member
Jouw probleem zit ergens in die stacktrace he. Lees goed wat er staat.

Ik vermoed dus dat je je Personage aanmaakt in NieuwSpel. Indien dit niet het geval is dan zou ik dit daar doen.

Dan zou ik kijken wat er gebeurt in verplaatsPersonage() want ik denk dat daar jouw Personage al null zal zijn. Gebruik breakpoints en run in debug mode om zo per call in die stack (vandaar stacktrace bij een exception) te kijken van waar je Personage object komt.

"System.out.println(p.getVak().getX()); // hier geeft hij de nullpointer"

p = null, dwz. geen adres in het geheugen oftwel niks. Je vraagt daar "getVak()" van iets dat eigenlijk niks is. Je p is een "pointer" en dit wijst naar een geheugen adres. In jouw geval wijst p dus naar niks en kan je daar dan ook niks vandaan halen. Wanneer je er dus voor zorgt dat p wel naar iets wijst ben je al verder. Maar... je moet natuurlijk ook zorgen dat getVak() ook effectief een object terug geeft. Anders is de situatie van de pointer die naar niks wijst nog altijd van kracht want in wezen doe je dit:

Code:
Vak vak = p.getVak();
--> als vak hier null is dan vraag je dus getX() van niks.  Zelfde probleem.
float xValue = vak.getX();

Linus41

Legacy Member
na wat zoeken is het opgelost... Bedankt voor de reacties iedereen. Toch fijn om te weten dat er mensen zijn die willen helpen..

Greets
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan