Új hozzászólás Aktív témák
-
Alvin_ti4200
félisten
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
-
Alvin_ti4200
félisten
-
Alvin_ti4200
félisten
válasz Lortech #1127 üzenetére
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){}
}[ Szerkesztve ]
-
Alvin_ti4200
félisten
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
-
Alvin_ti4200
félisten
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), 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 Remélem úgy nagyjából világos mit szeretnék elérni
[ Szerkesztve ]
-
Alvin_ti4200
félisten
válasz loszerafin #1135 üzenetére
megcsináltam az alábbi módon (remélem jól értelmeztem a mondani valódat)
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 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?
[ Szerkesztve ]
-
Alvin_ti4200
félisten
válasz loszerafin #1137 üzenetére
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).
-
Alvin_ti4200
félisten
válasz loszerafin #1139 üzenetére
ó már túl vagyok ezen a részen, megoldottam az időzítést is Timer és TimerTask nélkül Most írom az RMS részt, hogy tárolni és megjeleníteni is tudjam a HighScore-okat
-
Alvin_ti4200
félisten
örömmel jelentem, hogy négy napnyi kemény munak után elkészültem a megközelítőleg végleges kóddal
Új hozzászólás Aktív témák
A topicot kiemeltem. Valaki nem akar egy nyitó hsz-t írni?:))
- Honor Magic5 Pro - kamerák bűvöletében
- Ford topik
- Futás, futópályák
- Milyen belső merevlemezt vegyek?
- OLED TV topic
- Havi kétszáz leégett tápcsatlakozó fut át egy Los Angeles-i szervizen
- Politika
- RAM topik
- Vezeték nélküli fülhallgatók
- AMD Ryzen 7 / 5 2***(X) "Pinnacle Ridge" (AM4)
- További aktív témák...
- MSI Optix MAG281URF Gamer Monitor!28"/4k/144hz/Rapid IPS/1ms/Freesync-G-sync/HDMI 2.1/HDR400
- ÚJ BONTATLAN Macbook Air Apple M1 M2 M3 Legújabb Magyar 1 év Garancia Deák Térnél Azonnal Átvehető
- ÉRKEZETT Legújabb Bontatlan Új M2 IPAD PRO 2022 12,9 128GB - 256GB Wi-Fi Azonnal DEÁK TÉRNÉL Átvehe
- Akció Új Bontatlan 2023 iMac 24 M3 Chip 8/10 8GB/256GB SSD Azonnal Deák Térnél Átvehető 1 év garanc
- ÚJ Apple Pencil 1 - 2 első és második generációs BONTATLAN AZONNAL ÁTVEHETŐ DEÁK TÉR