Тип анимации для шутера

Ответить
avex
Сообщения: 24
Зарегистрирован: 22 дек 2013, 06:19

Тип анимации для шутера

Сообщение avex » 18 янв 2014, 08:00

Всем привет!
Начинаю учить теорию геймдева. Хочу спросить - какой тип анимации в андроид лучше использовать в стрелялке по движущимся объектам?
Спрашиваю потому, что в литературе встретил уже несколько видов анимации. И там описывается, как создать тот или иной вид, а где какой из них применять - нет.

samodelkin
Сообщения: 52
Зарегистрирован: 27 ноя 2013, 15:23

Re: Тип анимации для шутера

Сообщение samodelkin » 18 янв 2014, 18:45

Я использую в своих играх самодельный класс Спрайта, также есть класс замощенного слоя, имея эти классы можно делать любые игры.

samodelkin
Сообщения: 52
Зарегистрирован: 27 ноя 2013, 15:23

Re: Тип анимации для шутера

Сообщение samodelkin » 18 янв 2014, 18:46

А так по идее для анимации используются классы из пакета drawable.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Тип анимации для шутера

Сообщение KamiSempai » 19 янв 2014, 20:56

Те анимации, что описаны в этих уроках, для создания игр не подойдут.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

samodelkin
Сообщения: 52
Зарегистрирован: 27 ноя 2013, 15:23

Re: Тип анимации для шутера

Сообщение samodelkin » 20 янв 2014, 05:42

Вам скорей всего нужна спрайтовая анимация, которая является основной для создания множества игр, возьмите мой класс , в котором есть проверка столкновений непрозрачных пикселей , а также кадровая анимация. Пока нет вращения, со временем добавлю.

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: Тип анимации для шутера

Сообщение samodelkin » 22 апр 2014, 14:13

Сделал простейшую игровую библиотеку для создания игр на андроид, вот тут все о ней: http://samodroid.ru

Ответить