01、Pixi初识和搭建Pixi应用
- vue create 01-pixi
- cd 01-pixi
- npm i pixi.js
- npm run serve
- app.vue
- canvas width100vw height100vh positionFixed
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1
})
document.body.appendChild(app.view)
const rectangle = new PIXI.Graphics();
rectangle.beginFill(0x66ccff);
rectangle.drawRect(0, 0, 64, 64);
rectangle.endFill();
app.stage.addChild(rectangle);
</script>
02、Pixi图形Graphics具体应用
- vue create 01-pixi
- cd 01-pixi
- npm i pixi.js
- npm run serve
- app.vue
- canvas width100vw height100vh positionFixed
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view)
const rectangle = new PIXI.Graphics();
rectangle.beginFill(0x66ccff, 0.9);
rectangle.drawRect(0, 0, 64, 64);
rectangle.endFill();
rectangle.scale.set(2, 2);
rectangle.position.set(100, 100);
rectangle.rotation = 0.5;
rectangle.pivot.set(82, 32);
rectangle.lineStyle(4, 0xffd900, 1);
app.stage.addChild(rectangle);
cosnt circle = new PIXI.Graphics();
circle.beginFill(0x66ccff, 0.9);
circle.drawCircle(0, 0, 32);
circle.endFill();
circle.position.set(300, 300);
app.stage.addChild(circle);
</script>
03、Pixi绘制各种常见图形
- vue create 01-pixi
- cd 01-pixi
- npm i pixi.js
- npm run serve
- app.vue
- canvas width100vw height100vh positionFixed
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view)
const rectangle = new PIXI.Graphics();
rectangle.beginFill(0x66ccff, 0.9);
rectangle.drawRect(0, 0, 64, 64);
rectangle.endFill();
rectangle.scale.set(2, 2);
rectangle.position.set(100, 100);
rectangle.rotation = 0.5;
rectangle.pivot.set(82, 32);
rectangle.lineStyle(4, 0xffd900, 1);
app.stage.addChild(rectangle);
cosnt circle = new PIXI.Graphics();
circle.beginFill(0x66ccff, 0.9);
circle.drawCircle(0, 0, 32);
circle.endFill();
circle.position.set(300, 300);
app.stage.addChild(circle);
const roundedRectangle = new PIXI.Graphics();
roundedRectangle.beginFill(0x66ccff, 0.9);
roundedRectangle.drawRoundedRect(0, 0, 164, 64, 10);
roundedRectangle.endFill();
roundedRectangle.position.set(500, 500);
app.stage.addChild(roundedRectangle);
const ellipse = new PIXI.Graphics();
ellipse.beginFill(0x66ccff, 0.9);
ellipse.drawEllipse(0, 0, 164, 64);
ellipse.endFill();
ellipse.position.set(700, 700);
app.stage.addChild(ellipse);
const polygon = new PIXI.Graphics();
polygon.beginFill(0x66ccff, 0.9);
polygon.drawPolygon([0, 0, 100, 0, 100, 100, 0, 100]);
polygon.endFill();
polygon.position.set(50, 300);
add.stage.addChild(polygon);
const arc = new PIXI.Graphics();
arc.beginFill(0x660000, 0.9);
arc.arc(0, 0, 32, 0, Math.PI, false);
arc.endFill();
arc.position.set(300, 50);
app.stage.addChild(arc);
const line = new PIXI.Graphics();
line.lineStyle(4, 0xff0000, 1);
line.moveTo(0, 0);
line.lineTo(100, 100);
line.lineTo(200, 0);
line.postiion.set(500, 50);
app.stage.addChild(line);
</script>
04、Pixi纹理与动画实现
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
const texture = PIXI.Texture.from('./where/src.png');
const sprite = new PIXI.Sprite(texture);
sprite.anchor.set(0.5, 0.5);
sprite.x = app.screen.width / 2;
sprite.y = app.screen.height / 2;
sprite.rotation = Math.PI / 4;
sprite.scale.set(2, 2);
sprite.alpha = 0.5;
app.stage.addChild(sprite);
app.ticker.add((delta) => {
sprite.rotation += 0.01 * delta;
}
</script>
05、Pixi事件交互
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
const texture = PIXI.Texture.from('./where/src.png');
const sprite = new PIXI.Sprite(texture);
sprite.anchor.set(0.5, 0.5);
sprite.x = app.screen.width / 2;
sprite.y = app.screen.height / 2;
sprite.rotation = Math.PI / 4;
sprite.scale.set(2, 2);
sprite.alpha = 0.5;
app.stage.addChild(sprite);
app.ticker.add((delta) => {
sprite.rotation += 0.01 * delta;
}
sprite.interactive = true;
sprite.on('click', () => {
console.log('click');
});
const rect = new PIXI.Graphics();
rect.beginFill(0xff0000);
rect.drawRect(0, 0, 100, 100);
rect.endFill();
rect.x = 100;
rect.y = 100;
app.stage.addChild(rect);
rect.interactive = true;
rect.on('click', () => {
console.log('rect click');
});
sprite.on('pointerenter', () => {
sprite.alpha = 1;
});
sprite.on('pointerout', () => {
sprite.alpha = 0.5;
});
</script>
06、Pixi资源管理
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
PIXI.Assets.add('jian', './where/jian.png');
PIXI.Assets.add('man', './where/man.png');
PIXI.Assets.add('mujian', './where/mujian.png');
const texturesPromise = PIXI.Assets.load(['jian', 'man', 'mujian']);
texturesPromise.then((textures) => {
const container = new PIXI.Container();
const sprite = new PIXI.Sprite(textures.jian);
sprite.x = app.screen.width / 2;
sprite.y = app.screen.height / 2;
sprite.anchor.set(0.5);
sprite.scale.set(0.5);
sprite.alpha = 0.5;
sprite.rotation = 0.5;
sprite.blendMode = PIXI.BLEND_MODES.ADD;
sprite.interactive = true;
sprite.buttonMode = true;
sprite.on('pointerdown', () => {
console.log('pointerdown');
});
container.addChild(sprite);
const sprite2 = new PIXI.Sprite(textures.man);
sprite2.scale.set(0.1);
container.addChild(sprite2);
app.stage.addChild(container);
});
</script>
06-01、Pixi场景资源管理
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
PIXI.Assets.addBundle('scene1', {
'jian': './where/jian.png',
'man', './where/man.png',
'mujian', './where/mujian.png'
});
const texturesPromise = PIXI.Assets.load('scene1', (progress) => {
console.log('加载完成', progress);
});
texturesPromise.then((textures) => {
const container = new PIXI.Container();
const sprite = new PIXI.Sprite(textures.jian);
sprite.x = app.screen.width / 2;
sprite.y = app.screen.height / 2;
sprite.anchor.set(0.5);
sprite.scale.set(0.5);
sprite.alpha = 0.5;
sprite.rotation = 0.5;
sprite.blendMode = PIXI.BLEND_MODES.ADD;
sprite.interactive = true;
sprite.buttonMode = true;
sprite.on('pointerdown', () => {
console.log('pointerdown');
});
container.addChild(sprite);
const sprite2 = new PIXI.Sprite(textures.man);
sprite2.scale.set(0.1);
container.addChild(sprite2);
app.stage.addChild(container);
});
</script>
07、Pixi文字与遮罩
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
const text = new PIXI.Text('helloWorld', {
fontSize: 180,
fill: 'wihte',
align: 'center'
});
text.x = app.screen.width / 2;
text.y = app.screen.height / 2;
text.anchor.set(0.5);
const circle = new PIXI.Graphics();
circle.beginFill(0x0000ff);
circle.drawCircle(app.screen.width / 2, app.screen.height / 2, 100);
circle.endFill();
const mujian = PIXI.Sprite.from('./where/mujian.png');
const bunny = PIXI.Sprite.from('./where/bg.png');
bunny.width = app.screen.width;
bunny.height = app.screen.height;
bunny.mask = mujian;
app.state.addChild(bunny);
</script>
08、Pixi滤镜特效
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
const texture = PIXI.Texture.from('./where/mujian.png');
const sprite = new PIXI.Sprite(texture);
sprite.x = app.screen.width / 2;
sprite.y = app.screen.height / 2;
sprite.anchor.set(0.5);
app.state.addChild(sprite);
const blurFilter = new PIXI.BlurFilter();
blurFilter.blur = 20;
const outlineFilter = new OutlineFilter(2, 0x000000);
const glowFilter = new GlowFilter({
distance: 50,
outerStrength: 5,
innerStrength: 0,
color: 0xff0000,
quality: 0.5,
});
sprite.filters = [outlineFilter, glowFilter];
</script>
09、Pixi实现波浪水滴特效
<script setup>
import * as PIXI from 'pixi.js'
import { ShockwaveFilter } from 'pixi-filters';
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
const texture = PIXI.Texture.from('./where/car.png');
const sprite = new PIXI.Sprite(texture);
sprite.width = app.screen.width;
sprite.height = app.screen.height;
const container = new PIXI.Container();
container.addChild(sprite);
app.stage.addChild(container);
const text = new PIXI.Text('hello PixiJS', {
fontSize: 140,
fill: 0xffffff,
dropShadow: true,
dropShadowBlur: 4,
deopShadowAngle: Math.PI / 2,
dropShadowDistance: 6,
});
text.x = app.screen.width / 2;
text.y = app.screen.height / 2;
text.anchor.set(0.5);
container.addChild(text);
const displacementSprite = PIXI.Sprite.from('./where.displacement.png');
displacementSprite.scale.set(5);
displacementSprite.texture.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT;
const displacementFilter = new PIXI.DisplacementFilter(
displacementSprite
);
container.addChild(displacementSprite);
const shockwaveFilter1 = new ShockwaveFilter([
Math.random() * app.screen.width,
Math.random() * app.screen.height
], {
radius: 40,
waveLenght: 30,
amplitude: 10,
nbRipples: 1,
pixelate: false,
paused: false,
autoFit: flase,
speed: 200,
}, 0);
const shockwaveFilter2 = new ShockwaveFilter([
Math.random() * app.screen.width,
Math.random() * app.screen.height
], {
radius: 100,
waveLenght: 45,
amplitude: 80,
speed: 200,
}, 0);
const shockwaveFilter3 = new ShockwaveFilter([
Math.random() * app.screen.width,
Math.random() * app.screen.height
], {
radius: 160,
waveLenght: 65,
amplitude: 105,
speed: 300,
}, 0);
container.filters = [
displacementFilter,
shockwaveFilter1,
shockwaveFilter2,
shockwaveFilter3
];
app.ticker.add((delta) => {
displacementSprite.x += 1;
displacementSprite.y += 1;
createWave(shockwaveFilter1, 1);
createWave(shockwaveFilter2, 1.2);
createWave(shockwaveFilter3, 0.7);
});
function createWave(waveFilter, resetTime) {
waveFilter.time += 0.01;
if (waveFilter.time > resetTime) {
waveFilter.time = 0;
waveFilter.center = [
Math.random() * app.screen.width,
Math.random() * app.screen.height
]
}
}
app.view.addEventListener('click', (e) => {
shockwaveFilter3.cventer = [e.clientX, e.clientY];
shockwaveFilter3.time = 0;
});
</script>
10、Pixi开发谷歌恐龙跑酷小游戏
<script setup>
import * as PIXI from 'pixi.js'
const app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
backgroundColor: 0x1099bb,
resolution: window.devicePixelRatio || 1,
antialias: true,
})
document.body.appendChild(app.view);
const baseTexture = PIXI.BaseTexture.from('./where/雪碧图.png');
const dinoTexture = new PIXI.Texture(
baseTexture,
new PIXI.Rectangle(75, 0, 88, 100);
);
const dino = new PIXI.Sprite(dinoTexture);
dino.visible = false;
container.addChild(dino);
const runTextures = [];
for(let i = 0; i < 2; i++) {
runTextures.push(new PIXI.Texture(
baseTexture,
new PIXI.Rectangle(1680 + (2 + i) * 88, 0, 82, 100)
));
}
const runAnimation = new PIXI.AnimatedSprite(runTextures);
runAnimation.animationSpeed = 0.1;
runAnimation.play();
runAnimation.visible = false;
container.addChild(runAnimation);
const jumpTexture = new PIXI.Texture(
baseTexture,
new PIXI.Rectangle(1680 + 88, 0, 82, 100)
);
const jumpSprite = new PIXI.Sprite(jumpTexture);
jumpSprite.x = 60;
jumpSprite.y = window.innerHeight - 50 - 100;
jumpSprite.visible = false;
container.addChild(jumpSprite);
const groundTexture = new PIXI.Texture(
baseTexture,
new PIXI.Rectangle(50, 100, 2300, 30);
);
const groundSprite = new PIXI.TilingSprite(groundTexture);
groundSprite.width = window.innerWidth;
groundSprite.height = 30;
groundSprite.postion.set(0, window.innerHeight - 50);
container.addChild(groundSprite);
const cactusTexture = new PIXI.Texture(
baseTexture,
new PIXI.Rectangle(515, 0, 30, 60)
)
const cactusSprite = new PIXI.Sprite(cactusTexture);
cactusSprite.x = window.innerWidth / 2;
cactusSprite.y = window.innerHeight - 50 - 60;
container.addChild(cactusSprite);
let startText = new PIXI.Text('开始游戏', {
fontSize: 36,
fill: 0x333333,
align: 'center'
});
startText.x = window.innerWidth / 2;
startText.y = window.innerHeight / 2;
startText.anchor.set(0.5);
container.addChild(startText);
startText.interactive = true;
startText.on('click', () => {
playGame();
});
let isGameing = false;
let isGameover = false;
function playGame () {
isGameing = true;
console.log('开始游戏');
runAnimation.visible = true;
runAnimation.x = 60;
runAnimation.y = window.innerHeight - 50 -100;
}
let score = 0;
let jumpVelocity = 20;
let gravity = 1;
app.ticker.add((delta) => {
if (isGameover) return;
if (isGameing) {
groundSprite.tilePosition.x -= 10;
cactusSprite.x -= 10;
if (cactusSprite.x < -30) {
cactusSprite.x = window.innerWidth;
score ++;
}
}
if (jumpSprite.visible) {
jumpVelocity -= gravity;
jumpSprite.y -= jumpVelocity;
jumpVelocity -=1;
if (jumpSprite.y > window.innerHeight - 50 - 100;
) {
jumpSprite.y = window.innerHeight - 50 - 100;
jumpVelocity = 20;
jumpSprite.visible = false;
runAnimation.visible = true;
}
}
if (
jumpSprite.y > cactusSprite.y - 60 &&
cactusSprite.x < jumpSprite.x + 60 &&
cactusSprite.x > jumpSprite.x - 60
) {
gameover();
startText.visible = false;
let overText = new PIXI.Text('游戏结束, 最后得分' + score, {
fontSize: 36,
fill: 0x333333,
align: 'center'
})
overText.x = window.innerWidth / 2;
overText.y = window.innerHeight / 2;
overText.anchor.set(0.5);
container.addChild(overText);
overText.interactive = true;
overText.on('click', () => {
location.reload();
});
}
});
function gameover () {
console.log('game over');
isGameover = true;
}
window.addEventListener('keydown', (e) => {
if (e.code == 'Space') {
console.log('跳跃');
runAnimation.visible = false;
jumpSprite.visible = true;
jumpVelocity = 20;
}
});
</script>