japanese-drum-game/public/src/js/canvasasset.js

89 lines
1.9 KiB
JavaScript
Raw Normal View History

2018-09-14 06:55:23 +08:00
class CanvasAsset{
constructor(view, position, image){
this.ctx = view.ctx
this.controller = view.controller
if(image){
this.image = assets.image[image]
}
this.position = position
this.animationFrames = {}
this.speed = 1000 / 60
this.animationStart = 0
}
draw(){
var u = (a, b) => typeof a === "undefined" ? b : a
2018-09-14 06:55:23 +08:00
var frame = 0
if(this.animation){
var ms = this.controller.getElapsedTime().ms
if(this.animationEnd){
if(ms > this.animationEnd.ms){
this.animationEnd.callback()
delete this.animationEnd
return this.draw()
}
}
var index = Math.floor((ms - this.animationStart) / this.speed)
if(Array.isArray(this.animation)){
frame = this.animation[this.mod(this.animation.length, index)]
2018-09-14 06:55:23 +08:00
}else{
frame = this.mod(this.animation, index)
2018-09-14 06:55:23 +08:00
}
}
var pos = this.position(frame)
if(this.image){
this.ctx.drawImage(this.image,
u(pos.sx, pos.x), u(pos.sy, pos.y),
u(pos.sw, pos.w), u(pos.sh, pos.h),
pos.x, pos.y, pos.w, pos.h
)
}
}
mod(length, index){
return ((index % length) + length) % length
2018-09-14 06:55:23 +08:00
}
addFrames(name, frames, image){
var framesObj = {
frames: frames
}
if(image){
framesObj.image = assets.image[image]
}
this.animationFrames[name] = framesObj
}
setAnimation(name){
var framesObj = this.animationFrames[name]
this.animation = framesObj.frames
this.animationName = name
if(framesObj.image){
this.image = framesObj.image
}
}
getAnimation(){
return this.animationName
}
getAnimationLength(){
var frames = this.animationFrames["10combo"].frames
if(Array.isArray(frames)){
return frames.length
}else{
return frames
}
}
setUpdateSpeed(speed){
this.speed = speed
}
setAnimationStart(ms){
this.animationStart = ms
}
setAnimationEnd(ms, callback){
if(typeof ms === "undefined"){
2018-09-14 06:55:23 +08:00
delete this.animationEnd
}else{
this.animationEnd = {
ms: ms,
callback: callback
}
}
}
}