﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Codejie's C++ Space-随笔分类-SnakeGo</title><link>http://www.cppblog.com/codejie/category/20881.html</link><description>Using C++</description><language>zh-cn</language><lastBuildDate>Sun, 18 May 2014 13:28:32 GMT</lastBuildDate><pubDate>Sun, 18 May 2014 13:28:32 GMT</pubDate><ttl>60</ttl><item><title>SnakeGo : Scaling Screen and Moving Camera</title><link>http://www.cppblog.com/codejie/archive/2014/05/18/207007.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Sun, 18 May 2014 11:24:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/05/18/207007.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207007.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/05/18/207007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207007.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207007.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 敲了几晚SnakeGo, 原型出来了, 大家来看看不...</p> <p>&nbsp;</p> <p><img title="1" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="1" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo-_13899/1_27d519d2-f888-44d1-9760-96312a8c4a58.png" width="240" height="400" /><img title="2" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="2" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo-_13899/2_09279857-09bb-4f01-9660-67d0b3886a01.png" width="240" height="400" /><img title="3" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="3" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo-_13899/3_e07439f6-6915-45bd-bc9b-6fea5a544b8b.png" width="240" height="400" /></p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 不错, 这货就是---贪吃蛇...哈哈...别急, 这还是原型, 好玩的在后面呢...(以我敲字速度, 大约再等不到六个月应该可以完成了...)</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 今天这里记录下使用LIBGDX过程中碰到的两个问题:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 调整屏幕比例;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 移动观察镜头;</p> <p>&nbsp;</p> <p>一, 调整屏幕比例</p> <p>&nbsp;&nbsp;&nbsp; LIBGDX是跨平台的, 一大好处就是直接在PC上测试, 那是非常的方便, 但这有两个问题需要考虑, 一, 手机是1280x768, 但我PC只有1280x1024的, 而且真要开个跟手机一样大小的一样大小的屏幕, 那还怎么看log输出呢? 二就是不同的手机有着不同的分辨率, 长宽比也不一致, 那怎么保证图形不变形呢?</p> <p>&nbsp;&nbsp;&nbsp; 这个问题不难解决, 只需要在屏幕尺寸发生变化时, 即resize()(第一次启动也会调用此函数)中, 重新调整镜头(Camera)的参数即可. 如下代码:</p> <div><pre>	@Override
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> resize(<span style="color: #0000ff">int</span> width, <span style="color: #0000ff">int</span> height) {
		Vector2 size = Scaling.fit.apply(WIDTH, HEIGHT, width, height);
		
		camera = <span style="color: #0000ff">new</span> OrthographicCamera(size.x, size.y);
		camera.update();

		batch.setProjectionMatrix(camera.combined);
	    
              <span style="color: #0000ff">int</span> viewportX = (<span style="color: #0000ff">int</span>)(width - size.x) / 2;
	       <span style="color: #0000ff">int</span> viewportY = (<span style="color: #0000ff">int</span>)(height - size.y) / 2;
	       <span style="color: #0000ff">int</span> viewportWidth = (<span style="color: #0000ff">int</span>)size.x;
	       <span style="color: #0000ff">int</span> viewportHeight = (<span style="color: #0000ff">int</span>)size.y;
	    
		Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);

		<span style="color: #0000ff">super</span>.resize(width, height);
	}</pre></div>
<p>&nbsp;&nbsp;&nbsp; 这里采用的是重新创建camera实例的方式, 另外用改变已有camera实例的参数方式也是一样的. 很简单, 而且这样一次就解决了上面两个问题 -- PC机上使用任何尺寸的窗口, 都可以获得跟设置等比例的窗口, 手机上亦是如此. 像<a href="http://www.cppblog.com/codejie/category/20828.html">I;P</a>就是采用的这种方式来保持其在任意手机上都是1280:768的比例.</p>
<p>&nbsp;&nbsp;&nbsp; 这种方法只是改变了'视图'的大小, 但并不会改变其中的图形的大小, 这样为了保持图形显示比例, 需要在输出图形时做相应的比例放缩. 可以在resize()获得这个比例, 染在图形输出时使用这个比例.</p>
<div><pre>              screenScaling = <span style="color: #0000ff">new</span> Vector2((size.x / WIDTH), (size.y / HEIGHT));</pre>
<div><pre>              ...
              ...
              batch.draw(img, (- WIDTH / 2) * screenScaling.x, (- HEIGHT / 2) * screenScaling.y, WIDTH * screenScaling.x, HEIGHT * screenScaling.y);</pre></div>
<div>&nbsp;</div></div>
<p>二, 移动观察镜头</p>
<p>&nbsp;&nbsp;&nbsp; 在SnakeGo中, 为了不让Snake'跑出'屏幕, 需要镜头camera跟Snake本身保持'同步'移动, 这样看起来Snake保持在屏幕的中间, 但其它Object是移动的. 根据'相对运行'原理, 使整个看起来像是Snake在Object中穿行. 所以, 移动camaera是必须的, 代码也简单, 如下:</p>
<div><pre>              ...
		<span style="color: #0000ff">final</span> OrthographicCamera camera = game.getCamera();
		camera.translate(0.0f, 32.0f, 0.0f);
		camera.update();
		game.getSpriteBatch().setProjectionMatrix(camera.combined);
              ...</pre></div><br />
<p>&nbsp;</p>
<p>&lt;----心烦意乱的分割线----&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 这几天在找工作, 前面去面了一次, 其中没一个App或者Game的问题, 倒全是C++相关的, 登时就傻眼了...虽说咱也是C++'出身'的(不然Blog也不会在这里不是), 但也许真的是'老'了, 才三年不用C++,竟然忘记的只剩下个auto_ptr了...更悲剧的是咱用的C++98标准已经变成C++11了, auto_ptr变成smart_ptr了... </p>
<p>&nbsp;&nbsp;&nbsp; 都说现在是个'跨界'的时代, 但咱这还没有跨界, 只是同行转个方向而已, 为啥就这么悲剧了...好吧, 估计学艺不精才是根本...</p>
<p>&nbsp;&nbsp;&nbsp; 同学"'大数据'的博士"周五来电, 问我要不要跟她一起做个'图像搜索', 有些犹豫, 要说三年前, 也许就干了, 但现在...再转次嘛...</p>
<p>&nbsp;&nbsp;&nbsp; 恰逢I;P敲完, 心烦意乱的一周, 只好赶紧抓起SnakeGo来, 夜夜疯敲, 来安抚砰砰躁动的心...是的, 至少敲字可以让自己平静些...</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 吐槽而已, 这里想说 ---- 程序员们啊, 转行要趁着年轻赶紧啊...</p><img src ="http://www.cppblog.com/codejie/aggbug/207007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-05-18 19:24 <a href="http://www.cppblog.com/codejie/archive/2014/05/18/207007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>