`
xhload3d
  • 浏览: 208406 次
社区版块
存档分类
最新评论

HTML5版的String Avoider小游戏

阅读更多

HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动过程绘制出移动轨迹的String平滑曲线,整个过程不能碰撞到边界,从技术角度来说其核心就是根据鼠标移动位置生成String线的算法,该游戏是ActionScript写的Flash版,这里将其改造成HTML5版的JavaScript实现,并增加可自定义关卡功能的一种设计思路。

Screen Shot 2014-12-28 at 3.39.34 PM

String连线我是缓存了300个点信息的数组,鼠标移动时不断调整300个点的新位置信息,每次更新时先将新鼠标点设置给第一个元素,后续更新x点时,计算其与x-1点的角度,在此方向长度为1的位置更新坐标,这样就达到了平滑曲线的效果。

除了绘制String线外还有个技术点就是监测碰撞,该Flash游戏的边界都是线段,因此第一想到的监测方式就是线线相交的思路,算法可参考 http://en.wikipedia.org/wiki/Line%E2%80%93line_intersection ,如果以LineLine的相交思路只需要遍历所有point间的线段,判断是否与游戏关卡定义的边界线相交,但这种方式对不规则边界就比较麻烦,监测性能也不高。

考虑到我们还需要提供用户可DIY自定义游戏关卡的功能,我们将采用监测颜色透明度信息的方式,由于正常游戏时场景无需用户动态修改,因此边界的信息可提前缓存到ImageData内存中,并且我们300个点的距离都是1,监测只需根据点进行就可以。

Screen Shot 2014-12-28 at 3.38.33 PM

整个程序采用HT for WebGraphView拓扑图组件,再其上通过addTopPainter添加顶层画笔绘制曲线,当曲线碰到Node图元时绘制成红色,否则绘制成黄色,监听GraphView拓扑图的interaction事件,在该事件中设置dirty的脏标志,在绘制时根据dirty的标志进行更新,采用这样的方式可将多次变换最终聚合成一次更新,这也是图形刷新绘制常用的基本技巧。同时通过GraphView.setEditable(true)开启了拓扑图的可视化编辑功能,用户可随时改变界面图元位置和旋转等形状信息,相当于自定义关卡的效果。
<iframe src="http://player.youku.com/embed/XODU4NzY5MzQ0" frameborder="0" width="510" height="498"></iframe>

所有代码和运行效果如下:http://v.youku.com/v_show/id_XODU4NzY5MzQ0.html

function init(){                    
	dataModel = new ht.DataModel();                   
	graphView = new ht.graph.GraphView(dataModel); 
	graphView.handleScroll = function(){};
	graphView.setEditable(true);
	graphView.setPannable(false)

	view = graphView.getView();
	view.style.left = '10px';
	view.style.top = '10px';
	view.style.width = '600px';
	view.style.height = '400px';
	view.style.background = 'black';
	document.body.appendChild(view);

	createNode(20, 20, 80, 40, 'rect');                
	createNode(200, 300, 80, 40, 'star');
	createNode(400, 100, 80, 40, 'oval');
	createShape();

	length = 1;
	count = 300;
	points = [];
	for(var i=0; i<count; i++){
		points.push({x: 0, y: 0});
	}
	view.addEventListener('mousemove', function(e){
		var point = graphView.lp(e);
		points[0].x = point.x;
		points[0].y = point.y;
		for (var i = 1; i < count - 1; i++) {
			var angle = Math.atan2(points[i].y - points[i - 1].y, points[i].x - points[i - 1].x);
			points[i].x = points[i - 1].x + length * Math.cos(angle);
			points[i].y = points[i - 1].y + length * Math.sin(angle);
		}
		if(imageData){
			hit = false;
			for (var i = 0; i < count; i++) {
				var x = Math.floor(points[i].x);
				var y = Math.floor(points[i].y);
				var index = (y * graphView.getWidth() + x) * 4;
				if(imageData.data[index+3] !== 0){
					hit = true;
					break;
				}
			}                        
		}                    
		graphView.redraw();
	});

	dirty = true;                
	imageData = null;
	graphView.mi(function(e){
		dirty = true;
	});                
	graphView.addTopPainter(function(g){
		if(dirty){
			dirty = false;    
			hit = false;
			imageData = g.getImageData(0, 0, graphView.getWidth(), graphView.getHeight());                                                                                                                                              
			ht.Default.callLater(graphView.redraw, graphView);  
		}else{
			g.beginPath();
			g.lineWidth = 3;
			g.strokeStyle = hit ? 'red' : 'yellow';                   
			g.moveTo(points[0].x, points[0].y);
			for (var i = 1; i < count - 1; i++) {
				g.lineTo(points[i].x, points[i].y);
			}
			g.stroke();                        
		}
	});
}    
function createNode(x, y, w, h, shape){
	var node = new ht.Node();
	node.setRect(x, y, w, h);
	node.s({
		'shape': shape,
		'select.width': 0
	});
	dataModel.add(node);
	return node;
}

 

2
1
分享到:
评论

相关推荐

    flash for android avoider game

    尽管如今HTML5和其他跨平台技术逐渐兴起,但Flash在游戏开发领域的地位依然不可忽视,尤其是在创建快速原型和小型互动游戏时。通过理解并掌握上述知识点,开发者可以打造出既有趣又具有挑战性的Android避免类游戏,...

    keyboard_avoider:脚手架小部件的轻型替代品,可避免使用屏幕上的软件键盘。 自动将模糊的TextField子窗口小部件滚动到焦点视图中

    keyboard_avoider Scaffold小部件的轻型替代品,可避免使用屏幕上的软件键盘。 自动将模糊的TextField子窗口小部件滚动到焦点视图中。 在上面的视频中,每个彩色区域都包装在其自己的KeyboardAvoider 。 例子 基本...

    d3-avoider-game

    5. `gameLogic.js`/`levelDesign.js`/`playerControls.js`等:可能包含特定游戏模块的代码,如游戏逻辑、关卡设计和玩家控制等。 6. `assets/`:可能包含游戏中的图像、音频或其他资源文件。 7. `README.md`或`...

    Clam Avoider ActionScript2-开源

    首先,"Clam Avoider"是一款2D街机游戏,玩家需要控制游戏角色避开一系列障碍物,通常是贝壳(clams),以此来获得分数并尽可能长时间地生存。这类游戏的核心在于简单的游戏机制和易于上手的操作,适合各种年龄层的...

    KeyboardAvoider:iOS的SwiftUI中缺少的交互式键盘

    :keyboard: KeyboardAvoider {} SwiftUI的KeyboardAvoider 。 受到中的简单性的启发。特征自动滚动到TextField 滑动键盘以关闭安装创建一个Package.swift文件。 import PackageDescriptionlet package = Package ( ...

    Obstacle-Avoider:借助IC的逻辑条件,机器人可以检测并避开其路径上的物体

    避障 几乎所有的导航机器人都需要相同类型的障碍物检测,因此,避障策略至关重要。 避障机器人具有广阔的应用领域。 它们可以用作服务机器人,用于家庭工作和许多其他室内应用。 综上所述,避障技术在世界范围内得到...

    superNinjaAvoider:CS141最终项目

    在这个项目中,开发者需要设计并实现一个名为"Super Ninja Avoider"的游戏。游戏的核心玩法是控制一个忍者角色,避开各种障碍物并尽可能长时间地生存下去。这涉及到游戏循环的设计、游戏角色和障碍物的生成、碰撞...

    打造您的第一个Arduino机器人-最佳入门指南!-项目开发

    5. **编程逻辑**:在`final_sketch__final_code_.ino`中,你将看到整合了所有功能的最终代码。这包括控制逻辑,比如如何根据传感器数据决定机器人的行动,以及如何通过蓝牙接收和解析命令。理解这段代码可以帮助你...

    简单对象回避机器人使用Actobotics Runt-项目开发

    `simple-object-avoider-robot-the-using-actobotics-runt-8068a7.pdf`文档可能是项目指南,详细介绍了如何组装机器人,如何连接各个组件,以及如何编写和上传代码到Arduino。这份文档可能包含了电路图、传感器配置...

    避障机器人-项目开发

    5. **图像资料辅助理解**:"capture_WN98SXOU5m.PNG"可能是机器人设计或实验过程的截图,可以帮助我们可视化机器人结构和测试情况。图片可以提供额外的上下文信息,帮助我们更好地理解项目的实现过程。 6. **技术...

    九型人格——你究竟属于哪一类型.doc

    5. **完美主义者**(The Perfectionist):对自己要求严格,追求完美,可能过于批判自己和他人。 6. **悲悯者**(The Martyr):容易感到痛苦,尤其是被误解时,倾向于付出而非接受。 7. **挑战者**(The Challenger...

    使用红外传感器的避障机器人-项目开发

    避障机器人是一种能够自主探测并避开障碍物的自动化设备,广泛应用于家庭自动化、服务机器人以及教育领域。在本项目中,我们重点讨论的是利用红外传感器(Infrared Sensor,IR Sensor)来实现避障功能,这相对于...

Global site tag (gtag.js) - Google Analytics