Всем привет!
Начинаю учить теорию геймдева. Хочу спросить - какой тип анимации в андроид лучше использовать в стрелялке по движущимся объектам?
Спрашиваю потому, что в литературе встретил уже несколько видов анимации. И там описывается, как создать тот или иной вид, а где какой из них применять - нет.
Тип анимации для шутера
-
samodelkin
- Сообщения: 52
- Зарегистрирован: 27 ноя 2013, 15:23
Re: Тип анимации для шутера
Я использую в своих играх самодельный класс Спрайта, также есть класс замощенного слоя, имея эти классы можно делать любые игры.
-
samodelkin
- Сообщения: 52
- Зарегистрирован: 27 ноя 2013, 15:23
Re: Тип анимации для шутера
А так по идее для анимации используются классы из пакета drawable.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Тип анимации для шутера
Те анимации, что описаны в этих уроках, для создания игр не подойдут.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
-
samodelkin
- Сообщения: 52
- Зарегистрирован: 27 ноя 2013, 15:23
Re: Тип анимации для шутера
Вам скорей всего нужна спрайтовая анимация, которая является основной для создания множества игр, возьмите мой класс , в котором есть проверка столкновений непрозрачных пикселей , а также кадровая анимация. Пока нет вращения, со временем добавлю.
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.MotionEvent;
public class Sprite {
/** Изображения спрайта */
protected final Bitmap[] mFrames;
/** Текущий индекс отрисовываемого спрайта (для анимаций) */
private int mFrameIndex;
/** Последовательность кадров */
private int[] mFrameSequence;
/** Координаты спрайта */
private final Point mPosition;
/** Ограничивающий прямоугольник (для отслеживания столкновений) */
private final Rect mBounds;
/**Видимость спрайта */
private boolean mVisible;
public Sprite(Bitmap[] bitmaps) {
mFrames = new Bitmap[bitmaps.length];
System.arraycopy(bitmaps, 0, mFrames, 0, bitmaps.length);
mFrameIndex = 0;
mFrameSequence=new int[bitmaps.length];
for(int n=0;n<bitmaps.length;n++) mFrameSequence[n]=n; //заполнение последовательности кадров по умолчанию
mBounds = new Rect(0, 0, bitmaps[0].getWidth(), bitmaps[0].getHeight());
mPosition = new Point(0, 0);
this.mVisible = true;
}
public int getX() {
return mPosition.x;
}
public int getY() {
return mPosition.y;
}
public int getWidth() {
return mBounds.width();
}
public int getHeight() {
return mBounds.height();
}
public int getFrameIndex() {
return mFrameIndex;
}
public void nextFrame() {
mFrameIndex++;
if (mFrameIndex== mFrameSequence.length) {
mFrameIndex = 0;
}
}
public void prevFrame() {
mFrameIndex--;
if (mFrameIndex < 0) {
mFrameIndex = mFrameSequence.length - 1;
}
}
public void setFrame(int frame) {
this.mFrameIndex = frame;
}
public void setFrameSequence(int[] frameSequence){
mFrameSequence=new int[frameSequence.length];
mFrameSequence=frameSequence;
}
public int getFrameSequenceLength(){
return mFrameSequence.length;
}
public boolean collidesWith(Sprite s,boolean pixelLevel) {
boolean b=false;
if (!pixelLevel) b=Rect.intersects(getBoundsRect(), s.getBoundsRect());
else if (pixelLevel && Rect.intersects(getBoundsRect(), s.getBoundsRect())) { //проверка столкновения непрозрачных пикселей при условии совпадения столкновения ограничивающих прямойгольников
//проверка столкновения непрозрачных пикселей картинок спрайтов
for(int x1=0;x1<this.mFrames[mFrameIndex].getWidth();x1++){
for(int y1=0;y1<this.mFrames[mFrameIndex].getHeight();y1++){
if (this.mFrames[mFrameIndex].getPixel(x1, y1)==Color.TRANSPARENT) continue; //если пиксель прозрачный,то не проверять столкновение с пикселями другой картинки
for(int x2=0;x2<s.getWidth();x2++){
for(int y2=0;y2<s.getHeight();y2++){
if (this.getX()+x1==s.getX()+x2 && this.getY()+y1==s.getY()+y2 && this.mFrames[0].getPixel(x1,y1)!=Color.TRANSPARENT && s.mFrames[0].getPixel(x2, y2)!=Color.TRANSPARENT) return true;
}
}
}
}
}
return b;
}
public boolean collidesWith(Rect rect) {
return Rect.intersects(getBoundsRect(), rect);
}
public boolean collidesWith(Point point) {
return Rect.intersects(getBoundsRect(), new Rect(point.x, point.y,
point.x, point.y));
}
public boolean collidesWith(MotionEvent me) {
boolean b = false;
Point p = new Point();
p.set((int) me.getX(), (int) me.getY());
if (this.collidesWith(p))
b = true;
return b;
}
public void defineCollisionRectangle(Rect rect) {
mBounds.set(rect);
}
/**
* Получаем ограничивающий прямоугольник с учётом позиции спрайта.
*/
private Rect getBoundsRect() {
Rect bounds = new Rect(mBounds);
bounds.offset(mPosition.x, mPosition.y);
return bounds;
}
public void move(int dx, int dy) {
mPosition.offset(dx, dy);
}
public void setPosition(int x, int y) {
mPosition.set(x, y);
}
public boolean isVisible() {
return this.mVisible;
}
public void setVisible(boolean visible) {
this.mVisible = visible;
}
public void paint(Canvas canvas, Paint paint) {
if (this.mVisible)
canvas.drawBitmap(mFrames[mFrameSequence[mFrameIndex]], this.mPosition.x,
this.mPosition.y, null);
}
}
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.MotionEvent;
public class Sprite {
/** Изображения спрайта */
protected final Bitmap[] mFrames;
/** Текущий индекс отрисовываемого спрайта (для анимаций) */
private int mFrameIndex;
/** Последовательность кадров */
private int[] mFrameSequence;
/** Координаты спрайта */
private final Point mPosition;
/** Ограничивающий прямоугольник (для отслеживания столкновений) */
private final Rect mBounds;
/**Видимость спрайта */
private boolean mVisible;
public Sprite(Bitmap[] bitmaps) {
mFrames = new Bitmap[bitmaps.length];
System.arraycopy(bitmaps, 0, mFrames, 0, bitmaps.length);
mFrameIndex = 0;
mFrameSequence=new int[bitmaps.length];
for(int n=0;n<bitmaps.length;n++) mFrameSequence[n]=n; //заполнение последовательности кадров по умолчанию
mBounds = new Rect(0, 0, bitmaps[0].getWidth(), bitmaps[0].getHeight());
mPosition = new Point(0, 0);
this.mVisible = true;
}
public int getX() {
return mPosition.x;
}
public int getY() {
return mPosition.y;
}
public int getWidth() {
return mBounds.width();
}
public int getHeight() {
return mBounds.height();
}
public int getFrameIndex() {
return mFrameIndex;
}
public void nextFrame() {
mFrameIndex++;
if (mFrameIndex== mFrameSequence.length) {
mFrameIndex = 0;
}
}
public void prevFrame() {
mFrameIndex--;
if (mFrameIndex < 0) {
mFrameIndex = mFrameSequence.length - 1;
}
}
public void setFrame(int frame) {
this.mFrameIndex = frame;
}
public void setFrameSequence(int[] frameSequence){
mFrameSequence=new int[frameSequence.length];
mFrameSequence=frameSequence;
}
public int getFrameSequenceLength(){
return mFrameSequence.length;
}
public boolean collidesWith(Sprite s,boolean pixelLevel) {
boolean b=false;
if (!pixelLevel) b=Rect.intersects(getBoundsRect(), s.getBoundsRect());
else if (pixelLevel && Rect.intersects(getBoundsRect(), s.getBoundsRect())) { //проверка столкновения непрозрачных пикселей при условии совпадения столкновения ограничивающих прямойгольников
//проверка столкновения непрозрачных пикселей картинок спрайтов
for(int x1=0;x1<this.mFrames[mFrameIndex].getWidth();x1++){
for(int y1=0;y1<this.mFrames[mFrameIndex].getHeight();y1++){
if (this.mFrames[mFrameIndex].getPixel(x1, y1)==Color.TRANSPARENT) continue; //если пиксель прозрачный,то не проверять столкновение с пикселями другой картинки
for(int x2=0;x2<s.getWidth();x2++){
for(int y2=0;y2<s.getHeight();y2++){
if (this.getX()+x1==s.getX()+x2 && this.getY()+y1==s.getY()+y2 && this.mFrames[0].getPixel(x1,y1)!=Color.TRANSPARENT && s.mFrames[0].getPixel(x2, y2)!=Color.TRANSPARENT) return true;
}
}
}
}
}
return b;
}
public boolean collidesWith(Rect rect) {
return Rect.intersects(getBoundsRect(), rect);
}
public boolean collidesWith(Point point) {
return Rect.intersects(getBoundsRect(), new Rect(point.x, point.y,
point.x, point.y));
}
public boolean collidesWith(MotionEvent me) {
boolean b = false;
Point p = new Point();
p.set((int) me.getX(), (int) me.getY());
if (this.collidesWith(p))
b = true;
return b;
}
public void defineCollisionRectangle(Rect rect) {
mBounds.set(rect);
}
/**
* Получаем ограничивающий прямоугольник с учётом позиции спрайта.
*/
private Rect getBoundsRect() {
Rect bounds = new Rect(mBounds);
bounds.offset(mPosition.x, mPosition.y);
return bounds;
}
public void move(int dx, int dy) {
mPosition.offset(dx, dy);
}
public void setPosition(int x, int y) {
mPosition.set(x, y);
}
public boolean isVisible() {
return this.mVisible;
}
public void setVisible(boolean visible) {
this.mVisible = visible;
}
public void paint(Canvas canvas, Paint paint) {
if (this.mVisible)
canvas.drawBitmap(mFrames[mFrameSequence[mFrameIndex]], this.mPosition.x,
this.mPosition.y, null);
}
}
-
samodelkin
- Сообщения: 52
- Зарегистрирован: 27 ноя 2013, 15:23
Re: Тип анимации для шутера
Сделал простейшую игровую библиотеку для создания игр на андроид, вот тут все о ней: http://samodroid.ru