查看: 1603|回复: 14
|
J2me games 的 子弹发射的问题
[复制链接]
|
|
最近还在做J2ME GAMES。。。但在子弹发射上有问题。
每次我连续发射子弹时,之前的子弹会不见了。还有,每当我按着发射键发射的子弹就会停了下来。。。。以下是我部分CODE。。。请各位高手帮忙看下有什么问题????
public void run(){
Graphics g = getGraphics();
//main loop
try{
while (isPlay){
long startTime = System.currentTimeMillis();
if(isPlay){
upDate();
}
render(g);
//FPS control set frame to 30
long timeTaken = System.currentTimeMillis() - startTime;
if ( timeTaken < isDelay ){
synchronized( this ){
wait( isDelay - timeTaken );
}
}
else{
gamesThread.yield();
}
}
}
catch( InterruptedException ex ){}
}
public void upDate() {
//Player's action input
int keyStates = getKeyStates();
if ( (keyStates & LEFT_PRESSED) != 0) {
player.moveLeft();
} else if ((keyStates & RIGHT_PRESSED) !=0 ) {
player.moveRight();
} else if ((keyStates & UP_PRESSED) != 0) {
player.moveUp();
gameMAp.scrollTerrain();
} else if ((keyStates & DOWN_PRESSED) != 0) {
player.moveDown();
} else if ((keyStates & FIRE_PRESSED) != 0) {
player.SetFire();
addBullet(player);
}
player.FrameSeq();
for( int i = 0; i < 10; i++ ){
bulletsprite[i].update();
}
}
//bullet handling
private void addBullet(Players bulletplayer ){
for( int i = 0; i < 10; i++ ){
if ( !bulletsprite[i].isVisible() ){
bulletsprite[i].setXSpeed(0);
bulletsprite[i].setYSpeed(-6);
}
bulletsprite[i].setPosition( bulletplayer.getX(), bulletplayer.getY() );
bulletsprite[i].setVisible( true );
break;
}
} |
|
|
|
|
|
|
|
发表于 28-12-2005 10:36 PM
|
显示全部楼层
for( int i = 0; i < 10; i++ ){
if ( !bulletsprite.isVisible() ){
bulletsprite.setXSpeed(0);
bulletsprite.setYSpeed(-6);
}
bulletsprite.setPosition( bulletplayer.getX(), bulletplayer.getY() );
bulletsprite.setVisible( true );
break;
}
這樣是指所有的子彈都會 setPosition( player.getX, player.getY )
應該是
- for( int i = 0; i < 10; i++ ){
- if ( !bulletsprite[i].isVisible() ){
-
- bulletsprite[i].setXSpeed(0);
- bulletsprite[i].setYSpeed(-6);
- bulletsprite[i].setPosition( bulletplayer.getX(), bulletplayer.getY() );
- bulletsprite[i].setVisible( true );
- break;
- } // endif
- }
复制代码
[ 本帖最后由 flashang 于 28-12-2005 10:40 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 28-12-2005 10:36 PM
|
显示全部楼层
从Code猜测, 你的子弹不是一个独立的Object吧!
照理说每一粒子弹应该都是一个Single的Object才对. |
|
|
|
|
|
|
|
楼主 |
发表于 29-12-2005 09:53 PM
|
显示全部楼层
原帖由 flashang 于 28-12-2005 10:36 PM 发表
這樣是指所有的子彈都會 setPosition( player.getX, player.getY )
應該是
[code]
for( int i = 0; i < 10; i++ ){
if ( !bulletsprite.isVisible() ){
bulle ...
flashang,我是要它每次发射时子弹会从GAME CHRACTER 那里发射出来所以用
bulletsprite.setPosition(Player.getX(),Player.getY());
试了你的建议,但还是不WORK吖????
子弹还是每次发射后就不见了~~~~ |
|
|
|
|
|
|
|
楼主 |
发表于 29-12-2005 09:56 PM
|
显示全部楼层
原帖由 belon_cfy 于 28-12-2005 10:36 PM 发表
从Code猜测, 你的子弹不是一个独立的Object吧!
照理说每一粒子弹应该都是一个Single的Object才对.
是OBJECT 来的。。。
private MovingSprite[] bulletsprite;
bulletsprite = new MovingSprite[10];
for( int i = 0; i < 10; i++ ){
bulletsprite = new MovingSprite(imgBullet, 8, 8,0,0);
bulletsprite.setVisible(false);
} |
|
|
|
|
|
|
|
发表于 30-12-2005 01:10 AM
|
显示全部楼层
去簡查 bulletsprite.update() 吧, 或者把速度放慢來 debug ... |
|
|
|
|
|
|
|
楼主 |
发表于 1-1-2006 03:14 PM
|
显示全部楼层
新年快乐!!!!又要麻烦大家了~!!!
flashang,谢谢你的建议。现在已经可以连续发射了。但现在是发射了十次子弹过后就不可以再发射了。应该不是update的问题。因为update里只是move(X,Y)吧了。。。
大家,我想我已经找到是什么问题了。就是LOOP的问题,但还未找到解决的方法。
我需要的是这个FOR LOOP会在LOOP 完之后在一次变回0,酱我就可以有有无限子弹和连续发射子弹了了。。。。照理来说,bulletsprite 是一个ARRAY OBJECT,再call addbullet method 应该是可以再次可以连续发射10棵子弹才对的吖?但不可以的?。。。
请各位帮下忙好吗????这METHOD应怎么改????
private void addBullet(Sprite bulletplayer){
for (int i=0;i<20;i++){
if ( !bulletsprite[i].isVisible() ){
bulletsprite[i].setXspeed(0);
bulletsprite[i].setYspeed(-6);
bulletsprite[i].setPosition( bulletplayer.getX(), bulletplayer.getY() );
bulletsprite[i].setVisible( true );
break;
}
}
} |
|
|
|
|
|
|
|
发表于 1-1-2006 04:38 PM
|
显示全部楼层
想问。。。 你的bullet 几时才会visible = false? 是在bulletsprite.update里处理吗? |
|
|
|
|
|
|
|
楼主 |
发表于 1-1-2006 08:13 PM
|
显示全部楼层
原帖由 astral 于 1-1-2006 04:38 PM 发表
想问。。。 你的bullet 几时才会visible = false? 是在bulletsprite.update里处理吗?
每次INITIALIZE 后会false. 每次发射addBullet method 那里会变true....
update里只是bullet.move(X,Y)吧了。。。 |
|
|
|
|
|
|
|
发表于 1-1-2006 10:16 PM
|
显示全部楼层
1。 你的bulletsprite buffer(可以有10发)是之前就create好的吧?
2。 你一按fire key就会去检查bulletsprite buffer,并去init 它的position和speed吧?
想问。。。你在几时会reset bulletsprite buffer呢? 如果没有去destoy 或 reset它,那一旦到达max以后你的addbullet就没有作用了... |
|
|
|
|
|
|
|
楼主 |
发表于 1-1-2006 10:59 PM
|
显示全部楼层
原帖由 astral 于 1-1-2006 10:16 PM 发表
1。 你的bulletsprite buffer(可以有10发)是之前就create好的吧?
2。 你一按fire key就会去检查bulletsprite buffer,并去init 它的position和speed吧?
想问。。。你在几时会reset bulletsprite buffer呢? 如 ...
谢谢你的建议。。。。
是的,我的bulletsprite buffer在game start时就已经create 好了。。。
但,我实在不知道怎么去DESTROY 那个array object....
在for loop 里我曾经做过 loop 完后 set i=0。。。或在for loop 外面再一次initialize 那个object...但酱就马上死机了。。。。
有各位高手可以帮帮忙吗??? |
|
|
|
|
|
|
|
楼主 |
发表于 1-1-2006 11:10 PM
|
显示全部楼层
其实我看过几个SAMPLE code...但他们也没有去DESTROY OBJECT 也可以无限子弹。。?不知道为什么??就好象。。。:
private void addMissile(MovingSprite sprite) {
for (int i = 0; i < 10; i++)
if (!missileSprite[i].isVisible()) {
switch (Math.abs(sprite.getXSpeed())) {
// Fire a Blobbo missile
case 3:
missileSprite[i].setFrame(1);
missileSprite[i].setPosition(sprite.getX() + 5, sprite.getY() + 21);
missileSprite[i].setXSpeed(sprite.getXSpeed() / 2);
missileSprite[i].setYSpeed(5);
break;
// Fire a Jelly missile
case 1:
missileSprite[i].setFrame(2);
missileSprite[i].setPosition(sprite.getX() + 5, sprite.getY() + 21);
missileSprite[i].setXSpeed(0);
missileSprite[i].setYSpeed(4);
break;
// Fire a Timmy missile
case 5:
missileSprite[i].setFrame(3);
missileSprite[i].setPosition(sprite.getX() + 5, sprite.getY() + 11);
missileSprite[i].setXSpeed(sprite.getXSpeed() / 2);
missileSprite[i].setYSpeed(3);
break;
// Fire a player missile
case 2:
case 4:
missileSprite[i].setFrame(0);
missileSprite[i].setPosition(sprite.getX() + 6, sprite.getY() - 11);
missileSprite[i].setXSpeed(0);
missileSprite[i].setYSpeed(-4);
break;
}
// Show the missile
missileSprite[i].setVisible(true);
break;
}
} |
|
|
|
|
|
|
|
发表于 2-1-2006 12:36 AM
|
显示全部楼层
只要在子彈飛出螢幕後 reset visible = flase 不就可以了嗎 ?
還有另外就是當子彈打中敵人 / 牆壁 也會 reset visible = false |
|
|
|
|
|
|
|
发表于 2-1-2006 08:16 AM
|
显示全部楼层
对啊。。。可以在做collision detection(包括超出画面时)时reset那个buffer,就如flashang说的,直接set visible = false就可以了。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 2-1-2006 01:07 PM
|
显示全部楼层
原帖由 flashang 于 2-1-2006 12:36 AM 发表
只要在子彈飛出螢幕後 reset visible = flase 不就可以了嗎 ?
還有另外就是當子彈打中敵人 / 牆壁 也會 reset visible = false
谢谢你们~~~问题终于解决了!!!
就如flashang说的只要bullet 在银幕外或射中敌人setVisible(false) 就可以了!!! |
|
|
|
|
|
|
| |
本周最热论坛帖子
|