Java ME - pytania

0

Witam wszystkich mam kilka pytań dotyczące mojej gry na komórkę która jest podobna do "Battle City" z NES-a.

  1. Nie mam pojęcia jak zabrać się za strzelanie. Mniej więcej rozumie jak ma to działać, ale nie wiem jak to ugryźć. Do tego mam pocisk ustawiony w 4 kierunkach i chciałbym aby czubek pocisku był ustawiony jak lufa czołgu.

  2. Moja gra jest robiona na kafelkach ale dalej nie potrafię zrozumieć jak zrobić animowaną wodę albo żeby czołg ruszał gąsienicami.

Z góry dziękuję za pomoc.

0
  1. W obiekcie miej zmienną przechowującą stan czołgu. Jak ktoś naciśnie strzałkę w lewo, to zmień tą zmienną na "left". Kiedy strzelasz sprawdzasz stan czołgu, czy jest left, down itd. A jak wiesz w którą stronę czołg odwrócony to ładujesz odpowiedniego spritea.

  2. Animacja to po prostu podstawianie co jakiś określany czas innej klatki, zamiast jednego statycznego obrazka.

I mała rada zarejestruj się, bo ktoś się podszyje pod Ciebie i będzie Ci problemy robił.

0
  1. No dobra, a jak zrobić się poruszanie pocisku w jedną stronę? To znaczy strzele w lewo to pocisk cały czas się porusza w lewo dopóki nie natrafi na przeszkodę czy przeciwnika. Z kolizją cegieł powinienem dać sobie radę (podejrzewam, że wystarczy zrobić podobnie jak z kolizją czołga o cegły)

PS. znalazłem jakiś kod na internecie i czy możecie powiedzieć czy to jest mniej więcej dobre do mojego programu?

    
 import java.awt.*;   
   
public class bullet{   
    private int xPos;   
    private int yPos;   
    private Rectangle bullet;   
    private int direction;   
    private int Speed;   
    private int bulletpower;   
   
    public bullet(int a, int b, int c, int d, int e){   
        xPos = a;   
        yPos = b;   
        direction = c;   
        Speed = d;   
        bulletpower = e;   
    }   
   
    public void draw(Graphics g) {   
        g.setColor(Color.lightGray);   
        if(direction == 0 || direction == 1)   
            g.fillRect(xPos-1, yPos-4, 3, 9);   
        if(direction == 2 || direction == 3)   
            g.fillRect(xPos-4, yPos-1, 9, 3);   
    }   
   
    public void move(){   
        if(direction == 0)   
            yPos = yPos - Speed;   
        if(direction == 1)   
            yPos = yPos + Speed;   
        if(direction == 2)   
            xPos = xPos - Speed;   
        if(direction == 3)   
            xPos = xPos + Speed;   
    }   
   
    public Rectangle getbulletborder(){   
        if(direction == 0)   
            bullet = new Rectangle(xPos-2, yPos-5, 5, 11);   
        if(direction == 1)   
            bullet = new Rectangle(xPos-2, yPos-5, 5, 11);   
        if(direction == 2)   
            bullet = new Rectangle(xPos-5, yPos-2, 11, 5);   
        if(direction == 3)   
            bullet = new Rectangle(xPos-5, yPos-2, 11, 5);   
        return bullet;   
    }   
   
    public Point getbulletposition(){   
        return new Point(xPos, yPos);   
    }   
   
    public int getbulletpower(){   
        return bulletpower;   
    }   
   
    public int getbulletdirection(){   
        return direction;   
    }   
}  
   

zakładając, że rectangle zastąpię odpowiednimi sprite'ami.

0

Ludziska, proszę was o pomoc, bo za chiny ludowe nie mogę rozgryźć tego strzelania. Poszperałem po internecie i wiem, że na pewno trzeba utworzyć nową klasę, utworzyć piksel referencyjny oraz poruszanie się po x lub y zależnie od kierunku sprite'a. Ale jak to zrobić to nie mam zielonego pojęcia. jakby co to mogę przesłać kod źródłowy całego programu.

 package pkgGame;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;

public class clsCanvas extends GameCanvas implements Runnable {

public static final int keyDelay = 250; 

//stale dla klawiszy
public static final int upKey = 0;
public static final int leftKey = 1;
public static final int downKey = 2;
public static final int rightKey = 3;
public static final int fireKey = 4;


private boolean[] isDown = {
 false, false, false, false, false
};

private long[] keyTick = {
 0, 0, 0, 0, 0
};

private int[] keyValue = {
 GameCanvas.UP_PRESSED, GameCanvas.LEFT_PRESSED,
 GameCanvas.DOWN_PRESSED, GameCanvas.RIGHT_PRESSED,
 GameCanvas.FIRE_PRESSED
};

private boolean isRunning = true; 
private Graphics g;
private midMain fParent;

//private Image imgBG;
//private Image imgMenu;
//stores the focused menu item
//private int menuIndex = 0;
    private static final int FRAME_WIDTH = 20;
    private static final int FRAME_HEIGHT = 20;
private Image imgCzolg;
private Sprite Czolg;
private int czolgSpeed = 2;
private Image imgTileset;
private TiledLayer roadMap;
private TiledLayer blockMap;
private int x_pos; 
private int y_pos; 
private Bullet Pocisk;
    private Image imgPocisk;

 public clsCanvas(midMain m) {
     super(true);
     fParent = m;
     setFullScreenMode(true);
 }

 public void start(){
     Thread runner = new Thread(this);
     runner.start();
 }
public void loadRoadMap(){
        //wywołanie drogi
        roadMap = new TiledLayer(12, 16, imgTileset, 20, 20);

       
        
        //pętla dla drogi
        for (int y = 0; y < 16; y++){
            for (int x = 0; x < 12; x++){
               
             

                // ustawienia indeksu dla drogi
                roadMap.setCell(x, y, 2);
            }
        }

    }
 public void loadBlockMap(){
        // macierz bloków
        byte[][] blockData = {
            {11, 11 , 11 , 11 , 11, 11 , 11 , 11 , 11 , 11, 11,11 },  
            {11 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 10, 10 , 0 , 0 , 10 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 9 , 0 , 0 , 0 , 9 , 9 , 9 , 0,11},  
            {11 , 0 , 0 , 10 , 0 , 0 , 0 , 10 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0,11},  
            {11 , 0 , 0 , 0, 0, 0 , 0 ,0 , 0 , 0 , 0,11},  
            {11 , 0 , 0 , 0 , 10 , 10 ,10 , 0 , 0 , 0 , 0,11 },  
            {11 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , 0 ,11},  
            {11 , 0 , 0 , 0, 0 , 0 ,0 , 0 , 0, 0 , 0,11 },
            {11 , 0 , 0 , 0, 9 , 9 , 9 , 0 , 0, 0 , 0 ,11},
            {11 , 0 , 0 , 0, 10, 8 , 10 , 0 , 0, 0 , 0 ,11},
            {11 , 11 , 11 , 11, 11 , 11 , 11 , 11 , 11, 11 , 11 ,11}
        };
        
        //inicjacia bloków
        blockMap = new TiledLayer(12, 16, imgTileset, 20, 20);
        
        
        for (int y = 0; y < 16; y++){
            for (int x = 0; x < 12; x++){
                blockMap.setCell(x, y, blockData[y][x]);
            }
        }
        
        blockData = null;
    }
 public void load(){
     try{
            // ładowanie obrazów
        // imgBG = Image.createImage("/images/tlo.png");
         //imgMenu = Image.createImage("/images/menuitems.png");
                     // ładowanie kafelków    
            imgTileset = Image.createImage("/images/kafelki.png");
         imgCzolg = Image.createImage("/images/czolg2.png");
         imgPocisk = Image.createImage("/images/bullets.png");
     }catch(Exception ex){

         isRunning = false;
         return;
     }
      // inicjacia "duszków"
        Czolg = new Sprite(imgCzolg, 20, 20);
        Czolg.setRefPixelPosition(20/2, 20/2);


        Czolg.setFrame(0);
        
        // ustawienie pozycji
        Czolg.setPosition(20, 20);

        loadRoadMap();
        loadBlockMap();
 }

 public void unload(){
     // niszczenie obiektów
     //imgMenu = null;
     //imgBG = null;
     blockMap = null;
     roadMap = null;  
     imgTileset = null;
     imgCzolg = null;
     Czolg = null;
     
 }

 public void checkKeys(int iKey, long currTick){
     long elapsedTick = 0;

     for (int i = 0; i < 5; i++){
         // klawisz nie został naciśnięty
         isDown[i] = false;
         // urzytkownik nacisną klawisz
         if ((iKey & keyValue[i]) != 0){
             elapsedTick = currTick - keyTick[i];

             if (elapsedTick >= keyDelay){
                 // zapisz obecny czas
                 keyTick[i] = currTick;

                 isDown[i] = true;
             }
         }
     }
 }
 
 /*public void drawMenu(Graphics g){
     int cy = 0;
     for (int i = 0; i < 5; i++){

         cy = 64 + (i * 22);

         g.setClip(47, cy, 82, 20);
         if (menuIndex == i){

           g.drawImage(imgMenu, 47, cy - 20, Graphics.TOP | Graphics.LEFT);
         } else {

           g.drawImage(imgMenu, 47, cy, Graphics.TOP | Graphics.LEFT);
         }

         cy += 6;

         g.setClip(47, cy, 82, 8);

         g.drawImage(imgMenu, 47, cy - (40 + (i * 8)), Graphics.TOP | Graphics.LEFT);
     }
 }*/

 public void run() {
    int iKey = 0;
    long lCurrTick = 0;
 
    load();
    g = getGraphics();
    while(isRunning){
     
        lCurrTick = System.currentTimeMillis();
        iKey = getKeyStates();
     
        checkKeys(iKey, lCurrTick);
        
       /* if (isDown[upKey]){

            if (menuIndex > 0){
                menuIndex--;
            } else {
                menuIndex = 4;
            }
        } else if (isDown[downKey]){

            if (menuIndex < 4){
                menuIndex++;
            } else {
                menuIndex = 0;
            }
        } else if (isDown[fireKey]){

            if (menuIndex == 4){
                isRunning = false;
            }
        }*/
        

        g.setClip(0, 0, getWidth(), getHeight());

        //rysowanie logo
       // g.drawImage(imgBG, 0, 0, Graphics.TOP | Graphics.LEFT);
     
        //rysowanie menu
       // drawMenu(g);
                   // pobranie pozycji czołgu
           int cx = Czolg.getX();
           int cy = Czolg.getY();
//pobranie zmiennych
           int tx = cx;
           int ty = cy;  

   
         if ((iKey & GameCanvas.UP_PRESSED) != 0){
               // czołg patrzy do góry
               Czolg.setFrame(1);

               // czołg jedzie do góry
               cy -= czolgSpeed;
                
           } else if ((iKey & GameCanvas.DOWN_PRESSED) != 0){
               // czołg patrzy na dół
               Czolg.setFrame(0);

               // cołg jedzie na dół
               cy += czolgSpeed;
           } else if ((iKey & GameCanvas.LEFT_PRESSED) != 0){
               // czołg patrzy w lewo
               Czolg.setFrame(2);

               // mczołg jedzie w lewo
               cx -= czolgSpeed;
           } else if ((iKey & GameCanvas.RIGHT_PRESSED) != 0){
               // czołg patrzy na prawo 
               Czolg.setFrame(3);

               // czołg jedzie w prawo
               cx += czolgSpeed;
           }
          if ((iKey & GameCanvas.FIRE_PRESSED) != 0) 
	    {	    
               //tu należy wpisać klasę pocisku
	    }
         
           // pobieraj pozycję czołgu
          Czolg.setPosition(cx, cy);
          //ustalanie kolizji między czołgiem a klockiem
           if (Czolg.collidesWith(blockMap, true)){
             //ustawienia początkowej pozycji czołgu po uderzeniu w blok
             Czolg.setPosition(tx, ty);
           }
           /*
    
        g.setClip(0, 0, getWidth(), getHeight());
        
       
        g.setColor(0xffffff);*/
   
        g.drawString(Integer.toString(iKey), 2, 2, Graphics.TOP | Graphics.LEFT);
        
                   //rysuj drogę
           roadMap.paint(g);
           
           //rysuj bloki
           blockMap.paint(g);
               // rysuj duszka
           Czolg.paint(g);

        flushGraphics();
     
        try{
            Thread.sleep(30);
        } catch (Exception ex){
         
        }
    }
    g = null;
    unload();
    fParent.destroyApp(false);
    fParent = null;
 }
}

Przy okazji przepraszam, że piszę post pod postem, ale nie znalazłem nic na ten temat więc jeśli popełniłem błąd to następnym razem to się nie powtórzy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1