想法来源 

出于练习看到这篇文章   没有什么难度  效果如下,接下来会用pixijs讲解如何实现

创建应用及舞台

HTML部分只创建标签引入 pixi.min.js  即可:

<script src="pixi.min.js"></script>

javascript:

 let app = new PIXI.Application({
width: 350,
height: 526
})
document.body.appendChild(app.view);

  

运行后,页面是一个黑色区域,没错这是正常的。接下来添加精灵

创建精灵

首先加载图片使用PIXI自带loader,来实现图片预加载,图片全部加载完毕后再执行其它操作

定义图片列表:

  var imgList = [
"img/bg.jpg",
"img/bg1.jpg",
"img/food21.png",
"img/food2.png",
"img/icon.png",
"img/player.png",
"img/heart.png",
]

  

是用loader预加载图片,也可以监听加载进度onprogress:

   PIXI.loader
.add(imgList)
.load(function () {
// 图片素在记载完毕后,创建精灵
bgimg = new PIXI.Sprite(PIXI.loader.resources["img/bg.jpg"].texture);
})

  

把精灵添加到舞台

app.stage.addChild(bgimg);

  

背景图片滚动效果

原理如图,创建两个精灵,一个在可见区域,一个在可见区域上边或者下边,操作背景移动 ,当背景移动区域大于背景图片高度,重新绘制。

可以见图,方向是从上往下运动的

通过中间变量:

var bgDistance = 0; // 获取移动y值大小

var bgHeight = 背景图片高度; // 获取背景图片高度来 判断bgDistance移动大小是否,超过背景图片高度,超过重新渲染

背景图片移动向下飞船向前行驶,使用PIXI ticker
tips:bgDistance 变量在上边已声明默认:0
app.ticker.add(function (delta) {
// 背景图片1位置
bgimg.x = 0;
bgimg.y = bgDistance - bgHeight;
// 背景图片2位置
bgimg1.x = 0;
bgimg1.y = bgDistance; if(bgDistance >= bgHeight){
bgloop = 0;
}
bgDistance = ++bgloop;
})

  

会看到背景在移动,接下来在页面添加飞船,操作跟添加背景图片一样,创建一个精灵添加到舞台中:

这时会看到飞船出现在太空中,飞船有些怪怪的,接下来大小及位置修改

        player.scale.x = 0.5;
player.scale.y = 0.5; player.x = (app.view.width - player.width)/2;
player.y = app.view.height - player.height -100;

  

scale 进行缩放

app.view.width/height 获取舞台的宽高,

player.width/height  获取当前容器或是精灵所占的大小

接下来,让飞船移动,通过键盘   上下左右来控制 及监听事件 keydown

document.addEventListener("keydown", function (event) {
// alert(event.keyCode)
switch (event.keyCode) {
case 37: player.vx = -5;
break;
case 38:
player.vy = -5;
break;
case 39:
player.vx = 5;
break;
case 40:
player.vy = 5;
break;
} }, false) document.addEventListener("keyup", function () {
player.vx = 0;
player.vy = 0;
})

  

键盘事件写完后,在ticker控制改变飞船位置

player.x += player.vx;
player.y += player.vy; 这时会发现,飞船 飞出舞台之外了 ,接下来,检测是否到舞台边缘 有两种方式可以检测
1、自定义一个容器的宽高,来判断是否到该容器边缘
2、直接判该该精灵是否到舞台边缘 直接就用第二种了,
   // 判断是否到舞台边缘
if(player.x<=0){
player.x = 0;
}else if( player.x >= bgimg.width- player.width){
player.x = bgimg.width- player.width;
}
// 同理, y的判断 也是一样的。。。

  

靠近边缘,不会出舞台外边;

接下来考虑,随机掉月饼有两种类型的月饼

 function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}

  

每个随机玉兔位置应该为:

var randomType = Math.floor(Math.random()*2 +1);
return {
rabbitType : randomInt(1, 2),
x: randomInt(1,app.view.width),
y: 0,
speed:randomInt(1,4), // 向下移动速度
isHas: false // 是否存在舞台中
}
}

  

在舞台中,显示玉兔,创建精灵并把精灵放到舞台上 ,让精灵从上往下移动使用ticker 对y ++操作 ,当玉兔跟月饼相碰是,

精灵销毁 ,销毁,销毁! 当精灵到屏幕最下方是,也要做销毁处理。

月饼下实际上就是对数组操作,当到底部在数组中移除操作

定义存放数组

var ybArry = [];  // 存放月饼
var imgOjbArry = []; // 存放图片对象,把每个创建的精灵添加的舞台上

在ticker随机调用数组函数 ,数组里边最多存放五个元素。

// 处理月饼下路 假定 一直值显示五个 月饼
if(Math.random() > 0.9 && ybArry && ybArry.length < 5){
var randPoint = randomRabbit();
ybArry.push(randPoint);
}

对每个随机生成的坐标y ,进行++ 操作,数组中每个元素都会有下路效果

  for(var i = 0; i < ybArry.length; i++){
ybArry[i].y += ybArry[i].speed;
}

  

跟随机月饼数,创建图片精灵,让图片运动

          // 根据随机数组创建精灵
for(var j = 0; j< ybArry.length; j++){
if(ybArry[j].isHas == false){
var sprite = new PIXI.Sprite(
PIXI.loader.resources["img/food"+ybArry[j].rabbitType+".png"].texture
);
ybArry[j].isHas = true;
imgOjbArry.push(sprite);
app.stage.addChild(sprite); }
}

  

把数组月饼中的y 赋值给图片精灵坐标

   for(var k  = 0; k < imgOjbArry.length; k++){
imgOjbArry[k].x = ybArry[k].x;
imgOjbArry[k].y = ybArry[k].y; if(imgOjbArry[k].y >= app.view.height){
imgOjbArry[k].destroy();
ybArry.splice(k, 1);
imgOjbArry.splice(k, 1); }
}

  

舞台就会显示精灵运动,细心会看到,随机产生不一样的图。根据不同图片,碰撞那个加分那个结束。自己定义;

碰撞检测实现:(官网的函数copy)

//The `hitTestRectangle` function
function hitTestRectangle(r1, r2) { //Define the variables we'll need to calculate
let hit, combinedHalfWidths, combinedHalfHeights, vx, vy; //hit will determine whether there's a collision
hit = false; //Find the center points of each sprite
r1.centerX = r1.x + r1.width / 2;
r1.centerY = r1.y + r1.height / 2;
r2.centerX = r2.x + r2.width / 2;
r2.centerY = r2.y + r2.height / 2; //Find the half-widths and half-heights of each sprite
r1.halfWidth = r1.width / 2;
r1.halfHeight = r1.height / 2;
r2.halfWidth = r2.width / 2;
r2.halfHeight = r2.height / 2; //Calculate the distance vector between the sprites
vx = r1.centerX - r2.centerX;
vy = r1.centerY - r2.centerY; //Figure out the combined half-widths and half-heights
combinedHalfWidths = r1.halfWidth + r2.halfWidth;
combinedHalfHeights = r1.halfHeight + r2.halfHeight; //Check for a collision on the x axis
if (Math.abs(vx) < combinedHalfWidths) { //A collision might be occuring. Check for a collision on the y axis
if (Math.abs(vy) < combinedHalfHeights) { //There's definitely a collision happening
hit = true;
} else { //There's no collision on the y axis
hit = false;
}
} else { //There's no collision on the x axis
hit = false;
} //`hit` will be either `true` or `false`
return hit;
};

  

碰撞后的月饼透明度降低,是带花的,五仁的无变化。

          for(var k  = 0; k < imgOjbArry.length; k++){
imgOjbArry[k].x = ybArry[k].x;
imgOjbArry[k].y = ybArry[k].y;
imgOjbArry[k].rabbitType = ybArry[k].rabbitType; // 碰撞检测
var hitStatus = hitTestRectangle(player, imgOjbArry[k]);
// console.log(imgOjbArry[k].rabbitType )
if(hitStatus){
if(imgOjbArry[k].rabbitType == 2){
imgOjbArry[k].alpha = 0.5;
}
}
if(imgOjbArry[k].y >= app.view.height){
imgOjbArry[k].destroy();
ybArry.splice(k, 1);
imgOjbArry.splice(k, 1); } }

  

其它操作根据需要添加,记录分数或或是关数。

代码如下:勉强看吧,没整理。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>天空</title>
<script src="lib/pixi.min.js"></script>
</head>
<body> <script>
var bgDistance = 0;
var bgHeight; // 背景图片高度
var bgloop = 0; var ybArry = []; // 存放月饼
var imgOjbArry = []; // 存放图片对象,把每个创建的精灵添加的舞台上 let app = new PIXI.Application({
width: 350,
height: 526
});
document.body.appendChild(app.view); // 随机创建玉兔(有两种根据类型来区分)
//randomRabbit();
function randomRabbit(){
var randomType = Math.floor(Math.random()*2 +1);
return {
rabbitType : randomInt(1, 2),
x: randomInt(1,app.view.width),
y: 0,
speed:randomInt(1,4), // 向下移动速度
isHas: false // 是否存在舞台中
}
} console.log(randomRabbit()) function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
} var imgList = [
"img/bg.jpg",
"img/food1.png",
"img/food2.png",
"img/icon.png",
"img/player.png",
] PIXI.loader
.add(imgList)
.load(function () { // 图片素在记载完毕后,创建精灵
bgimg = new PIXI.Sprite(PIXI.loader.resources["img/bg.jpg"].texture);
bgimg1 = new PIXI.Sprite(PIXI.loader.resources["img/bg.jpg"].texture);
player = new PIXI.Sprite(PIXI.loader.resources["img/player.png"].texture); player.scale.x = 0.5;
player.scale.y = 0.5; player.x = (app.view.width - player.width) / 2;
player.y = app.view.height - player.height - 100; player.vx = 0;
player.vy = 0; bgHeight = bgimg.height; app.stage.addChild(bgimg);
app.stage.addChild(bgimg1);
app.stage.addChild(player); app.ticker.add(function (delta) { bgimg.x = 0;
bgimg.y = bgDistance - bgHeight; bgimg1.x = 0;
bgimg1.y = bgDistance; if (bgDistance >= bgHeight) {
bgloop = 0;
}
bgDistance = ++bgloop; player.x += player.vx;
player.y += player.vy; // 判断是否到舞台边缘
if(player.x<=0){
player.x = 0;
}else if( player.x >= bgimg.width- player.width){
player.x = bgimg.width- player.width;
}
// 同理, y的判断 也是一样的。。。 // 处理月饼下路 假定 一直值显示五个 月饼
if(Math.random() > 0.9 && ybArry && ybArry.length < 5){
var randPoint = randomRabbit();
ybArry.push(randPoint);
} for(var i = 0; i < ybArry.length; i++){
ybArry[i].y += ybArry[i].speed;
} // 根据随机数组创建精灵
for(var j = 0; j< ybArry.length; j++){
if(ybArry[j].isHas == false){
var sprite = new PIXI.Sprite(
PIXI.loader.resources["img/food"+ybArry[j].rabbitType+".png"].texture
);
ybArry[j].isHas = true;
imgOjbArry.push(sprite);
app.stage.addChild(sprite); }
} for(var k = 0; k < imgOjbArry.length; k++){
imgOjbArry[k].x = ybArry[k].x;
imgOjbArry[k].y = ybArry[k].y;
imgOjbArry[k].rabbitType = ybArry[k].rabbitType; // 碰撞检测
var hitStatus = hitTestRectangle(player, imgOjbArry[k]);
// console.log(imgOjbArry[k].rabbitType )
if(hitStatus){
if(imgOjbArry[k].rabbitType == 2){
imgOjbArry[k].alpha = 0.5;
}
} if(imgOjbArry[k].y >= app.view.height){
imgOjbArry[k].destroy();
ybArry.splice(k, 1);
imgOjbArry.splice(k, 1); } } })
}); document.addEventListener("keydown", function (event) {
// alert(event.keyCode)
switch (event.keyCode) {
case 37: player.vx = -5;
break;
case 38:
player.vy = -5;
break;
case 39:
player.vx = 5;
break;
case 40:
player.vy = 5;
break;
} }, false) document.addEventListener("keyup", function () {
player.vx = 0;
player.vy = 0;
}) //The `hitTestRectangle` function
function hitTestRectangle(r1, r2) { //Define the variables we'll need to calculate
let hit, combinedHalfWidths, combinedHalfHeights, vx, vy; //hit will determine whether there's a collision
hit = false; //Find the center points of each sprite
r1.centerX = r1.x + r1.width / 2;
r1.centerY = r1.y + r1.height / 2;
r2.centerX = r2.x + r2.width / 2;
r2.centerY = r2.y + r2.height / 2; //Find the half-widths and half-heights of each sprite
r1.halfWidth = r1.width / 2;
r1.halfHeight = r1.height / 2;
r2.halfWidth = r2.width / 2;
r2.halfHeight = r2.height / 2; //Calculate the distance vector between the sprites
vx = r1.centerX - r2.centerX;
vy = r1.centerY - r2.centerY; //Figure out the combined half-widths and half-heights
combinedHalfWidths = r1.halfWidth + r2.halfWidth;
combinedHalfHeights = r1.halfHeight + r2.halfHeight; //Check for a collision on the x axis
if (Math.abs(vx) < combinedHalfWidths) { //A collision might be occuring. Check for a collision on the y axis
if (Math.abs(vy) < combinedHalfHeights) { //There's definitely a collision happening
hit = true;
} else { //There's no collision on the y axis
hit = false;
}
} else { //There's no collision on the x axis
hit = false;
} //`hit` will be either `true` or `false`
return hit;
}; </script>
</body>
</html>

  



PIXI 太空玉兔游戏(6)的更多相关文章

  1. Unity3D--学习太空射击游戏制作(一)

    近期买了本书在学习一些Unity3D的东西,在了解了Unity3D工具的基本面板后开始学习一个太空射击游戏的开发过程. 首先下载一个关于本游戏的资源文件,(百度云下载地址:http://pan.bai ...

  2. Unity3D--学习太空射击游戏制作(二)

    步骤三:创建主角 游戏的主角是一艘太空飞船,我们将使用一个飞船模型作为游戏的主角,并赋予他一个脚本,控制他的运动,游戏体的组件必须依赖于脚本才能运行. 01:在Project窗口找到Player.fb ...

  3. Unity3D--学习太空射击游戏制作(四)

    步骤七:添加声音和特效(射击声音和爆炸效果) 01:在Project窗口单机右键,选择Import Package->Custome Package,然后到资源文件目录packages浏览uni ...

  4. Unity3D--学习太空射击游戏制作(三)

    步骤四:创建敌人 创建敌人的方式与创建主角类似,不过敌人的行为需要由计算机来控制,它将从上方迎着主角缓慢飞出来,并左右来回移动: 01:创建Enemy.cs脚本,添加代码: using UnityEn ...

  5. 变态版大鱼吃小鱼-基于pixi.js 2D游戏引擎

    之前用CSS3画了一条

  6. pixi.js 微信小游戏 入手

    pixi是什么?一款h5游戏引擎 优点:简单简洁性能第一 缺点:大多数用的国产三大引擎,pixi资料少,工具少, 为什么学,装逼 用pixi开发小游戏行吗? 行.但要简单处理下 下载官网上的 weap ...

  7. javascript+HTMl5游戏下载,开发一个都能月薪上万!舅服你

    HTML5时代已经到来许久了,你是否已经掌握了那么一点呢?今天小编给大家讲讲h5的折叠多设备.跨平台特性, 即用HTML5制作游戏.相比flash,HTML5更加灵活方便,随着浏览器技术的不断升级,H ...

  8. 经典的HTML5游戏及其源码分析

    HTML5已经相当强大,在HTML5平台上,我们可以完成很多非常复杂的动画效果,包括游戏在内.早期我们只能利用flash来实现网络游戏,现在我们又多了一种选择,即用HTML5制作游戏.相比flash, ...

  9. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

随机推荐

  1. yum 安装telnet

    检测是否安装 rpm -qa |grep telnet 安装 yum install xinetd yum install telnet-server yum -y install telnet 再次 ...

  2. K860i的109升级需要的PinyinIME.apk和QuickSearchBox.apk两个文件

    联想K860i的109版本终于可以正常更新了,感谢下乐Phone之家的蚊子咬(http://bbs.lephone.cc/space-uid-6410.html)提供了关键的两个文件:PinyinIM ...

  3. java8之流的基本使用(二)

    概述 流(stream())是java8的一个新特性,主要的作用就是将各种类型的集合转换为流,然后的方便迭代数据用的.例如: //将List类型的集合转换为流 list.stream() 转换为流之后 ...

  4. SynchronizationContext应用

    这个类的应用,官方的说明并不是很多,主要原因是因为微软又出了一些基于SynchronizationContext的类.比如:BackgroundWorker 大家写程序时经常碰到子线程调用UI线程的方 ...

  5. asp.net站点阻止某个文件夹或者文件被浏览器访问

    一个站点根目录下面有一个Config文件夹,这个文件夹里面都是一些json格式的txt文本,文本是一种静态资源,如果知道这个文本的地址,就可以在浏览器中输入地址打开这个文本,别人就可以看到站点的配置, ...

  6. 洛谷题解 P2865 【[USACO06NOV]路障Roadblocks】

    链接:https://www.luogu.org/problemnew/show/P2865 题目描述 Bessie has moved to a small farm and sometimes e ...

  7. 十五、Node.js-fs模块(中)

    有了上一篇JS同步异步知识的铺垫,我们一起学习一下fs模块的同步和异步知识: Node.js内置的fs模块就是文件系统模块,负责读写文件. 和所有其它JavaScript模块不同的是,fs模块同时提供 ...

  8. iOS开发系统类功能划分

    0.OC语法基础 CHOCBase Object C语法学习笔记(一) Object C语法学习笔记(二) 1.UI类 自定义控件程序运行流程 setNeedsLayOut和setNeedsDispl ...

  9. Java面向对象之接口interface 入门实例

    一.基础概念 (一)接口可以简单的理解为,是一个特殊的抽象类,该抽象类中的方法都是抽象的. 接口中的成员有两种:1.全局常量 2.抽象方法 定义接口用关键字interface,接口中的成员都用固定的修 ...

  10. Jenkins项目部署使用教程-----03节点添加

    1)添加节点 系统管理——>管理节点——>新建节点 进入配置界面 点ok进入配置界面配置,——>高级 点击save保存,进入节点,点击Launch agent使得jenkins服务器 ...