2016-02-07 8 views
2

Я пытаюсь внедрить взрыв в свою игру, но анимация останавливается после первого кадра. Если игрок теряет здоровье, взрыв должен срабатывать. Я сделал 3 класса. Класс анимации, класс взрывов и класс GameActivity. Я попытался опубликовать только соответствующие фрагменты. Я искал в Интернете, но не смог найти решение моей проблемы. Поэтому я спрашиваю вас, видите ли вы мою ошибку и можете мне помочь. Если потребуется больше кода, я его отредактирую, конечно. Может быть, я просто что-то пропускаю.Анимационные остановки после первого кадра

Animation Class{ 
public void setFrames(Bitmap[] frames) 
{ 
this.frames = frames; 
currentFrame = 0; 
startTime = System.nanoTime(); 
} 
public void setDelay(long d){delay = d;} 
public void setFrame(int i){currentFrame= i;} 

public void work() 
{ 
long elapsed = (System.nanoTime()-startTime)/1000000; 
if(elapsed>delay) 
{ 
currentFrame++; 
startTime = System.nanoTime(); 
} 
if(currentFrame == frames.length){ 
currentFrame = 0; 
playedOnce = true; }} 

public Bitmap getImage(){ 
return frames[currentFrame]; 
} 
public int getFrame(){return currentFrame;} 
public boolean playedOnce(){return playedOnce; }} 

Это соответствующая часть класса взрывобезопасности:

Bitmap[] image = new Bitmap[numFrames]; 

//Bitmap has 4 * 4 frames 
for (int i = 0; i < image.length; i++) { 
if (i % 4 == 0 && i > 0) row++; 
image[i] = Bitmap.createBitmap(spritesheet, (i - (4 * row)) * width, 
row * height, width*4, height*4); 
} 
animation.setFrames(image); 
animation.setDelay(10); 
} 
public void animating() { 
if (!animation.playedOnce()) { 
animation.work(); }} 

Если игрок теряет все свое здоровье я называю взрыв в GameActivity

if (player.getHealth() < 0) { 
// player bitmap disappears 
dissapear = true; 
//game ends 
gameEnded=true; 
explosion = new Explosion(BitmapFactory.decodeResource(getResources(), 
R.drawable.images),player.getX(),player.getY()-10,9,9,25); 
explosion.animating(); 

ответ

0

я решил. Проблема была в моей игровой деятельности. Я должен был изменить

if (player.getHealth() < 0) { 
// player bitmap disappears 
dissapear = true; 
//game ends 
gameEnded=true; 
explosion = new Explosion(BitmapFactory.decodeResource(getResources(), 
R.drawable.images),player.getX(),player.getY()-10,9,9,25); 
explosion.animating();} 

в

if (player.getHealth() < 0) { 
// player bitmap disappears 
dissapear = true; 
//game ends 
gameEnded=true; 
explosion = new Explosion(BitmapFactory.decodeResource(getResources(), 
R.drawable.images),player.getX(),player.getY()-10,9,9,25); 
} 

if (dissapear){explosion.animating();} 
0

Это основной код, который я использовать для загрузки спрайт-листа и захвата спрайтов:

 package com.animation.main; 

    import java.awt.Graphics; 
    import java.awt.Image; 
    import java.awt.image.BufferedImage; 
    import java.io.IOException; 
    import java.util.ArrayList; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 

    import javax.swing.JFrame; 

    public class Main extends JFrame{ 

BufferedImage sprite; 

Animator player; 

public Main(){ 
    setSize(800, 600); 
    setVisible(true); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
    init(); 


} 

private void init(){ 
    BufferedImageLoader loader = new BufferedImageLoader(); 
    BufferedImage spriteSheet = null; 
    try { 
     spriteSheet = loader.loadImage("insert your sprite sheet path here"); 
    } catch (IOException ex) { 
     // TODO Auto-generated catch block 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    SpriteSheet ss = new SpriteSheet(spriteSheet); 

    ArrayList<BufferedImage> sprites = new ArrayList<BufferedImage>(); 

    sprites.add(ss.grabSprite(0, 16, 92, 109)); 
    sprites.add(ss.grabSprite(94, 16, 92, 109)); 
    sprites.add(ss.grabSprite(196, 12, 92, 115)); 
    sprites.add(ss.grabSprite(387, 5, 92, 115)); 
    sprites.add(ss.grabSprite(387, 5, 92, 115)); 
    sprites.add(ss.grabSprite(487, 5, 92, 115)); 
    sprites.add(ss.grabSprite(587, 5, 77, 115)); 

    player = new Animator(sprites); 
    player.setSpeed(100); 
    player.start(); 
} 

Image dbImage; 
Graphics dbg; 

public void paint(Graphics g){ 
    dbImage = createImage(getWidth(), getHeight()); 
    dbg = dbImage.getGraphics(); 
    paintComponent(dbg); 
    g.drawImage(dbImage, 0, 0, null); 

} 


private void paintComponent(Graphics g) { 
    if(player != null) { 
     g.drawImage(player.sprite, 100, 100, null); 
     player.update(System.currentTimeMillis()); 

    } 
    repaint(); 

} 

public static void main(String[] args){ 
    Main main = new Main(); 
} 
} 

Параметры для «sprites.add (ss.grabSprite (0, 16, 92, 109)); код - это значение x и y вашего верхнего левого угла спрайтов на странице спрайта и его ширине и высоте.

Выполнить код в классе paintComponent когда здоровье игроков меньше или равно 0. Это будет выглядеть примерно так:

private void paintComponent(Graphics g) { 
    if(player != null && playerHealth <= 0) { 
     g.drawImage(player.sprite, 100, 100, null); 
     player.update(System.currentTimeMillis()); 

    } 
    repaint(); 

} 

Это код, я использую для spritesheet:

package com.animation.main; 

    import java.awt.image.BufferedImage; 

    public class SpriteSheet { 

public BufferedImage spriteSheet; 

public SpriteSheet(BufferedImage ss){ 
    this.spriteSheet = ss; 
} 

public BufferedImage grabSprite(int x, int y, int width, int height){ 
    BufferedImage sprite = spriteSheet.getSubimage(x, y, width, height); 
    return sprite; 

} 

Функция захвата спрайтов и спрайт BufferedImage получает спрайт из спрайта.

Это BufferedImageLoader:

package com.animation.main; 

import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 

import javax.imageio.ImageIO; 


public class BufferedImageLoader { 

public BufferedImage loadImage(String pathRelativeToThis) throws  IOException{ 

    URL url = this.getClass().getResource(pathRelativeToThis); 
    BufferedImage img = ImageIO.read(url); 
    return img; 
} 

}

Это класс аниматор:

package com.animation.main; 

    import java.awt.image.BufferedImage; 
    import java.util.ArrayList; 

    public class Animator { 

ArrayList<BufferedImage> frames; 

BufferedImage sprite; 

private volatile boolean running = false; 

private long previousTime, speed; 
private int frameAtPause, currentFrame; 



public Animator(ArrayList<BufferedImage> frames){ 
    this.frames = frames; 
} 

public void setSpeed(long speed){ 
    this.speed = speed; 
} 

public void update(long time){ 
    if(running){ 
     if(time - previousTime >= speed){ 
      // Update animation 
      currentFrame++; 
      try{ 
       sprite = frames.get(currentFrame); 
      } catch(IndexOutOfBoundsException e){ 
       currentFrame = 0; 
       sprite = frames.get(currentFrame); 
      } 

      previousTime = time; 
     } 
    } 
} 
public void start(){ 
    running = true; 
    previousTime = 0; 
    currentFrame = 0; 
    frameAtPause = 0; 

} 
public void stop(){ 
    running = false; 
    previousTime = 0; 
    currentFrame = 0; 
    frameAtPause = 0; 
} 
public void pause(){ 
    frameAtPause = 0; 
} 
public void resume(){ 

} 

} 
+0

The Android SDK не поддерживает BufferedImage. Я не могу использовать ваш код. – saadet

Смежные вопросы