佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1603|回复: 14

J2me games 的 子弹发射的问题

[复制链接]
发表于 28-12-2005 09:21 PM | 显示全部楼层 |阅读模式
最近还在做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;
        }
              
    }
回复

使用道具 举报


ADVERTISEMENT

发表于 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 )
應該是


  1. for( int i = 0; i < 10; i++ ){
  2.             if ( !bulletsprite[i].isVisible() ){
  3.          
  4.          bulletsprite[i].setXSpeed(0);
  5.          bulletsprite[i].setYSpeed(-6);

  6.          bulletsprite[i].setPosition( bulletplayer.getX(), bulletplayer.getY() );
  7.          bulletsprite[i].setVisible( true );
  8.          break;
  9.             } // endif
  10.         }
复制代码

[ 本帖最后由 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 ...
回复

使用道具 举报

Follow Us
 楼主| 发表于 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里处理吗?
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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) 就可以了!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 11-11-2024 10:12 AM , Processed in 0.126777 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表