PIXIJS九宮格

pixijs是一個接近原生的H5引擎,沒有可視化的界面,在九宮格方面是沒有界面去操作的,需要自己手工動手開發;

RenderTexture 這個類是可以把紋理進行有矩形選擇複製,這樣就可以實現區域內的複製和平鋪功能,有了這些功能我們就可以做九宮格了;

在這裏插入圖片描述

上面是我們要做九宮格的素材;這樣我先確定一些數據,第一寬度第二寬度,第一高度第二高度;通過這四個參數來定九宮格的區域;上面素材的定的 [45,169-45,45,143-45];其中45是邊角弧度,169是素材寬度,143是素材高度;

下面的第一個類是調用基類的,在這裏我們需要建立1-9個區域;

import * as PIXI from '../libs/pixi'
import core from './index'

class main{
	constructor(pic,context,framesize,size,pos){
        for(var i=1;i<10;i++){
        	new Frame('inframe.png',context,i,framesize,size,pos);
        }
        

	}
}

下面的類是基類,在基類中我們根據前端傳過來的1-9的區域做一些座標的調整以及寬高上的拉伸,這樣九宮格即可完成;

class frame {
		
	constructor(str,context,type,framesize,size,pos){

	var pic = this.pic = new PIXI.Sprite(PIXI.Texture.fromImage(str));
	//console.log(pic.width);
	switch(type){
		case 1:
			pic.x = 0;
			pic.y = 0;
			break;
		case 2:
			pic.x -= framesize[0];
			pic.y = 0;
			break;
		case 3:
			pic.x -= framesize[1];
			pic.y = 0;
			break;
		case 4:
			pic.x = 0;
			pic.y -= framesize[2];
			break;
		case 5:
			pic.x -= framesize[0];
			pic.y -= framesize[2];
			break;
		case 6:
			pic.x -= framesize[1];
			pic.y -= framesize[2];
			break;
		case 7:
			pic.x = 0;
			pic.y -= framesize[3];
			break;
		case 8:
			pic.x -= framesize[0];
			pic.y -= framesize[3];
			break;
		case 9:
			pic.x -= framesize[1];
			pic.y -= framesize[3];
			break;
	}
	
	
	this.canvasscale = core.view.width/750;
	this.context = context;
	this.type = type;
	this.size = size.map(i=>i*this.canvasscale)
	this.framesize = framesize;
	this.pos = pos.map(i=>i*this.canvasscale);
	this.init();
}
init(){

	var brt 	= null;
	var rt  	= null;
	var sprite 	= null;

	switch(this.type){
		case 1:
			brt 		= new PIXI.BaseRenderTexture(this.framesize[0],this.framesize[2], PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0];
			sprite.y 	= this.pos[1];
			break;
		case 2:
			brt 		= new PIXI.BaseRenderTexture(1,this.framesize[2] , PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0] + this.framesize[0];
			sprite.y 	= this.pos[1] ;

			sprite.width = this.size[0] - (this.framesize[0] + (this.pic.width-this.framesize[1]));

			break;
		case 3:
			brt 		= new PIXI.BaseRenderTexture((this.pic.width-this.framesize[1]),this.framesize[2] , PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0]+this.size[0]-(this.pic.width-this.framesize[1]);
			sprite.y 	= this.pos[1];


			break;
		case 4:
			brt 		= new PIXI.BaseRenderTexture(this.framesize[0],1, PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0];
			sprite.y 	= this.pos[1]+this.framesize[2];

			sprite.height = this.size[1] - (this.framesize[2] + (this.pic.height-this.framesize[3]));
			

			break;
		case 5:
			brt 		= new PIXI.BaseRenderTexture(2,2);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0]+this.framesize[0];
			sprite.y 	= this.pos[1]+this.framesize[2];

			sprite.width = this.size[0] - (this.framesize[0] + (this.pic.width-this.framesize[1]));
			sprite.height = this.size[1] - (this.framesize[2] + (this.pic.height-this.framesize[3]));

			console.log('height',sprite.height,sprite.width)
			break;
		case 6:
			brt 		= new PIXI.BaseRenderTexture(this.pic.width-this.framesize[1],1 , PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0]+this.size[0]-(this.pic.width-this.framesize[1]);
			sprite.y 	= this.pos[1]+this.framesize[2];

			sprite.height = this.size[1] - (this.framesize[2] + (this.pic.height-this.framesize[3]));
			break;
		case 7:
			brt 		= new PIXI.BaseRenderTexture(this.framesize[1],this.pic.height-this.framesize[3] , PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0];
			sprite.y 	= this.pos[1]+this.size[1]-(this.pic.height-this.framesize[3]);
			break;
		case 8:
			brt 		= new PIXI.BaseRenderTexture(1,this.framesize[2] , PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0]+this.framesize[0];
			sprite.y 	= this.pos[1]+this.size[1]-(this.pic.height-this.framesize[3]);

			sprite.scale.x = this.size[0] - (this.framesize[0] + (this.pic.width-this.framesize[1]));

			break;
		case 9:
			brt 		= new PIXI.BaseRenderTexture(this.pic.width-this.framesize[1],this.framesize[2] , PIXI.SCALE_MODES.LINEAR, 1);
			rt 			= new PIXI.RenderTexture(brt);
			sprite 		= new PIXI.Sprite(rt);
			sprite.x 	= this.pos[0]+this.size[0]-(this.pic.width-this.framesize[1]);;
			sprite.y 	= this.pos[1]+this.size[1]-(this.pic.height-this.framesize[3]);
			break;
	}

	




	this.context.addChild(sprite);
	core.renderer.render(this.pic,rt)
}

}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章