Skip to content

Instantly share code, notes, and snippets.

View philipshen's full-sized avatar

Philip Shen philipshen

View GitHub Profile
// Inside onKeyPressed()
case cc.KEY.space:
const barrelPosition = cannon.barrel.getPosition() // 1
const angle = cannon.barrel.rotation
const barrelLength = cannon.barrel.height
barrelPosition.x += barrelLength * sind(angle)
barrelPosition.y += barrelLength * cosd(angle)
const barrelTipWorldSpace = cannon.node.convertToWorldSpaceAR(barrelPosition) // 2
const bulletPosition = cannon.game.node.convertToNodeSpaceAR(barrelTipWorld) // 3
const {ccclass, property} = cc._decorator;
@ccclass
export default class Meteor extends cc.Component {
timeToLive = 10000
timeAlive = 0
update(dt) {
if (!cc.isValid(this.node)) return
@ccclass
export default class Game extends cc.Component {
@property(cc.Prefab)
meteor: cc.Prefab = null
start() {
this.scheduleCreateMeteor()
}
// Collider callbacks
onBeginContact(contact, selfCollider, otherCollider) {
if (otherCollider.node.name === "bullet") {
selfCollider.node.destroy()
otherCollider.node.destroy()
}
}
@property (cc.Prefab)
explosion: cc.Prefab = null
createExplosion(position: cc.Vec2) {
const explosion = cc.instantiate(this.explosion)
explosion.setPosition(position)
this.node.addChild(explosion)
}
const {ccclass, property} = cc._decorator;
import Game from './Game'
@ccclass
export default class Meteor extends cc.Component {
game: Game
timeToLive = 10000
function create(duration: number, type: Types, creationProp: Properties): Config {
return {
duration,
create: {
type,
property: creationProp,
},
update: {
type,
},
type Config = {
duration: number,
create?: Anim,
update?: Anim,
delete?: Anim,
};
type Anim = {
duration?: number,
delay?: number,
springDamping?: number,
initialVelocity?: number,
type?: $Enum<typeof TypesEnum>,
property?: $Enum<typeof PropertiesEnum>,
};
const TypesEnum = {
spring: true,
linear: true,
easeInEaseOut: true,
easeIn: true,
easeOut: true,
keyboard: true,
};
const Types = keyMirror(TypesEnum);