英文原文连接: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的更多相关文章

  1. Lazy.js : 让 JavaScript 变懒

    Lazy.js : 让 JavaScript 变懒 http://segmentfault.com/a/1190000000358463

  2. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

  3. 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 ...

  4. Mark SDL2 Lazy Foo's Producations

    重点 初学SDL2,此处为笔记.有错误还请指出. 13)When our SDL 2 application runs, the operating system needs to be able t ...

  5. Image Lazy Load:那些延时加载图片的开源插件(jQuery)

    图片延时加载技术对大流量的网站来说是十分实用的.目前图片在网站中大量使用,如果不加处理的话会对服务器和带宽造成级大压力,通过只渲染当前用户可见区域的图片,可以极大地减少网站的请求数,降低网络带宽资源. ...

  6. Lazy Scheduler:我的轻量级任务调度框架

    一.背景 工作中经常涉及任务调度,一直都是采用while(true) => if hitted DO => Thread.Sleep(interval)的模式.但是最近实在是感觉这种实现模 ...

  7. 题解报告: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 ...

  8. 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 ...

  9. 第23课 可变参数模板(4)_Optional和Lazy类的实现

    1. optional类的实现 (1)optional的功能 ①optional<T>的内部存储空间可能存储了T类型的值,也可能没有.只有当optional被T初始化之后,这个option ...

随机推荐

  1. (五)unity4.6Ugui中文教程文档-------概要-UGUI Interaction Components

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDAxOTcxNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  2. POJ1595_Prime Cuts【素数】【水题】

    Prime Cuts Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 10464Accepted: 3994 Description ...

  3. [Redux] Introduction

    Single immutable state tree: Should be just one single javascript object. Describing the changes by ...

  4. 窥探 Swift 之 函数与闭包的应用实例

    今天的博客算是比较基础的,还是那句话,基础这东西在什么时候 都是最重要的.说到函数,只要是写过程序就肯定知道函数是怎么回事,今天就来讨论一下Swift中的函数的特性以及Swift中的闭包.今天的一些小 ...

  5. 怎样将关系型数据表转换至hbase数据表

    首先须要把关系型数据库的数据表的数据添加由 "纵向延伸",转变为HBase数据表的"横向延伸" 一.Hbase的存储结构 a)      HBase以表(HTa ...

  6. SVN经常使用命令说明

    SVN版本号:1.5 及更新版本号 名词说明: WC:Working Copy 你的工作区 Versioned:受控的:受版本号控制的 SVN是什么? SVN是开源的版本号控制系统. 比CVS很多其它 ...

  7. Qt Linux 使用QJson库

    1. 下载 到http://dl.oschina.net/soft/qjson下载库源文件: qjson-0.8.1-1385961227890.zip 解压为:qjson-0.8.1 2. 编译 c ...

  8. 关于飞控下载时候出现avrdude: stk500_getsync(): not in sync: resp=0x00错误的解决方法

    avrdude: stk500_getsync(): not in sync: resp=0x00该问题表述为串口通信失败 经过分析,出现这种情况的原因大致有:1.arduino在IDE下载过程中没有 ...

  9. 营配数据质量核查,关于营销mis系统与配电gis系统里面的sql语句查询,做为积累使用,下次就不用重复写同样的语句了。

    1.配电gis线路导出数据: select r.name 线路名称,r.run_status 运行状态,r.voltage_level 电压等级,r.manager_depart 管理部门,r.bel ...

  10. JavaScript 客户端JavaScript之 Web浏览器的环境

    Web浏览器实现的Javascript,通过Web浏览器实现的JavaScript引入了大量可脚本化的对象(1.Web浏览器 2.HTML 3.HTML中的内容)  Web浏览器中的Javascrip ...