Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Three.JS在Javascript中的策略博弈

Three.JS在Javascript中的策略博弈
EN

Code Review用户
提问于 2014-07-14 20:55:21
回答 1查看 1.4K关注 0票数 7

我一直在尝试将一个简单的策略游戏移植到Javascript,想法是在浏览器中运行它进行测试。我过去做过一些简单的Javascript代码,但这是我的第一个模型/视图设置。我希望得到关于遵循Javascript最佳实践和避免陷阱的反馈。我知道我远远没有达到语言的全部功能,因为我不使用任何原型。我使用的是THREE.js和jQuery.js,THREE.js是主要的渲染引擎。

这里的代码只是创建了一个Tower,它包含带有位置的地板对象字典的Javascript版本。然后根据它们的位置在THREE.scene中呈现它们。我们的想法是计算点击它们,根据相机的位置向地板发出命令,然后点击位置,但我还没走那么远。在做得更深入之前,我想弄清楚我是否做得很好。这在一定程度上只是为了好玩,但我仍然想学习如何做正确的事情。

这是码页。只需将鼠标上下移动,然后单击查看视图和摄像机的坐标即可。

下面是HTML:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head lang="en">
    <style>

        body {
        background-color: #C0C0C0;
        margin: 0px;
        overflow: hidden;
        font-family:Monospace;
        font-size:13px;
        text-align:center;
        font-weight: bold;
        text-align:center;
    }

    div{
        background: #C0C0C0;
    }
    </style>

    <meta charset="UTF-8">
    <title></title>
</head>

<body>
    <script src="js/jquery.min.js"></script>
    <script src="js/three.min.js"></script>
    <script src = "js/three2dtest.js"></script>
</body>

</html>

这是Javascript游戏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var container;
var camera;
var scene;
var renderer;

var mouseX = 0;
var mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;

//this is the game model object
var worldSize = new WorldSize(windowHalfX, windowHalfY);
var tower = new Tower(worldSize);

init();
//not good to do animate here
//animate();

function init() {
    container = document.createElement('div');
    document.body.appendChild(container);

    //these settings have to be very specific for the scene to work
    camera = new THREE.OrthographicCamera(window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, - 500, 1000);
                camera.position.x = 0;
                camera.position.y = 0;
                camera.position.z = 0;

    scene = new THREE.Scene();
    //fog seems to make no difference
    //scene.fog = new THREE.FogExp2(0x000000, 0.0025);
    console.log(scene);

    for (obj in tower.towerFloors) {
        //starting positions of the floors
        console.log(tower.towerFloors[obj].yposition);

        // Using wireframe materials to illustrate shape details.
        var darkMaterial = new THREE.MeshBasicMaterial({color: 0xffffcc});
        var wireframeMaterial = new THREE.MeshBasicMaterial({color: 0x000000, wireframe: true, transparent: true}); 
        var multiMaterial = [darkMaterial, wireframeMaterial];

        // create a cube for each of the floors on the tower
        var floorShape = THREE.SceneUtils.createMultiMaterialObject( 
        new THREE.CubeGeometry(500, tower.towerFloors[obj].floorSize * 10, 2, 1, 1, 1), 
        multiMaterial);
        floorShape.position.set(0, tower.towerFloors[obj].yposition * 10, 0);
        scene.add(floorShape);
    }

    renderer = new THREE.WebGLRenderer({clearColor: 0xff0000, clearAlpha: 1});
    renderer.setClearColorHex(0xC0C0C0, 1);  //this is light grey
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

    document.addEventListener('mousemove', onDocumentMouseMove, false);
    window.addEventListener('resize', onWindowResize, false);

    //should be better to start animate inside here rather than outside
    animate();
}

//position registering function
$('div').click(function(e) {
    alert(e.pageX+ ' , ' + e.pageY);
    alert (camera.position.x + ' , ' + camera.position.y);
});

function onDocumentMouseMove(event) {
    mouseX = event.clientX - windowHalfX;
    mouseY = event.clientY - windowHalfY;
}
function onWindowResize() {
    windowHalfX = window.innerWidth / 2;
    windowHalfY = window.innerHeight / 2;

    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth, window.innerHeight);
}

function animate() {
    requestAnimationFrame(animate);
    render();
}

function render() {
    //move only up and down
    //multiply by 0.15 to slow the overall scroll speed
    //camera.position.x += (mouseX - camera.position.x) * 0.15;  
    camera.position.y += (-mouseY - camera.position.y / 10) * 0.15;  

    //the camera wont move above the top floor so no bounds check needed
    if (camera.position.y < 0) {
        camera.position.y = 0;
    }

    renderer.render(scene, camera);
}

///////////////////////////////////////////////
/*           Tower Objects                   */
///////////////////////////////////////////////
function Tower (worldSize) {
    //create the dictionary of floors
    this.towerFloors = {};
    var floorNumber = 0;
    for (floorNumber = 0; floorNumber < 50; floorNumber++) { 
        var floor = new Floor(floorNumber, worldSize);
        this.towerFloors[floorNumber] = floor;
    }

    this.testLog = "tower created and logged";
    console.log(this.testLog);

    //test methods
    for (obj in this.towerFloors) {
        console.log(this.towerFloors[obj].floorNumber);
    }
    for (obj in this.towerFloors) {
        console.log(this.towerFloors[obj].yposition);
    }
}
function Floor (floorNumber, worldSize) {
    this.floorNumber = floorNumber;
    this.floorSize = worldSize.ysize / 50;
    this.yposition = this.floorSize * floorNumber;
}
function WorldSize (xsize, ysize) {
    this.xsize = xsize;
    this.ysize = ysize;
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-11-14 08:08:19

从一次又一次:

  • HTML看起来很干净,但是根据HTML规范,标题不应该是空白的。
  • 您的对象看起来很好,旧的skool JS,这是很好的阅读
  • 当您编写for (obj in this.towerFloors) {时,您正在污染全局命名空间,要么在函数的顶部声明obj (我最喜欢的方法),要么使用for (var obj in this.towerFloors) {,但是只有在第一次使用obj时,JsHint才会抛出重复声明的警告。
  • 没有太多的功能可供审查,我希望您能进一步了解这一点,并发布一个新的问题和更多的肉。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/57063

复制
相关文章
oracle resetlogs后goldengate如何继续工作
最近有朋友在群里面咨询oracle resetlogs后,goldengate无法继续抽取日志,如何能够继续工作.
徐靖
2020/08/05
7300
oracle resetlogs后goldengate如何继续工作
UIRefreshControl
UIRefreshControl 平时很少用UIRefreshControl,iOS开发者上手就是MJRefresh 都忘记还有UIRefreshControl这么一个系统提供的控件了。 使用方法 @property (nonatomic, strong) UIRefreshControl *refreshControl; self.refreshControl = [[UIRefreshControl alloc] init]; [_refreshControl addTarget:self
程序员不务正业
2018/06/13
6670
老电脑如何继续继续工作
作者从2017年开始使用Linux作为主操作系统,作者当作主操作系统的Linux如下:
zeekling
2023/05/15
8190
JVM 堆内存溢出后,其他线程是否可继续工作?
我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
用户2781897
2021/04/23
5740
JVM 堆内存溢出后,其他线程是否可继续工作?
jvm堆内存溢出后,其他线程是否可继续工作
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
美的让人心动
2018/12/05
9800
jvm堆内存溢出后,其他线程是否可继续工作
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
纯洁的微笑
2018/12/07
1K0
WWDC2016 Session笔记 - iOS 10 UICollectionView新特性
关于 iOS 10 UICollectionView的新特性,主要还是体现在如下3个方面
一缕殇流化隐半边冰霜
2018/08/30
2K0
WWDC2016 Session笔记 - iOS 10  UICollectionView新特性
UICollectionView
平常我在业务开发中,绝大部分情况都是使用的UITableView,而UICollectionView则是在极少情况下才会去使用,这就导致了我对UICollectionView略感陌生。本篇文章就是以二者对比的方式对UICollectionView做一个小总结。
拉维
2019/08/12
1.2K0
iOS10 / Swift3.0 / XCode 8 总结
因为它企图访问敏感数据时没有在应用程序的Info.plist 设置privacy key 新增的privacy setting如下:
100001509164
2022/01/20
8080
iOS10 / Swift3.0 / XCode 8 总结
iOS14开发-UIView
在 iOS 13 中引入了新的 API — Diffable Data Source,它不仅能够驱动 UITableView 和 UICollectionView,而且可以更简单高效的实现数据的刷新。
YungFan
2021/01/21
11.9K0
vmware workstation 克隆后网卡eth0不能正常工作
解决方法如下 修改/etc/udev/rules.d/70-persistent-net.rules 将eth0这行注释掉或者删除, 这里记载的还是克隆系统时的MAC地址,但是新启动的系统MAC已经更改, 将NAME="eth1" 改为 “eth0”,ATTR 标记的MAC地址,这个是虚拟机为这个虚拟网卡分配的MAC,用上面的MAC替换掉 /etc/sysconfig/network-scripts /ifcfg-eth0中的MAC 然后重启即可 还有一个办法,不用eth0,直接用eth1等,把/etc/sysconfig/network-scripts/ifcfg-eth0复制成/etc/sysconfig/network-scripts/ifcfg-eth1
三杯水Plus
2018/11/14
2.4K0
美团面试:JVM 堆内存溢出后,其他线程是否可继续工作?
我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
程序猿DD
2021/07/13
4730
美团面试:JVM 堆内存溢出后,其他线程是否可继续工作?
IOS UIRefreshControl刷新控件
import UIKit class ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource{ @IBOutlet weak var tabvLayout:UITableView! var refreshControl = UIRefreshControl() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.automaticallyAdjustsScrollViewInsets = false //添加刷新 refreshControl.addTarget(self, action:#selector(refreshData), for: UIControlEvents.valueChanged) refreshControl.attributedTitle =NSAttributedString(string:”松开后自动刷新”) tabvLayout.addSubview(refreshControl) refreshData() } // 刷新数据 func refreshData() { self.tabvLayout.reloadData() self.refreshControl.endRefreshing() } // MARK:- UITableViewDataSource func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) -> Int { return 10; } func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) -> UITableViewCell { let cell = UITableViewCell(style:UITableViewCellStyle.value1, reuseIdentifier:“newsCell”) let date = NSDate() let timeFormatter = DateFormatter() timeFormatter.dateFormat = “yyy-MM-dd ‘at’ HH:mm:ss.SSS” //(时间格式) let strNowTime = timeFormatter.string(from:date as Date) as String cell.textLabel?.text = strNowTime let rect = CGRect(x:0,y:cell.frame.height-1,width:self.view.frame.size.width,height:1) let label = UILabel(frame:rect) label.backgroundColor = UIColor.lightGray() cell .addSubview(label) return cell; } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
用户5760343
2019/07/08
7150
IOS UIRefreshControl刷新控件
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
芋道源码
2019/07/05
3380
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
公众号 IT老哥
2021/09/16
3000
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
java进阶架构师
2021/05/08
5010
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
乔戈里
2019/08/20
3370
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
良月柒
2019/12/03
4470
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
很纠结,是工作还是继续考研?
简单介绍一下这位同学的情况,他目前大四,学校不是很好。大学期间有参加过一些比赛,也有一些小厂的实习经验。但是在今年的考研当中发挥不是很好,专业课压线,国家线没过。由于临近毕业,他现在非常烦恼,不知道是如何选择是应该二战考研呢还是应该先找个工作干着。
帅地
2021/05/27
4480
美团面试题:JVM堆内存溢出后,其他线程是否可继续工作?
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
Spark学习技巧
2019/06/28
5520
美团面试题:JVM堆内存溢出后,其他线程是否可继续工作?

相似问题

如何使用库SortableJS提交新排序的元素列表

15

如何使用SortableJS仅检测drop事件

13

如何使用动态创建的HTML使用拖放?(SortableJS)

10

如何从启用SortableJS的UL中删除元素

139

如何在cakephp4中比较datetime

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文