Lazy Foo:Game Loops
英文原文连接:http://lazyfoo.net/articles/article04/index.php
废话我也就不翻译了,贴个代码然后注释一下吧。
1.游戏住循环
接收信息,然后操作,最后渲染
while( gameIsRunning )
{
//Events
//Logic
//Rendering
}
2.游戏循环细节
这里强调一个动作事件处理(event handling)和表面的属性逻辑(logic)分离开来,分开来处理。
下面的程序先处理键盘事件,修改表面的属性;然后出了事件循环再根据属性的变化,落实操作,先渲染背景,再渲染前景
刷新屏幕,程序必须限制帧率,我以前写的一个五子棋没有限制帧率,每秒渲染18000次。。。一个CPU核心全速跑,伤不起啊。。
logic是最难的部分,其中包含很多东西,例如AI,碰撞检测,物理现象,动作,状态变化等等。
//Game Loop
while( quit == false )
{
//Start the frame timer
fps.start(); //Events
while( SDL_PollEvent( &event ) )
{
myDot.handle_input(); if( event.type == SDL_QUIT )
{
quit = true;
}
}
//Logic
myDot.move();
//Rendering
SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) ); myDot.show(); if( SDL_Flip( screen ) == - )
{
return ;
}
while( fps.get_ticks() < / FRAMES_PER_SECOND ){}
}
3.一个接收方向按键改变运动速率,和边界碰撞检测的输入检测
边界如果以下面这种情况处理,如果遇到,主平面长宽不能被物体长宽整除的情况,物体的显示会触不到边界,你遇到这种情况,
可以把物体显示到主平面长宽-物体长宽的位置。。。或者换一种实现
void Dot::handle_input()
{
if( event.type == SDL_KEYDOWN )
{
switch( event.key.keysym.sym )
{
case SDLK_UP: yVel -= DOT_HEIGHT / ; break;
case SDLK_DOWN: yVel += DOT_HEIGHT / ; break;
case SDLK_LEFT: xVel -= DOT_WIDTH / ; break;
case SDLK_RIGHT: xVel += DOT_WIDTH / ; break;
}
}
else if( event.type == SDL_KEYUP )
{
switch( event.key.keysym.sym )
{
case SDLK_UP: yVel += DOT_HEIGHT / ; break;
case SDLK_DOWN: yVel -= DOT_HEIGHT / ; break;
case SDLK_LEFT: xVel += DOT_WIDTH / ; break;
case SDLK_RIGHT: xVel -= DOT_WIDTH / ; break;
}
} x += xVel; if( ( x < ) || ( x + DOT_WIDTH > SCREEN_WIDTH ) )
{
x -= xVel;
} y += yVel; if( ( y < ) || ( y + DOT_HEIGHT > SCREEN_HEIGHT ) )
{
y -= yVel;
}
}
4.两个玩家的情况
下面这种逻辑不可取,这是不对的!!!
//Player 1 logic
player1->handle_collision();
player1->set_status();
player1->move(); //Player 2 logic
player2->handle_collision();
player2->set_status();
player2->move();
一定要以下面这个形式:
//Handle collisionplayer1->handle_collision();player2->handle_collision(); //Set status
player1->set_status();
player2->set_status(); //Move players
player1->move();
player2->move();
Lazy Foo:Game Loops的更多相关文章
- Lazy.js : 让 JavaScript 变懒
Lazy.js : 让 JavaScript 变懒 http://segmentfault.com/a/1190000000358463
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- Segment Tree with Lazy 分类: ACM TYPE 2014-08-29 11:28 134人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; stru ...
- Mark SDL2 Lazy Foo's Producations
重点 初学SDL2,此处为笔记.有错误还请指出. 13)When our SDL 2 application runs, the operating system needs to be able t ...
- Image Lazy Load:那些延时加载图片的开源插件(jQuery)
图片延时加载技术对大流量的网站来说是十分实用的.目前图片在网站中大量使用,如果不加处理的话会对服务器和带宽造成级大压力,通过只渲染当前用户可见区域的图片,可以极大地减少网站的请求数,降低网络带宽资源. ...
- Lazy Scheduler:我的轻量级任务调度框架
一.背景 工作中经常涉及任务调度,一直都是采用while(true) => if hitted DO => Thread.Sleep(interval)的模式.但是最近实在是感觉这种实现模 ...
- 题解报告:poj 3468 A Simple Problem with Integers(线段树区间修改+lazy懒标记or树状数组)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)
1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...
- 第23课 可变参数模板(4)_Optional和Lazy类的实现
1. optional类的实现 (1)optional的功能 ①optional<T>的内部存储空间可能存储了T类型的值,也可能没有.只有当optional被T初始化之后,这个option ...
随机推荐
- Android BaseAdapter Gallery 画廊视图 (左右拖动图片列表拖至中间时图片放大显示)
画廊视图使用Gallery表示,能够按水平方向显示内容,并且可以手指直接拖动图片和移动,一般用来浏览图片,,被选中的选项位于中间,并且可以响应事件显示信息.在使用画廊视图时,首先在屏幕上添加Galle ...
- Linux入门基础 #6:Linux用户基础
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码
JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决 6大配置点 使用UTF-8编码 目前对遇到J2EE 开发中 中文及其乱码问题,参考网上资料做个总结, 主要是6大配置点: ...
- RSA 非对称加密 数字签名 数字证书
什么是RSA加密算法 RSA加密算法是一种非对称加密算法,算法的数学基础是极大数分解难题. RSA加密算法的强度也就是极大数分解的难度,目前700多位(二进制)的数字已经可以破解,1024位认为是比较 ...
- Java基础知识强化75:正则表达式之分割功能(字符串中的数字排序案例)
1. 案例分析: 我有如下一个字符串:"91 27 46 38 50" 写代码实现最终输出结果是:"27 38 46 50 91" 分析: (1)定义一个 ...
- 为什么要配置path环境变量?
一:关于path环境变量--为了在任意目录下,使用javac/java命令 第一种配置方法: 通过配置path环境变量,我们可以使某个程序,比如javac.exe,在任意目录下都可以运行,而不用跑到j ...
- FineUI初学手册
女朋友鄙视我原创少... 1.下载 进入官方论坛:http://www.fineui.com/bbs/ 要用到下载源代码和空项目下载 http://fineui.codeplex.com/ http: ...
- CRC32校验的用法
CRC32校验数据的完整性 这里的数据包括字符串.文件,还有哪些? 文件校验相当于下载大型软件,有md5加密结果.这里的用途是什么?
- (转)\r \r\n \t 的区别
小风吹雪 \r \r\n \t 的区别 http://www.360doc.com/content/12/0530/15/16538_214756101.shtml \n 软回车: 在Wi ...
- (转)JQuery中$.ajax()方法参数详解
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...