add tower builing game

This commit is contained in:
hamid zarghami
2025-12-09 10:48:48 +03:30
parent 8119203506
commit 53b9139506
79 changed files with 15363 additions and 3 deletions
@@ -0,0 +1,126 @@
import { Instance } from 'cooljs'
import { blockAction, blockPainter } from './block'
import {
checkMoveDown,
getMoveDownValue,
drawYellowString,
getAngleBase
} from './utils'
import { addFlight } from './flight'
import * as constant from './constant'
export const endAnimate = (engine) => {
const gameStartNow = engine.getVariable(constant.gameStartNow)
if (!gameStartNow) return
const successCount = engine.getVariable(constant.successCount, 0)
const failedCount = engine.getVariable(constant.failedCount)
const gameScore = engine.getVariable(constant.gameScore, 0)
const threeFiguresOffset = Number(successCount) > 99 ? engine.width * 0.1 : 0
drawYellowString(engine, {
string: 'floor',
size: engine.width * 0.06,
x: (engine.width * 0.24) + threeFiguresOffset,
y: engine.width * 0.12,
textAlign: 'left',
fontName: 'Arial',
fontWeight: 'bold'
})
drawYellowString(engine, {
string: successCount,
size: engine.width * 0.17,
x: (engine.width * 0.22) + threeFiguresOffset,
y: engine.width * 0.2,
textAlign: 'right'
})
const score = engine.getImg('score')
const scoreWidth = score.width
const scoreHeight = score.height
const zoomedWidth = engine.width * 0.35
const zoomedHeight = (scoreHeight * zoomedWidth) / scoreWidth
engine.ctx.drawImage(
score,
engine.width * 0.61,
engine.width * 0.038,
zoomedWidth,
zoomedHeight
)
drawYellowString(engine, {
string: gameScore,
size: engine.width * 0.06,
x: engine.width * 0.9,
y: engine.width * 0.11,
textAlign: 'right'
})
const { ctx } = engine
const heart = engine.getImg('heart')
const heartWidth = heart.width
const heartHeight = heart.height
const zoomedHeartWidth = engine.width * 0.08
const zoomedHeartHeight = (heartHeight * zoomedHeartWidth) / heartWidth
for (let i = 1; i <= 3; i += 1) {
ctx.save()
if (i <= failedCount) {
ctx.globalAlpha = 0.2
}
ctx.drawImage(
heart,
(engine.width * 0.66) + ((i - 1) * zoomedHeartWidth),
engine.width * 0.16,
zoomedHeartWidth,
zoomedHeartHeight
)
ctx.restore()
}
}
export const startAnimate = (engine) => {
const gameStartNow = engine.getVariable(constant.gameStartNow)
if (!gameStartNow) return
const lastBlock = engine.getInstance(`block_${engine.getVariable(constant.blockCount)}`)
if (!lastBlock || [constant.land, constant.out].indexOf(lastBlock.status) > -1) {
if (checkMoveDown(engine) && getMoveDownValue(engine)) return
if (engine.checkTimeMovement(constant.hookUpMovement)) return
const angleBase = getAngleBase(engine)
const initialAngle = (Math.PI
* engine.utils.random(angleBase, angleBase + 5)
* engine.utils.randomPositiveNegative()
) / 180
engine.setVariable(constant.blockCount, engine.getVariable(constant.blockCount) + 1)
engine.setVariable(constant.initialAngle, initialAngle)
engine.setTimeMovement(constant.hookDownMovement, 500)
const block = new Instance({
name: `block_${engine.getVariable(constant.blockCount)}`,
action: blockAction,
painter: blockPainter
})
engine.addInstance(block)
}
const successCount = Number(engine.getVariable(constant.successCount, 0))
switch (successCount) {
case 2:
addFlight(engine, 1, 'leftToRight')
break
case 6:
addFlight(engine, 2, 'rightToLeft')
break
case 8:
addFlight(engine, 3, 'leftToRight')
break
case 14:
addFlight(engine, 4, 'bottomToTop')
break
case 18:
addFlight(engine, 5, 'bottomToTop')
break
case 22:
addFlight(engine, 6, 'bottomToTop')
break
case 25:
addFlight(engine, 7, 'rightTopToLeft')
break
default:
break
}
}