HTML5는 Taobao를 모방하고 JD.com은 빨간 봉투 비 효과를 달성합니다(코드 예)
이 기사에서는 빨간 봉투 비 효과를 얻기 위해 Taobao 및 JD.com을 모방한 HTML5의 예제 코드를 공유합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
이 Red Packet Rain 프로젝트는 HTML5 게임 프레임워크인 Phaser를 기반으로 작성되었습니다. 최종 제품은 캔버스이므로 성능이 매우 좋지만 이 프레임워크는 비교적 크고 압축하면 약 700K 정도라고 해야 할까요.
코드 주소 : https://github.com/AmosXu/red-packet-rain
1. 효과 표시
사진 순서대로입니다. , 빨간 봉투 잡기 페이지, 빨간 봉투 열기 페이지, 빨간 봉투 표시 페이지, 이 페이지는 모두 새로 고침 전환 효과와 슈퍼 성능 없이 캔버스에 작성되었습니다.
//初始化图片 let imgjishi = 'assets/img/daojishi.png' let bgPlan = 'assets/img/bg-plan.jpg' let bgRainer = 'assets/img/bg-rainer.jpg' let redpacket = 'assets/img/redpacket.png' let close = 'assets/img/close.png' let dialogExit = 'assets/img/dialog-exit.png' let buttonCancel = 'assets/img/button-cancel.png' let buttonExit = 'assets/img/button-exit.png' let openRedpacket = 'assets/img/open-redpacket.png' let open = 'assets/img/open.png' let redpacketResult = 'assets/img/redpacket-result.png' let buttonUseTicket = 'assets/img/button-use-ticket.png' let buttonContinue = 'assets/img/button-continue.png' let cursorAnimation = 'assets/img/cursor-animation.png' let states = {} let QingLvGroup; let hitNum = 0; let config = { selfPool:40, selfPic:'redpacket', rate:0.5, maxSpeed:1200, minSpeed:400, max:95 } let ids = [0, 1, 2, 3, 4, 5] let redpackets = ['全场优惠50元', '20元代金券', '全场优惠50元', '20元代金券', '全场优惠50元', '20元代金券'] let time = 25; let getIds = [] let radio = document.documentElement.clientWidth/375; let e; function rfuc(n){ return n*radio; } //初始化红包 function QingLv(config, game){ this.init = function(){ this.config = config; QingLvGroup = game.add.group(); QingLvGroup.enableBody = true; QingLvGroup.createMultiple(config.selfPool, config.selfPic); //初始化多个红包 QingLvGroup.setAll('anchor.y',1) QingLvGroup.setAll('outOfBoundsKill', true); QingLvGroup.setAll('checkWorldBounds', true); this.maxWidth = game.width + 300; game.time.events.loop(Phaser.Timer.SECOND * config.rate, this.createQL, this); }; this.createQL = function(){ e = QingLvGroup.getFirstExists(false); if(e) { if(hitNum >= config.max) { return; } hitNum++; e.events.onInputDown.removeAll(); var ram= Math.random(); ram =ram<0.5?ram+=0.5: ram; e.loadTexture(this.config.selfPic) e.alpha = 1; e.angle = 30 // e.scale.setTo(rfuc(ram)); e.reset(game.rnd.integerInRange(100, this.maxWidth), 100) //红包生成的位置 e.body.velocity.x = game.rnd.integerInRange(-300, -150); //红包移动的速度 e.body.velocity.y = game.rnd.integerInRange(config.minSpeed, config.maxSpeed); e.inputEnabled = true; e.events.onInputDown.add(this.hitted, this) } }; this.hitted = function(sprite){ if(Math.random() < 1/4 && ids.length > 0) { sprite.kill(); //点击获得红包,游戏暂停 game.paused = true; //背景 let hexGraphics = new Phaser.Graphics().beginFill(0x000000, 0.5).drawRect(0,0,document.documentElement.clientWidth,document.documentElement.clientHeight + 2); let pausedMask = game.add.sprite(0, 0, hexGraphics.generateTexture()) let openDialog = game.add.sprite(rfuc(62), rfuc(150), 'openRedpacket') let open = game.add.sprite(rfuc(130), rfuc(300), 'open') open.inputEnabled = true; let result = game.add.sprite(rfuc(0), rfuc(120), 'redpacketResult') result.visible = false let userTicket = game.add.sprite(rfuc(78), rfuc(445), 'buttonUseTicket') userTicket.visible = false let goOn = game.add.sprite(rfuc(198), rfuc(445), 'buttonContinue') goOn.visible = false let ticketText = {}; let link = '' //拆红包 let clickOpen = function() { //游戏暂停时,点击事件无效,只能通过这种画热点的形式来绑定事件 let openRect = new Phaser.Rectangle(rfuc(130), rfuc(315), 239, 239).copyFrom(open); if (openRect.contains(game.input.x, game.input.y)) { let currentWidth = open.width //拆红包动画 let tempArr = [2, 4, 8, 4, 2, 1] let index = 0; let timer = setInterval(function() { if (index > tempArr.length-1) { index = 0 } open.width = currentWidth / tempArr[index] open.height = open.height open.left = game.world.centerX - open.width / 2 ++index }, 200) game.input.onDown.remove(clickOpen, this); let arrIndex = Math.floor(Math.random() * ids.length) let redpacketId = ids.splice(arrIndex, 1) getIds.push(redpacketId[0]) setTimeout(()=> { timer && clearInterval(timer) document.getElementById('audioOpen').play() let text = redpackets[redpacketId[0]] ticketText=game.add.text(0, rfuc(338),text,{fill:'#ffe67d',fontSize:'46px',fontWeight: 'bolder'}) ticketText.left = game.world.centerX - ticketText.width / 2 //文字相对于屏幕左右居中 openDialog.visible = false open.visible = false result.visible = true userTicket.visible = true goOn.visible = true game.input.onDown.add(clickButton, this) }, 1000) } }; let clickButton = function() { let userTicketRect = new Phaser.Rectangle(rfuc(78), rfuc(445), 194, 66).copyFrom(userTicket); let continueRect = new Phaser.Rectangle(rfuc(198), rfuc(445), 194, 66).copyFrom(goOn); if (userTicketRect.contains(game.input.x, game.input.y)) { window.location.replace(link) game.input.onDown.remove(clickButton, this); } else if (continueRect.contains(game.input.x, game.input.y)) { result.visible = false userTicket.visible = false goOn.visible = false pausedMask.visible = false ticketText.visible = false game.paused = false game.input.onDown.remove(clickButton, this); } } game.input.onDown.add(clickOpen, this) } else { sprite.inputEnabled = false; var anim = sprite.animations.add(config.selfPic); sprite.play(config.selfPic, 40, false); anim.onComplete.add(this.fade, this, sprite) } }; this.fade = function(sprite){ var tween = game.add.tween(sprite).to({alpha:0}, 300, 'Linear', true) tween.onComplete.add(this.killed, this, sprite); }; this.killed = function(sprite){ sprite.kill(); } } states.boot = function(game) { this.preload = function() { if (typeof(GAME) !== "undefined") { this.load.baseURL = GAME + "/"; } if (!game.device.desktop) { this.scale.scaleMode = Phaser.ScaleManager.EXACT_FIT; this.scale.forcePortrait = true; this.scale.refresh(); } }; this.create = function() { game.stage.backgroundColor = '#FFF'; game.state.start('preload'); }; }; states.preload = function(game) { this.preload = function(game) { //加载图片 game.load.spritesheet('daojishi', imgjishi, 250,120, 4) game.load.image('bgPlan', bgPlan) game.load.image('bgRainer', bgRainer) game.load.spritesheet('redpacket', redpacket, 144, 173, 2) game.load.image('close', close) game.load.image('dialogExit', dialogExit) game.load.image('buttonExit', buttonExit) game.load.image('buttonCancel', buttonCancel) game.load.image('openRedpacket', openRedpacket) game.load.image('open', open) game.load.image('redpacketResult', redpacketResult) game.load.image('buttonContinue', buttonContinue) game.load.image('buttonUseTicket', buttonUseTicket) game.load.spritesheet('cursorAnimation', cursorAnimation, 74, 108, 2) }; this.create = function() { game.state.start('main'); }; }; states.main = function(game) { this.create = function() { // 物理系统 game.physics.startSystem(Phaser.Physics.ARCADE); // 背景图 var bgPlan = game.add.sprite(0, 0, 'bgPlan'); bgPlan.width = game.width; bgPlan.height = game.height; var cursorPointer = game.add.sprite(game.world.centerX - 36, game.world.centerY + 86, 'cursorAnimation'); var anim = cursorPointer.animations.add('cursorAnimation'); cursorPointer.play('cursorAnimation', 2, true); document.getElementById('audioCountDown').play() // 开始游戏倒计时 var daojishi = game.add.sprite(game.world.centerX - 140, game.world.centerY - 400, 'daojishi'); var anim = daojishi.animations.add('daojishi'); daojishi.play('daojishi', 1, false); anim.onComplete.add(this.startGame, this, daojishi); }; this.startGame = function(daojishi){ this.leftTime = time let bgRainer = game.add.sprite(0, 0, 'bgRainer'); bgRainer.width = game.width; bgRainer.height = game.height; daojishi.visible = false; this.createQingLv(); //添加按钮,并绑定事件 let closeImg = game.add.button(rfuc(20), rfuc(20), 'close', function(){ game.paused = true pausedMask.visible = true exitDialog.visible = true exitButton.visible = true cancelButton.visible = true game.input.onDown.add(buttonClick, this) }.bind(this)) // 剩余时间 this.leftTimeText = game.add.text(0, 0, this.leftTime, {fill: '#FFF', fontSize: '40px', fontWeight: 'bolder'}) this.leftTimeText.scale.setTo(rfuc(1)) this.leftTimeText.fixedToCamera = true; this.leftTimeText.cameraOffset.setTo(game.camera.width - rfuc(80), rfuc(20)); let hexGraphics = new Phaser.Graphics().beginFill(0x000000, 0.5).drawRect(0,0,document.documentElement.clientWidth,document.documentElement.clientHeight + 2); let pausedMask = game.add.sprite(0, 0, hexGraphics.generateTexture()) pausedMask.visible = false; let exitDialog = game.add.sprite(rfuc(62), rfuc(150), 'dialogExit') exitDialog.visible = false; let exitButton = game.add.button(rfuc(80), rfuc(315), 'buttonExit') exitButton.visible = false; let isExit = false let cancelButton = game.add.button(rfuc(200), rfuc(315), 'buttonCancel') cancelButton.visible = false; game.time.events.repeat(Phaser.Timer.SECOND, this.leftTime, this.refreshTime, this) let buttonClick = function() { let cancelRect = new Phaser.Rectangle(rfuc(200), rfuc(315), 194, 66).copyFrom(cancelButton); if (cancelRect.contains(game.input.x, game.input.y)) { game.input.onDown.remove(buttonClick, this) game.paused = false pausedMask.visible = false exitDialog.visible = false exitButton.visible = false cancelButton.visible = false } } }; this.createQingLv = function(){ this.qinglv = new QingLv(config, game); this.qinglv.init(); this.qinglv = new QingLv(config, game); this.qinglv.init(); }; this.refreshTime = function(){ this.leftTime--; var tem = this.leftTime; this.leftTimeText.text = tem; if(this.leftTime === 0) { game.paused = true; } } }; //生成游戏 let game = null if (game == null) { game = new Phaser.Game(document.documentElement.clientWidth, document.documentElement.clientHeight + 2, Phaser.AUTO, document.getElementById('gameScreen')); game.state.add('boot', states.boot.bind(game)); game.state.add('preload', states.preload.bind(game)); game.state.add('main', states.main.bind(game)); game.state.start('boot'); }
game.input.onDown.add(clickOpen, this) //给游戏绑定全局事件
let userTicket = game.add.sprite(rfuc(78), rfuc(445), 'buttonUseTicket')
let userTicketRect = new Phaser.Rectangle(78, 445, 194, 66).copyFrom(userTicket); //获得button的区域
//如果点击的位置为button的位置就执行下一步
if (userTicketRect.contains(game.input.x, game.input.y)) {
//移除全局事件
game.input.onDown.remove(clickButton, this);
}
로그인 후 복사
2. 텍스트나 그림은 화면을 기준으로 합니다. 센터링(일시적으로 화면 센터링만 가능) 답변: 게임에 텍스트를 추가하면 왼쪽 텍스트의 오프셋은 다음과 같습니다. 게임 화면 너비에서 텍스트 너비를 뺀 값과 같으며, 센터링 효과를 얻을 수 있습니다
game.input.onDown.add(clickOpen, this) //给游戏绑定全局事件 let userTicket = game.add.sprite(rfuc(78), rfuc(445), 'buttonUseTicket') let userTicketRect = new Phaser.Rectangle(78, 445, 194, 66).copyFrom(userTicket); //获得button的区域 //如果点击的位置为button的位置就执行下一步 if (userTicketRect.contains(game.input.x, game.input.y)) { //移除全局事件 game.input.onDown.remove(clickButton, this); }
ticketText = game.add.text(0, rfuc(338), '我想居中', {fill: '#ffe67d', fontSize: '46px', fontWeight: 'bolder'}) ticketText.left = game.world.centerX - ticketText.width / 2 //文字相对于屏幕左右居中
HTML 비디오 튜토리얼
,Html5 비디오 튜토리얼
,부트스트랩 비디오 튜토리얼을 방문하세요!
위 내용은 HTML5는 Taobao를 모방하고 JD.com은 빨간 봉투 비 효과를 달성합니다(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML의 테이블 테두리 안내. 여기에서는 HTML의 테이블 테두리 예제를 사용하여 테이블 테두리를 정의하는 여러 가지 방법을 논의합니다.

HTML의 Nested Table에 대한 안내입니다. 여기에서는 각 예와 함께 테이블 내에 테이블을 만드는 방법을 설명합니다.

HTML 여백-왼쪽 안내. 여기에서는 HTML margin-left에 대한 간략한 개요와 코드 구현과 함께 예제를 논의합니다.

HTML 테이블 레이아웃 안내. 여기에서는 HTML 테이블 레이아웃의 값에 대해 예제 및 출력 n 세부 사항과 함께 논의합니다.

HTML 입력 자리 표시자 안내. 여기서는 코드 및 출력과 함께 HTML 입력 자리 표시자의 예를 논의합니다.

HTML 순서 목록에 대한 안내입니다. 여기서는 HTML Ordered 목록 및 유형에 대한 소개와 각각의 예에 대해서도 설명합니다.

HTML onclick 버튼에 대한 안내입니다. 여기에서는 각각의 소개, 작업, 예제 및 다양한 이벤트의 onclick 이벤트에 대해 설명합니다.

HTML에서 텍스트 이동 안내. 여기서는 Marquee 태그가 구문과 함께 작동하는 방식과 구현할 예제에 대해 소개합니다.
