AndEngine видимый прямоугольник

Я пытаюсь создать дополнительный прямоугольник видимости на основной сцене. Итак, у меня есть основная камера 480x800, которая показывает мне сцену как она есть, и я хотел бы прикрепить дополнительный объект или сцену, которая будет иметь прямоугольник видимости. Так что, если я буду перетаскивать предметы внутрь него, они не исчезнут в одно мгновение, они исчезнут постепенно. введите здесь описание изображения


person Alex    schedule 17.06.2013    source источник
comment
Привет, я написал здесь класс контейнера с примером его использования, stackoverflow.com/questions/16560616/ Существует метод SetAlphaPadding() (по мере приближения фигур к границам контейнера их альфа-канал уменьшается), который может быть похож на то, что вы ищете или вы можете настроить его, чтобы получить то, что вы хотите.   -  person Steven    schedule 18.06.2013
comment
Кроме того, я не говорю, что это единственный способ, но пробовали ли вы удалить квадратную альфа-дырку на фоне? Я сделал подобное в одной из своих игр. Затем фон устанавливается на z-порядок 1, а все «внутри» квадрата устанавливается на z-порядок 0. Затем вы можете установить квадратный фон, чтобы он соответствовал фактическому фону, чтобы сделать его бесшовным. Любой контент за пределами квадрата будет отображаться поверх.   -  person Steven    schedule 18.06.2013
comment
Такая хорошая идея, я попробую это, чувак. Но до сих пор не ясно, как это сделать... Но я попробую   -  person Alex    schedule 18.06.2013


Ответы (1)


Как описано в моем предыдущем комментарии, вы можете удалить квадратную альфа-дырку в фоновом спрайте. Вы можете сделать это просто с помощью редактора изображений, добавив альфа-пиксели, или вы можете сделать это динамически следующим образом:

//set the background to white - so we can see our square alpha
//cut out later
mScene.setBackground(new ColorBackground(1.0f, 1.0f, 1.0f));

//Create and load bitmap texture atlas
BitmapTextureAtlas mBitmapBGTextureAtlas = new BitmapTextureAtlas(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
mActivity.getEngine().getTextureManager().loadTextures(mBitmapBGTextureAtlas);


//Get image in assets and decode into bitmap
InputStream ims;
try {
    ims = mActivity.getAssets().open("gfx/my_backgound.jpg");
} catch (IOException e) {
// TODO Auto-generated catch block
    e.printStackTrace();
    return;
}   
Bitmap Bitmap_bg = BitmapFactory.decodeStream(ims);

//In my case the image is different than the height and width of the camera
//so store the ratio of size and height that the image will be resized to
float XScale = Bitmap_bg.getWidth()/mCamera.getWidth();
float YScale = Bitmap_bg.getHeight()/mCamera.getHeight();

//Cut out the alpha square, if our camera is 480x800, the square will appear
//at (40,200) and will be size 400x400
Bitmap_bg = cutSquareOutOfBitmap(Bitmap_bg, 40 * XScale, 200 * YScale, 400 * XScale , 400 * YScale);

//Get our edited bitmap into a region of the texture atlas
BitmapTextureAtlasSource source = new BitmapTextureAtlasSource(Bitmap_bg);
mBackground = BitmapTextureAtlasTextureRegionFactory.createFromSource(mBitmapBGTextureAtlas, source, 0, 0);
Bitmap_bg.recycle();

//Finally, create our background sprite with this new texture region
Sprite mBackgroundSprite = new Sprite(0, 0, mCamera.getWidth(), mCamera.getHeight(), mBackground);
mBackgroundSprite.setZIndex(1);
mScene.attachChild(mBackgroundSprite);

И функция cutSquareOutOfBitmap()

public static Bitmap cutSquareOutOfBitmap(Bitmap MyImage,  float Xpos,  float Ypos, float Width, float Height) { 

    Bitmap mBitmap = MyImage.copy(Bitmap.Config.ARGB_8888, true);

    Paint mPaint = new Paint(); 

    Canvas mCanvas = new Canvas(mBitmap ); 

     mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);          
    mPaint .setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));  
    mPaint .setColor(Color.TRANSPARENT); 

    mCanvas.drawBitmap(mBitmap , 0, 0, null); 
    mCanvas.drawRect(Xpos, Ypos, Xpos + Width, Ypos + Height, mPaint ); 

    return mBitmap ;
}

Если вы запустите это - не на что смотреть, но большой белый квадрат, однако, это прозрачная область, квадрат на самом деле является фоном, который мы установили ранее.

Чтобы продемонстрировать, как содержимое будет скрыто, вы можете создать прокручиваемую область, как упоминалось в моем предыдущем комментарии. Я написал небольшой класс контейнера, который вы можете использовать,

Пользовательский ScrollView в andengine

Под первым блоком кода в этом ответе, после,

mScene.attachChild(mBackgroundSprite);

Теперь вы можете добавить,

//Now we can use the ShapeScrollContainer just as an example so the user can
//scroll our container shapes around

//Create it around the same area as the cut out
ShapeScrollContainer mShapeScrollContainer = new ShapeScrollContainer(40, 200, 400, 400, new IShapeScrollContainerTouchListener() {

    @Override
    public void OnContentClicked(Shape pShape) {
        // TODO Auto-generated method stub
        //Add code here for content click event
    }

});

//Disable the ShapeScrollContainer ability to change the visibility
//of contents - we no longer require this as the background will
//cover them outside of the bounds of the ShapeScrollContainer itself
mShapeScrollContainer.SetContentVisiblitiyControl(false);
//Disable alpha
mShapeScrollContainer.SetAlphaVisiblitiyControl(false);
//Allow user to scroll both horizontally and vertically
mShapeScrollContainer.SetScrollableDirections(true, true);
//Don't allow the user to scroll to no where
mShapeScrollContainer.SetScrollLock(true);
//Allow use to scroll half the container over in either direction
mShapeScrollContainer.SetScrollLockPadding(50.0f,50.0f);
//Attach the container to the scene and register the event listener
mScene.registerTouchArea(mShapeScrollContainer);
mScene.attachChild(mShapeScrollContainer);

//Finally add some content to the container, what ever extends Shape,
//Sprite, Animated Sprite, Text, ChangeableText e.t.c.

Rectangle mRectangle = new Rectangle(200, 360, 80, 80);
mRectangle.setColor(0.0f, 1.0f, 0.0f);
mRectangle.setZIndex(0);    
//Attach to the scene and the ShapeScrollContainer
mScene.attachChild(mRectangle);
mShapeScrollContainer.Add(mRectangle);

Rectangle mRectangle2 = new Rectangle(40, 360, 80, 80);
mRectangle2.setColor(0.0f, 0.0f, 1.0f);
mRectangle2.setZIndex(0);
mScene.attachChild(mRectangle2);
mShapeScrollContainer.Add(mRectangle2);

Rectangle mRectangle3 = new Rectangle(360, 360, 80, 80);
mRectangle3.setColor(1.0f, 1.0f, 0.0f);
mRectangle3.setZIndex(0);
mScene.attachChild(mRectangle3);
mShapeScrollContainer.Add(mRectangle3);

//And sort the order in which shapes are rendered
mScene.sortChildren();

Теперь вы должны получить что-то вроде следующего после прокрутки:

Снимки экрана при прокрутке

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

Или вы можете физически разделить свой фон на 4 окружающих прямоугольника и центральный квадрат с помощью графического редактора. Затем создайте 5 спрайтов, установите порядок z четырех прямоугольников на 2, квадрата на 0 и любых спрайтов содержимого на 1.

Надеюсь, это полезно.

person Steven    schedule 18.06.2013