phaser-游戏问题
2022-12-05 本文已影响0人
skoll
计算场景内活动物体的数量
1 .星星收集完毕之后,也就是数量为0的时候。要发射一个子弹并且给出下一波星星,但是现在用matterJs发现没有返回场景内物体的方法。而且没有组的概念,没法方便的管理同一组类型的物体,虽然可以遍历场景内的全部物体来看出是否以已经收集完毕,但是如果场景内物体多的话,这种方法肯定不行,所以需要引入一个startCount的变量来标记
2 .某些物体不能完全反弹,弹一会就停下了。感觉是重力的问题,和重力没关系,就是没有完全反弹.最后会停住,奇怪.主要最后全都卡在角落里面了
3 .需要一个平衡的世界,没有任何东西,按照一个初始的速度进去,按理说应该是永远不会停下来的
4 .板子动的时候,玩家没有跟着板子动,静摩擦力设置不成功。
1 .感觉不是摩擦力的问题,而是板子动的方式不太对,现在板子是动画在动,其实应该是力推动他动
2 .身体是静止的,所以必须手动更新速度以使摩擦发挥作用
3 .板子想要移动,必须不是isStatic,还要忽略掉重力。但是这样的板子,别的东西上去,回立马把他压下来。还要求一个物体的受力变化,当他受到的力大于某个值,才会下降。板子才会断掉。或者需要先屏蔽,某个程度的力,对他不影响
4 .所以最后的解决是要把两个结合起来.首先摩擦力的触发是需要受力,所以要给平板一个力。其次平板在这里是一个static元素,添加力是不会变化的,真的板子发生运动是通过控制他的x位置来操作的。
5 .总结:摩擦力效果,需要力给,具体板子运动,需要你移动板子,其次享受摩擦力作用的元素,摩擦力要给他加到最大
this.count+=0.014
const px=400+100*Math.sin(this.count)
let f=px-this.platForm.x
this.platForm.setVelocityX(f)
this.platForm.x=px
5 .停掉之前的动画
扩展1
1 .人物加血条
2 .加命:1
3 .跳台会移动
4 .跳台随机会消失,这个比较简单:左右移动.
5 .星星加变大变小的动画
6 .子弹加粒子跟随动画,拖尾效果
7 .注意,这些例子很多的灵感都是看着另一个物理引擎里面的演示demo想到的.
8 .横版闯关
下一步
1 .大范围的UI怎么写
2 .
横版动画
1 .无限视觉。视差滚动怎么做
2 .
import Phaser from 'phaser';
class MyGame extends Phaser.Scene
{
constructor ()
{
super();
this.count=-1
this.platForm=null
this.cursors=null
this.box=null
}
preload ()
{
this.load.image('platform', 'http://10.226.101.164:8081/sprites/platform.png');
this.load.image('box', 'http://10.226.101.164:8081/sprites/box.png');
}
create ()
{
this.platForm=this.matter.add.image(400,350,'platform',null,{
isStatic:true,
restitution:0.4
})
this.box=this.matter.add.image(400,200,'box',null,{
friction:1,
frictionStatic:Infinity,
slop:0.5
})
this.cursors=this.input.keyboard.createCursorKeys()
console.log(this.platForm)
}
update(){
this.count+=0.014
const px=400+100*Math.sin(this.count)
let f=px-this.platForm.x
this.platForm.setVelocityX(f)
this.platForm.x=px
// 添加物体受力
if(this.cursors.up.isDown){
this.box.setVelocityY(-1.5)
}
}
}
var config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#1b1464',
parent: 'phaser-example',
physics: {
default: 'matter',
matter: {
}
},
scene: MyGame
};
const game = new Phaser.Game(config);