[Java]Van de ene Canvas naar de ander

Pagina: 1
Acties:

  • Iwes
  • Registratie: Februari 2005
  • Laatst online: 02-10-2025
Ik moet voor school een java-spelletje maken voor de mobiele telefoon. Het spelletje is af en werkt 'perfect' (voor iemand met 1 les low-level java waarin we alleen paint uitgelegd kregen), maar nu ben ik bezig met een menu die hij eerst laat zien, van waaruit je naar het spel toe kan, maar dit werkt niet..
Hoe ik 't opgebouwd heb:

Spel is Sperminatrix,
2x een canvas: gameCanvas en startCanvas

Vanuit Sperminatrix gaat hij naar startCanvas.. Als ik dan vanuit startCanvas naar gameCanvas wil, dan werkt het niet

Java:
1
2
3
4
5
6
7
8
9
10
11
        switch(keuze)
        {
            case 1:
            try
            {
                display.setCurrent(cGame);
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }


Dit is het stukje waar hij over moet gaan in gameCanvas

cGame is al gedefinieerd in 't begin. Als Exeption geeftie null aan, maar wat ik daar mee moet weet ik eigelijk niet.. display is ook gedefinieerd.

Ik heb al geprobeerd om in de constructor 'display = Display.getDisplay(this)' neer te zetten, en dan krijg ik deze error:
code:
1
2
3
D:\Data\Java\apps\Sperminatrix\src\startCanvas.java:28: getDisplay(javax.microedition.midlet.MIDlet) in javax.microedition.lcdui.Display cannot be applied to (startCanvas)
        display =  Display.getDisplay(this);
                                  ^

Ook hier heb ik geen idee wat ik ermee/eraan moet..

Enne, ik weet dus eigelijk helemaal niks van java... Sinds 4 daagjes ben ik bezig, en dat 't spel werkt vind ik zelf al heel wat...

[ Voor 3% gewijzigd door Iwes op 10-02-2006 17:18 ]

Blaat!


  • Tjoekbezoer
  • Registratie: Maart 2003
  • Laatst online: 06-12-2025
Iwes schreef op vrijdag 10 februari 2006 @ 17:14:
Ik moet voor school een java-spelletje maken voor de mobiele telefoon.
Mobiel spelen in de wereld toevallig? :)
Spel is Sperminatrix,
2x een canvas: gameCanvas en startCanvas

Vanuit Sperminatrix gaat hij naar startCanvas.. Als ik dan vanuit startCanvas naar gameCanvas wil, dan werkt het niet

Java:
1
2
3
4
try
    display.setCurrent(cGame);
catch(Exception e)
    System.out.println(e.getMessage());
Laten we bij het begin beginnen. Het is handig om te weten wat elke functie als parameters nodig heeft, en wat hij voor waardes returned. Om dit op te zoeken is een API erg handig. Om java spellen voor de mobiele telefoon te maken gebruik je J2ME. Daarnaast ga ik er vanuit dat je MIDP 2.0 gebruikt. De API hiervoor is o.a. te vinden op http://www.j2medev.com/api/midp/index.html

Een programma voor de mobiele telefoon begint met een object van het type MIDlet, dat had je al correct zag ik. Als voorbeeld voor de rest gebruik ik even de class van mijn eigen mobiele spel:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class TheGame extends MIDlet {
    private GameScreen mainScreen;
    
    public TheGame(  ) {
        mainScreen = new GameScreen(  ); // Start the gamescreen
    }
    
    protected void startApp(  ) throws MIDletStateChangeException {
        Display.getDisplay( this ).setCurrent( mainScreen );
        mainScreen.start(  ); // Start the game thread
    }
    
    protected void pauseApp(  ) {
        
    }
    
    protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException {
        
    }
}


Hier zie je o.a. de 2 belangrijkste methodes van je spel: de constructor en startApp(). In mijn geval maak ik één scherm aan. Deze is van het type GameScreen, maar deze class is afgeleid van GameCanvas. Hieronder zie je de class structuur van mijn GameScreen object:

code:
1
2
3
4
5
6
7
8
9
java.lang.Object
  |
  +--javax.microedition.lcdui.Displayable
        |
        +--javax.microedition.lcdui.Canvas
              |
              +--javax.microedition.lcdui.game.GameCanvas
                    |
                    +--GameScreen


Nu kun je dus concluderen dat de variabele mainScreen o.a. van het type Displayable is. Dit moet ook, want enkel objecten van het type Displayable kunnen gebruikt worden in de setCurrent() methode

Goed, tot zover de constructor. De mobiele telefoon maakt automatisch een object van deze class, dus de constructor wordt automatisch aangeroepen als het spel gestart wordt. Nadat de telefoon dit object heeft aangemaakt roept ie de methode startApp() aan. Dit gebeurd dus ook automatisch. In deze methode is het verstandig om het eerste canvas als standaard te zetten. Dit doe je dus met

Java:
1
Display.getDisplay( this ).setCurrent( mainScreen );


hierbij is this een object van het type MIDlet, en mainScreen is een object van het type Displayable. Zelf roep ik daarna de methode start() aan, die vervolgens de gamethread start waardoor het spel begint te lopen. Maar dat is voor iedereen anders.
Dit is het stukje waar hij over moet gaan in gameCanvas

cGame is al gedefinieerd in 't begin. Als Exeption geeftie null aan, maar wat ik daar mee moet weet ik eigelijk niet.. display is ook gedefinieerd.
Is de variable cGame een object van het type Displayable?
Ik heb al geprobeerd om in de constructor 'display = Display.getDisplay(this)' neer te zetten, en dan krijg ik deze error:
code:
1
2
3
D:\Data\Java\apps\Sperminatrix\src\startCanvas.java:28: getDisplay(javax.microedition.midlet.MIDlet) in javax.microedition.lcdui.Display cannot be applied to (startCanvas)
        display =  Display.getDisplay(this);
                                  ^
Terugkomend op jouw probleem; ik denk dat je deze code op de verkeerde plek zet. Wat de error duidelijk maakt is dat jij de functie getDisplay() aanroept, maar je geeft geen parameter van het type MIDlet door. maw: startCanvas is geen MIDlet! Aan de naam te zien verwacht ik dat het een GameCanvas oid is.

Als je dus een ander scherm als standaard wilt zetten moet je iets doen als:

Java:
1
Display.getDisplay( MIDlet midlet ).setCurrent( Displayable canvas );


Denk er dus aan dat een object van type GameCanvas ook een Displayable is! (zie class tree hierboven)

Hopelijk heb je wat aan deze pointers. Als je er nog niet uitkomt kan ik je ook nog de broncode van mijn mobiele spel sturen, mail me maar even op tjoekbezoer[APENSTAART]gmail[PUNCTUATIE]com

  • Iwes
  • Registratie: Februari 2005
  • Laatst online: 02-10-2025
Tjoekbezoer schreef op vrijdag 10 februari 2006 @ 18:58:
Mobiel spelen in de wereld toevallig? :)
Yaps :)
Laten we bij het begin beginnen. Het is handig om te weten wat elke functie als parameters nodig heeft, en wat hij voor waardes returned. Om dit op te zoeken is een API erg handig. Om java spellen voor de mobiele telefoon te maken gebruik je J2ME. Daarnaast ga ik er vanuit dat je MIDP 2.0 gebruikt. De API hiervoor is o.a. te vinden op http://www.j2medev.com/api/midp/index.html

Een programma voor de mobiele telefoon begint met een object van het type MIDlet, dat had je al correct zag ik. Als voorbeeld voor de rest gebruik ik even de class van mijn eigen mobiele spel:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class TheGame extends MIDlet {
    private GameScreen mainScreen;
    
    public TheGame(  ) {
        mainScreen = new GameScreen(  ); // Start the gamescreen
    }
    
    protected void startApp(  ) throws MIDletStateChangeException {
        Display.getDisplay( this ).setCurrent( mainScreen );
        mainScreen.start(  ); // Start the game thread
    }
    
    protected void pauseApp(  ) {
        
    }
    
    protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException {
        
    }
}
Dit heb ik ook al. Sperminatrix is de midlet, en die displayt startCanvas
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public startCanvas cStart;
    public gameCanvas cGame;
    public Display display;
    

    public Sperminatrix ()
    {
        display =  Display.getDisplay(this);
        cGame = new gameCanvas();
        cStart = new startCanvas();
        
    }

    public void startApp ()
    {
        display.setCurrent(cStart);
    }
Hier zie je o.a. de 2 belangrijkste methodes van je spel: de constructor en startApp(). In mijn geval maak ik één scherm aan. Deze is van het type GameScreen, maar deze class is afgeleid van GameCanvas. Hieronder zie je de class structuur van mijn GameScreen object:

code:
1
2
3
4
5
6
7
8
9
java.lang.Object
  |
  +--javax.microedition.lcdui.Displayable
        |
        +--javax.microedition.lcdui.Canvas
              |
              +--javax.microedition.lcdui.game.GameCanvas
                    |
                    +--GameScreen


Nu kun je dus concluderen dat de variabele mainScreen o.a. van het type Displayable is. Dit moet ook, want enkel objecten van het type Displayable kunnen gebruikt worden in de setCurrent() methode

Goed, tot zover de constructor. De mobiele telefoon maakt automatisch een object van deze class, dus de constructor wordt automatisch aangeroepen als het spel gestart wordt. Nadat de telefoon dit object heeft aangemaakt roept ie de methode startApp() aan. Dit gebeurd dus ook automatisch. In deze methode is het verstandig om het eerste canvas als standaard te zetten. Dit doe je dus met

Java:
1
Display.getDisplay( this ).setCurrent( mainScreen );


hierbij is this een object van het type MIDlet, en mainScreen is een object van het type Displayable. Zelf roep ik daarna de methode start() aan, die vervolgens de gamethread start waardoor het spel begint te lopen. Maar dat is voor iedereen anders.

[...]

Is de variable cGame een object van het type Displayable?
Japs.. Ik heb dus in de klasse startCanvas dit gedaan:
Java:
1
    public gameCanvas cGame;


Ook heb ik display Display aangemaakt, maar als ik dus (in diezelfde klasse) het display op gGame wil zetten (gameCanvas.java dus), dan geeftie constant null terug
Terugkomend op jouw probleem; ik denk dat je deze code op de verkeerde plek zet. Wat de error duidelijk maakt is dat jij de functie getDisplay() aanroept, maar je geeft geen parameter van het type MIDlet door. maw: startCanvas is geen MIDlet! Aan de naam te zien verwacht ik dat het een GameCanvas oid is.
Japs, 't is een canvas. Als ik kijk naar de error lijkt het alsof je vanuit een canvas geen andere canvas als display kan zetten?
Als je dus een ander scherm als standaard wilt zetten moet je iets doen als:

Java:
1
Display.getDisplay( MIDlet midlet ).setCurrent( Displayable canvas );


Denk er dus aan dat een object van type GameCanvas ook een Displayable is! (zie class tree hierboven)

Hopelijk heb je wat aan deze pointers. Als je er nog niet uitkomt kan ik je ook nog de broncode van mijn mobiele spel sturen, mail me maar even op tjoekbezoer[APENSTAART]gmail[PUNCTUATIE]com
Dat GameCanvas een displayable is weet ik, maar hoe je 'm als je display zet vanuit een andere GameCanvas is me nog steeds niet echt duidelijk. Ik weet niet hoe jij je game hebt opgebouwd, maar al mijn klasgenoten nu hebben het menu gewoon met een list in de midlet zelf. Misschien ben ik iets te 'perfectionistisch' door gebruik te maken van een canvas, maar dat ziet er wel een stuk beter uit.

offtopic:
Enig idee hoe het software gedeelte van een Technisch Ontwerp (Stemmen en Stemmingen) eruit ziet? Docenten hebben geen zin meer om te reageren lijkt wel...

[ Voor 4% gewijzigd door Iwes op 10-02-2006 19:41 ]

Blaat!


  • Iwes
  • Registratie: Februari 2005
  • Laatst online: 02-10-2025
Ik heb 't nu eindelijk voor elkaar!
Hij had waarschijnlijk problemen met de variabele.. Ik gaf vanuit Sperminatrix de dingen mee, maar die heette 't zelfde als de variable in startCanvas.. HEb 't nu zo:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public startCanvas (Sperminatrix sperminatrix_, gameCanvas cGame_, Display display_) //Constructor
    {
        display = display_;
        cGame = cGame_;
        sperminatrix = sperminatrix_;

[...]

try
                {
                    display.setCurrent( cGame );
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }

En Sperminatrix, gameCanvas en Display geef ik dus mee via Sperminatrix, bij het aanmaken van startCanvas:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Sperminatrix extends MIDlet
{
    private Display display;
    public startCanvas cStart;
    public gameCanvas cGame;
    
    public Sperminatrix ()
    {
        display = Display.getDisplay(this);
        cGame = new gameCanvas();
        cStart = new startCanvas( this , cGame , display);
        
    }

    public void startApp ()
    {
        display.setCurrent(cStart);
    }


Edit:
Nu probeer ik het display weer op cStart te zetten als je in 't spel game over bent, maar het spel blijft gewoon doorgaan dan. In de API zag ik dat 't wat tijd kost voordat hij de display over zet, en aangezien hij iedere repaint probeerde het display te zetten heb ik 't zo aangepast dat het maar een keer aangeroepen wordt, maar er gebeurd gewoon niks...

Java:
1
2
3
4
5
6
7
8
9
10
            case 4:
                if(exitnr == 0)
                exit();
                break;
[...]

public void exit(){
    display.setCurrent( cStart );
    exitnr = 1;
}


Edit 2: ik edit altijd te vroeg.. Met deze werkte hij:
Java:
1
Display.getDisplay( sperminatrix ).setCurrent( sperminatrix.cStart );

[ Voor 28% gewijzigd door Iwes op 11-02-2006 15:45 ]

Blaat!