Hirdetés

Keresés

Új hozzászólás Aktív témák

  • loszerafin
    senior tag

    örömmel jelentem, hogy négy napnyi kemény munak után elkészültem a megközelítőleg végleges kóddal:)

    Már korábban akartam írni, hogy érdemes ilyen "kis" programoknál megtanulni a kód-dokumentálást, unit tesztelést és a többnyelvűséget
    http://java.sun.com/docs/books/tutorial/i18n/index.html
    http://java.sun.com/j2se/javadoc/writingdoccomments/
    http://www.devx.com/Java/Article/31983/0/page/1

  • rdi
    veterán

    megcsináltam az alábbi módon:) (remélem jól értelmeztem a mondani valódat:D)

    int[] tomb1={25,85,145,25,85,145,25,85,145};
    int[] tomb2={50,50,50,110,110,110,170,170,170};
    int[] gombtomb={512,2,1024,4,256,32,2048,64,4096};
    Random rnd=new Random();
    int veletlen=rnd.nextInt(8);
    dx=tomb1[veletlen];
    dy=tomb2[veletlen];
    sprite.next(dx,dy,veletlen);
    lm.paint(g,0,0);
    flushGraphics();
    int keyStates=getKeyStates();
    if (keyStates==gombtomb[veletlen]){
    pontszam++;
    }
    else{
    if(keyStates!=0){
    pontszam=(pontszam)-1;
    }
    }

    Apró szépséghiba, hogy az időzítések össze-visszasága miatt a jó billentyűleütéseket is néha rossznak veszi és fordítva, illetve valamiért a 2,4,5,6,8 gombok értéke nulla:F Pedig tudomásom szerint azok felveszik a LEFT_PRESSED, RIGHT_PRESSED, UP_PRESSED, DOWN_PRESSED és FIRE_PRESSED értékeit is. A gombtomb[]-ben a gombok sorrendjében tároltam le a koordinátákat, tehát az index maga a gomb száma. Lehet az a gond, hogy a paint és/vagy flushgraphics után tettem a feltételeket?

    ó megint valami jó hsz
    keyStates pont erre van szükségem...

  • loszerafin
    senior tag

    nem titkos, kedden délután már elárulhatom, akkor már túl leszek a bemutatásán és a leadásán:) Konzultáltam ma a szakirány tanárommal és azt javasolta, hogy bonstam ketté a render() metódust, mégpedig rajzolós és billentyűzetelemzős részre. Módosítsam ezek alapján a Midletben a szál run() metódusát úgy, hogy először billvizsgálatot csinál, aztán vár valamennyit, aztán egy for ciklusba tegyem bele a rajzolós metódust és ehhez mérten igazítsam mennyi ideig sleepeljen a thread. Tehát pl. 1 mp-es képváltásnál thread.sleep(50) és ciklusváltozó 0-19. Most ezt fogom megpróbálni megcsinálni, remélem sikerrel járok és utána már "csak" az RMS (RecodStore) rész van hátra az eredmények mentéséhez és kiírásához (HighScore).

    Remek.

    Kissé átpofoztam a kódodat, de nem tudom kipróbálni:

    int[] dx={25,85,145,25,85,145,25,85,145};
    int[] dy={50,50,50,110,110,110,170,170,170};
    int[] keyCodes={512,2,1024,4,256,32,2048,64,4096};
    int keyIndex=(int)(Math.random()*9);
    sprite.next(dx[keyIndex],dy[keyIndex],keyIndex);
    lm.paint(g,0,0);
    flushGraphics();
    int keyState=getKeyStates();
    if ( (keyState & keyCodes[keyIndex]) !=0 ){
    score++;
    }
    else{
    if(keyState!=0){
    score--;
    }
    }

    A keyCodes tömb számai helyett jobb lenne enum-okat használni, úgy érthetőbb lenne a program.
    Az else ágban a keyState!=0-nak utána kellene nézni, tényleg azt jelenti-e, hogy nyomtak gombot.

    És azt hiszem, itt mindent megtalálsz a témádhoz:

    [link]

    és ez se rossz:
    [link]

    Ráadásul ez az utolsó "megvan" magyarul is:
    [link]

  • loszerafin
    senior tag

    megcsináltam az alábbi módon:) (remélem jól értelmeztem a mondani valódat:D)

    int[] tomb1={25,85,145,25,85,145,25,85,145};
    int[] tomb2={50,50,50,110,110,110,170,170,170};
    int[] gombtomb={512,2,1024,4,256,32,2048,64,4096};
    Random rnd=new Random();
    int veletlen=rnd.nextInt(8);
    dx=tomb1[veletlen];
    dy=tomb2[veletlen];
    sprite.next(dx,dy,veletlen);
    lm.paint(g,0,0);
    flushGraphics();
    int keyStates=getKeyStates();
    if (keyStates==gombtomb[veletlen]){
    pontszam++;
    }
    else{
    if(keyStates!=0){
    pontszam=(pontszam)-1;
    }
    }

    Apró szépséghiba, hogy az időzítések össze-visszasága miatt a jó billentyűleütéseket is néha rossznak veszi és fordítva, illetve valamiért a 2,4,5,6,8 gombok értéke nulla:F Pedig tudomásom szerint azok felveszik a LEFT_PRESSED, RIGHT_PRESSED, UP_PRESSED, DOWN_PRESSED és FIRE_PRESSED értékeit is. A gombtomb[]-ben a gombok sorrendjében tároltam le a koordinátákat, tehát az index maga a gomb száma. Lehet az a gond, hogy a paint és/vagy flushgraphics után tettem a feltételeket?

    Jól értetted, így gondoltam, látom, gyorsan "fogod" az adást

    Lenne pár megjegyzésem a programozási stílussal kapcsolatban:

    1. Próbálj meg angol azonosítókat használni, jobban illenek a programozáshoz
    2. Próbálj meg olyan azonosítókat választani, amik a funkcióra utalnak és nem a
    tartalomra, vagy típusra (pl: veletlen, tomb nem szerencsés)
    3. Próbáld meg betartani a Sun névkonvencióit (változónevek első betűje kicsi, ha több szóból áll, akkor a többi kezdőbetű nagy
    4. Szeparáld a kódodat. rajzolás és user input mehetne külön metódusba, akár külön osztályban is lehetnének (cohesion)

    Találtam egy fórumot, talán segít, rákeresve a getkeystates szóra van pár programpélda
    [L]http://developer.sonyericsson.com/search.jspa?objID=c2&q=getkeystates[/L]

    Ha az a gyanúd, hogy az időzítések miatt megy össze vissza a programod, olvasd el ezt:

    [L]http://java.sun.com/docs/books/tutorial/essential/concurrency/sync.html[/L]
    (Legyenek a metódusaid syncronized-ek)

    De lehet megoldás az is, hogy nevezzük egy "körnek" a lámpa kigyúlásától a gomb lenyomásáig vagy az idő lejártáig tartó játékrészt.
    Ekkor a kör végén hagyd a szálakat összefutni (mindegyik fejeződjön be), majd indítsd újra a szálakat, így nem lesz olyan, hogy pl. az előző lámpához tartozó gombnyomást fogja a programod jónak érzékelni. Meg egyébként is "tisztább, szárazabb érzés" lesz, hogy a szálaid ugyanazt a "kört" kezelik.

    Hajrá, kíváncsi vagyok a programodra, ha nem titkos, küldhetnél egy forrást az emailemre.

  • loszerafin
    senior tag

    konkrétan azt szeretném elérni, hogy van egy veletlen nevű változóm, ami egy 0-8-ig terjedű szám (ezzel kreálom azt, hogy a 9 szám közül melyik váltson zöldről pirosra (értelemszerűen ezt kell majd lenyomni a billentyűzeten ahhoz, hogy kapjon a játékos egy pontot)), ez alapján csinálnék egy elágazást (jelenleg 9 darab if, de majd bevágom case-be őket:D), hogy ha veletlen=0 & GAME_A_PRESSED!=0, akkor pontszam++, else pontszam=(pontszam-1). Na ilyenből csináltam 9 fajta IF-et, csak az a bajom, hogy állandóan növeli a pontszám értékét teljesen függetlenül attól, hogy hozzányúltam-e a billentyűzethez vagy sem.:( Ráadásul én a 2,4,5,6,8 gombokkal úgy számoltam, hogy azok működnek UP,LEFT,FIRE,RIGHT,DOWN gombokként, de a keyStates-ük mindnek 0:( Így hiába teszem bele az elágazásokba őket, nem fogja érzékelni a program, ha megnyomtam:F Remélem úgy nagyjából világos mit szeretnék elérni:B

    Nagyjából érthető, nekem csak a 9 db IF szúrt szemet.

    Rakd be tömbbe a lenyomható gombokat, vizsgáld meg, a tömbben van-e a lenyomott gomb
    és egyezik-e azzal ami kell neked, ha igen adj pontot, ha nem, vonj le egyet.

    kb így :
    if nyomtak_le_gombot then
    pontszam+=(lenyomhato_gombok[veletlen] == lenyomott_gomb) ? 1 : -1;
    else lejart_az_ido then /* nem nyomott meg semmit és már vált a lámpa */
    pontszam-=1;

  • robisz
    senior tag

    nem működik (void typue not allowod here), feltételben mondom, hogy nem lehet használni, mive a keyPressed(int number) függvény akkor hívódik meg, ha a number gombot lenyomtad:(

    Mit értesz az alatt hogy "a number gombot" lenyomtad?? :)

    A "number" itt az eseménykezelő paramétere... a keyPressed MINDEN gomb lenyomásakor meghívódik, és a a number a lenyomott gomb kódja lesz. Az általad bemásolt hibaüzenet alapján azt mondom hogy valami más gond van a kódoddal.... másold be a hibás részt és kiderítjük :-)

  • robisz
    senior tag

    van két osztályom (a harmadik nem érdekes):

    SPRITECANVAS.JAVA

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    import javax.microedition.lcdui.game.*;
    import java.util.*;

    public class SpriteCanvas extends GameCanvas{
    public Command exitCommand;
    public Sprite1 sprite;

    BackgroundLayer bgLayer;
    LayerManager lm;

    public SpriteCanvas() throws java.io.IOException {
    super(false);

    exitCommand=new Command("Kilépés",Command.EXIT,0);
    addCommand(exitCommand);

    sprite=new Sprite1();
    sprite.setPosition(25,50);
    bgLayer=new BackgroundLayer();
    lm=new LayerManager();
    lm.append(sprite);
    lm.append(bgLayer);
    }

    void render(){
    Graphics g=getGraphics();

    g.setColor(255,255,255);
    g.fillRect(0,0,getWidth(),getHeight());

    int dx=0,dy=0;

    int[] tomb1={25,85,145,25,85,145,25,85,145};
    int[] tomb2={50,50,50,110,110,110,170,170,170};
    Random rnd=new Random();
    int veletlen=rnd.nextInt(8);
    dx=tomb1[veletlen];
    dy=tomb2[veletlen];
    sprite.next(dx,dy,getWidth(),getHeight(),veletlen);

    lm.paint(g,0,0);
    flushGraphics();

    }
    }

    SPRITE1.JAVA

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    import javax.microedition.lcdui.game.*;
    import java.util.*;

    public class Sprite1 extends Sprite{
    static final int width=60;
    static final int height=60;

    public int mode=0;
    static Random rnd=new Random();
    static int[] frame_sequence_1={0,1,2,3,4,5,6,7,8};

    int framecount=0;

    public Sprite1() throws java.io.IOException{
    super(Image.createImage("/hello/gomb2.png"),width,height);
    setFrameSequence(frame_sequence_1);
    }

    public void next(int dx, int dy, int maxX, int maxY, int randomize){
    setPosition(dx,dy);
    setFrame(randomize);
    }
    }

    A lényeg az lenne, hogy a render vagy next hivások között legyen monjuk egy másodpercnyi idő, amíg a lenyomott gombot (még nincs deklarálva) meg tudom vizsgálni, hogy mi volt az. Apropó létezik olyan függvény, amely a lenyomott gomb kódját adja vissza integerben? Mert keyPressed(int number) függvény van, csak az akkor fut le, ha az adott gombot nyomom meg, nekem meg pont fordítva kéne, hogy lenyomás után el tudjam dönteni, hogy melyik számú (49-57 [KEY_NUM1-KEY_NUM9]) gomb volt az és ennek megfelelően csinálni egy szép nagy case elágazást.

    A MainMidlet osztályban az egyik menüponthoz hozzárendeltem ezt az eseményt:

    try{
    spritecanvas=new SpriteCanvas();
    spritecanvas.setCommandListener(this);
    Display.getDisplay(this).setCurrent(spritecanvas);
    thread=new Thread(this);
    thread.start();
    } catch (IOException E){
    destroyApp(true);
    }

    A Runnable interfész miatt kell bele még egy Run metódus is, ezt a Midlet legvégére szúrtam be és így néz ki:

    public void run(){
    try{
    while((thread.isAlive())&&(spritecanvas!=null)){
    spritecanvas.render();
    thread.sleep(1000);

    }
    } catch (InterruptedException E1){

    }
    }

    Szia!

    A GameCanvas osztályon van egy getKeyStates() metódus, ezzel tudod lekérdezni a gombok állapotát. Pl.:

    int keyState = getKeyStates();
    if ((keyState & LEFT_PRESSED) != 0) {
    // Balra gomb le van nyomva
    }

    A user input kezelést a fő ciklusodba érdemes betenni mondjuk a renderelés elé. Az 1000 millisec sleep-elés egyébként rengeteg, így maximum 1 fps-el fog futni az animáció :)
    Akár egy 20 millisec-es sleep-elés is megteszi.

  • Lortech
    addikt

    köszi, ezeket én is megtaláltam, próbáltam belőle kihámozni a használatot, de nem tudom átültetni az én feladatomba:O

    De írd le akkor, hogy mi okozza a problémát.

    Példányosítasz a Timerből.
    Kiterjeszted a TimerTask osztályt, implementálod a run metódusát annak megfelelően, hogy mit akarsz ismételni, amikor lejár az idő.
    Példányosítasz ebből a kiterjesztett osztályból, és paraméterként átadod a Timer példányod schedule metódusának, plusz megadod az ismétlési időközt.

  • Sianis
    addikt

    J2ME-ben programozok NetBeans-ben és azt szeretném kérdezni, hogy hogyan tudok időzéítéseket használni? Nagyjából annyi lenne a feladat, hogy egy TiledLayerrel és egy Sprite-tal operálok, az előbbin mozgatom az utóbbit, viszont azt szeretném megoldani, hogy két pozícióváltás között legyen x másodperc, hogy ilyenkor a felhasználó lenyomhasson egy gombot (játékot készítek mobiltelefonra), aztán ha jót nyomott, akkor egy változót megnövelek, ha rosszat, akkor ugyanazt csökkentem. Tehát az idő-, és/vagy időzítéskezelés alapjait szeretném tudni Java-ban/J2ME-ben, előre is köszönöm, szakirányom egyik munkájához kellene:R

    Timer?

    Sianis

  • andriscs
    aktív tag

    Csinálsz egy Console nevű osztályt és belemásolod a letöltött Console osztály minden sorát, a package extra sort pedig kitörlöd. Így már elvileg tudsz majd hivatkozni rá.

    Hi!

    Ez így oké, de majd mikor ZH-t írok Java-ból, akkor mit írjak a lapra? Hogy tessék tanár úr, itt egy link, ezen ellenőrizheti, hogy az általam használt Console osztály létezik, csak nem jegyeztem meg, de amúgy müködik. :) Megpróbálom ezt a BufferedInputStream.In.Read.Int.Load.Integer.ReadLine.DoWork.Already.Java.Very.Easy.ToUse.This.Input.Read() függvényt, talán működik :D

  • andriscs
    aktív tag

    Az említett Console osztály segítségével a Console.ReadInt() paranccsal tudod beolvasni őket, ha ki akarsz írni vmit a beolvasás elé, pl., hogy ''írj be egy számot'', akkor x=Console.ReadInt(''Írj be egy számot''). Persze ha jól emléxem:)

    Hi!

    Oké, de akkor ebből a Console osztályból kellene származtatnom az eredeti osztályt, hogy elérjem a Console class metódusait. De ez a Console nem ''gyári'' Java osztály, hiába írnám be, hogy class xy extends Console. Szóval vmi eredeti Sun inputolvasás nincs? :)

    [Szerkesztve]

  • faster
    nagyúr

    Nem, arról az osztályról van szó, amiről a kolléga fentebb beszélt.

    Ez valami extra osztály, nem a Java része?

  • faster
    nagyúr

    Az említett Console osztály segítségével a Console.ReadInt() paranccsal tudod beolvasni őket, ha ki akarsz írni vmit a beolvasás elé, pl., hogy ''írj be egy számot'', akkor x=Console.ReadInt(''Írj be egy számot''). Persze ha jól emléxem:)

    Console.ReadInt() ? A Console nem .NET osztály?

    Mod: Ja nem, van Java is. Az Console.readInt();

    [Szerkesztve]

Új hozzászólás Aktív témák

Hirdetés