热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何实现一个简单的跑酷游戏?(代码详解)-

本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解)。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解)。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

采用的物理引擎是:Phaser.js

官网地址:http://phaser.io/

在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿)

效果展示:

源码(详细源码图片资源访问:https://github.com/ProsperLee)

1.创建游戏舞台

 var cOnfig= {
    type: Phaser.AUTO,
    width: 800,
    height: 400,
    physics: {
        default: 'arcade',
        arcade: {
            gravity: {
                y: 300
            },
            debug: false
        }
    },
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};

var game = new Phaser.Game(config); // 创建游戏

2.载入资源

function preload() {
    this.load.image('sky', 'assets/sky.png');
    this.load.image('ground', 'assets/platform.png');
     5      6     this.load.spritesheet('dude', 'assets/dude.png', {
        frameWidth: 32,
        frameHeight: 48
    });
}

3.将资源创建到舞台上

 var distanceText; // 路程文本
var distance = 0; // 路程
var platforms; // 地面
var player; // 玩家
var enemy; // 敌人
var enemys; // 敌人们
var enemyTimer; // 敌人计时器
var distanceTimer; // 路程计时器

function create() {
    // 添加画布背景
    this.add.image(400, 200, 'sky');
    // 添加分数文本
    distanceText = this.add.text(16, 16, 'Distance: 0m', {
        fontSize: '20px',
        fill: '#000'
    });
    // 添加地面
    platforms = this.physics.add.staticGroup();
    platforms.create(400, 400, 'ground').setScale(3).refreshBody();
    // 添加玩家(精灵)
    player = this.physics.add.sprite(100, 300, 'dude');
    player.setBounce(0); // 设置阻力
    player.setCollideWorldBounds(true); // 禁止玩家走出世界

    // 敌人
    enemys = this.physics.add.group();
    enemys.children.iterate(function (child) {
        child.setCollideWorldBounds(false);
    });
    // 动态创建敌人
    enemyTimer = setInterval(function () {
        enemy = enemys.create(1000, 300, 'dude');
        enemy.setTint(getColor());
        enemy.anims.play('left', true);
        enemy.setVelocityX(Phaser.Math.Between(-300, -100));
    }, Phaser.Math.Between(4000, 8000))

    distanceTimer = setInterval(function () {
        distance += 1;
        distanceText.setText('Distance: ' + distance + 'm');
    }, 1000)

    this.physics.add.collider(player, platforms); //玩家在地面上
    this.physics.add.collider(enemys, platforms); //敌人在地面上
    this.physics.add.collider(player, enemys, hitBomb, null, this);
}

4.在创建场景过程中写键盘监听事件

var cursors; // 按键
    // 事件
    this.anims.create({
        key: 'left',
        frames: this.anims.generateFrameNumbers('dude', {
            start: 0,
            end: 3
        }),
        frameRate: 10,
        repeat: -1
    });

    this.anims.create({
        key: 'right',
        frames: this.anims.generateFrameNumbers('dude', {
            start: 5,
            end: 8
        }),
        frameRate: 10,
        repeat: -1
    });

    this.anims.create({
        key: 'turn',
        frames: [{
            key: 'dude',
            frame: 4
        }],
        frameRate: 20
    });

    cursors = this.input.keyboard.createCursorKeys();

5.写碰撞函数(当玩家与敌人碰撞的结果)


var gameOver = false; // 游戏结束
function hitBomb(player, enemys) {
    this.physics.pause();
    clearInterval(enemyTimer);
    clearInterval(distanceTimer);
    player.setTint(0xff0000);
    gameOver = true;
    alert('游戏结束,您跑了' + distance + 'm');
}

6.在update函数中写时间的执行(须注意的是此函数每一帧都在执行,1帧≠1秒)

 function update() {
    if (cursors.up.isDown && player.body.touching.down) {
        player.setVelocityY(-220);
    } else {
        player.anims.play('right', true);
    }
    if (gameOver) {
        player.setVelocityX(0);
        player.anims.play('turn');
        return;
    }
}

这里我给敌人上了颜色的,随机16进制颜色

function getColor() {
    var color = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort(function(){
        return Math.random() - 0.5
    }).join("").substr(0,6);
    
    return "0x" + color;
}

整个源码奉上(建议去github上自己clone):

var cOnfig= {
    type: Phaser.AUTO,
    width: 800,
    height: 400,
    physics: {
        default: 'arcade',
        arcade: {
            gravity: {
                y: 300
            },
            debug: false
        }
    },
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};

var game = new Phaser.Game(config); // 创建游戏

var distanceText; // 路程文本
var distance = 0; // 路程
var platforms; // 地面
var player; // 玩家
var enemy; // 敌人
var enemys; // 敌人们
var gameOver = false; // 游戏结束
var enemyTimer; // 敌人计时器
var distanceTimer; // 路程计时器

var cursors; // 按键 
// 载入资源
function preload() {
    this.load.image('sky', 'assets/sky.png');
    this.load.image('ground', 'assets/platform.png');
     39      40     this.load.spritesheet('dude', 'assets/dude.png', {
        frameWidth: 32,
        frameHeight: 48
    });
}

// 将资源展示到画布创建资源
function create() {
    // 添加画布背景
    this.add.image(400, 200, 'sky');
    // 添加分数文本
    distanceText = this.add.text(16, 16, 'Distance: 0m', {
        fontSize: '20px',
        fill: '#000'
    });
    // 添加地面
    platforms = this.physics.add.staticGroup();
    platforms.create(400, 400, 'ground').setScale(3).refreshBody();
    // 添加玩家(精灵)
    player = this.physics.add.sprite(100, 300, 'dude');
    player.setBounce(0); // 设置阻力
    player.setCollideWorldBounds(true); // 禁止玩家走出世界

    // 敌人
    enemys = this.physics.add.group();
    enemys.children.iterate(function (child) {

        child.setCollideWorldBounds(false);
    });

    // 事件
    this.anims.create({
        key: 'left',
        frames: this.anims.generateFrameNumbers('dude', {
            start: 0,
            end: 3
        }),
        frameRate: 10,
        repeat: -1
    });

    this.anims.create({
        key: 'right',
        frames: this.anims.generateFrameNumbers('dude', {
            start: 5,
            end: 8
        }),
        frameRate: 10,
        repeat: -1
    });

    this.anims.create({
        key: 'turn',
        frames: [{
            key: 'dude',
            frame: 4
        }],
        frameRate: 20
    });

    cursors = this.input.keyboard.createCursorKeys();

    // 动态创建敌人
    enemyTimer = setInterval(function () {
        enemy = enemys.create(1000, 300, 'dude');
        enemy.setTint(getColor());
        enemy.anims.play('left', true);
        enemy.setVelocityX(Phaser.Math.Between(-300, -100));
    }, Phaser.Math.Between(4000, 8000))

    distanceTimer = setInterval(function () {
        distance += 1;
        distanceText.setText('Distance: ' + distance + 'm');
    }, 1000)



    this.physics.add.collider(player, platforms); //玩家在地面上
    this.physics.add.collider(enemys, platforms);
    this.physics.add.collider(player, enemys, hitBomb, null, this);

}
// 一直执行
function update() {
    if (cursors.up.isDown && player.body.touching.down) {
        player.setVelocityY(-220);
    } else {
        player.anims.play('right', true);
    }
    if (gameOver) {
        player.setVelocityX(0);
        player.anims.play('turn');
        return;
    }
}

function hitBomb(player, enemys) {
    this.physics.pause();
    clearInterval(enemyTimer);
    clearInterval(distanceTimer);
    player.setTint(0xff0000);
    gameOver = true;
    alert('游戏结束,您跑了' + distance + 'm');
}

function getColor() {
    var color = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort(function(){
        return Math.random() - 0.5
    }).join("").substr(0,6);
    
    return "0x" + color;
}

以上就是如何实现一个简单的跑酷游戏?(代码详解)的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文基于对相关论文和开源代码的研究,详细介绍了LOAM(激光雷达里程计与建图)的工作原理,并对其关键技术进行了分析。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
author-avatar
发出耀眼气息
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有