ImageVerifierCode 换一换
格式:DOCX , 页数:74 ,大小:107.15KB ,
资源ID:26682877      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26682877.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(chapter12 实验手册.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

chapter12 实验手册.docx

1、chapter12 实验手册第12章 网络游戏编程网络坦克大战客户端的实现(一)准备工作:1. 新建cocos2d-x项目2. 游戏资源从光盘拷贝到Resources目录下3. 将ODSocket加入到Classes下并在VS工程中添加这些已有项,结构如图:4. 将HelloWorld场景相关的头文件和cpp文件删除,同时把对这个场景的所有引用删除(二)编写全局常量配置文件Global.h,方便常用数值的访问#ifndef _GLOBAL_H_#define _GLOBAL_H_#define WINDOWHEIGHT Director:getInstance()-getVisibleSize

2、().height#define WINDOWWIDTH Director:getInstance()-getVisibleSize().width#endif(三)实体类的封装实体类的继承关系如下图:(1) 实体类基类BaseObject的封装:#ifndef _BASE_OBJECT_H_#define _BASE_OBJECT_H_#include cocos2d.hUSING_NS_CC;using namespace cocos2d;class BaseObject : public Spritepublic: BaseObject() ; virtual BaseObject()

3、; CREATE_FUNC(BaseObject); virtual bool init(); / set and get int getLife() return m_life ; ; float getSpeed() return m_speed; ; int getKind() return m_kind ; ; int getDirection() return m_direction; ; int getLevel() return m_level; ; int getID() return m_ID; ; int getHindered() return m_hindered; ;

4、 void setLife(int l) m_life = l; ; void setSpeed(float s) m_speed = s; ; void setDirection(float d) m_direction = d; ; void setKind(int k) m_kind = k; ; void setLevel(int lev) m_level = lev; ; void setID(int id) m_ID = id; ; void setHindered(int hindered) m_hindered = hindered; ; private: int m_ID;

5、/ OBJECT的ID float m_speed; / OBJECT的移动速度 int m_life; / OBJECT的生命值(或有效值) int m_direction; / OBJECT移动的方向 int m_kind; / OBJECT所属的类型,在不同的派生类中有不同的意思 int m_level; / OBJECT等级 int m_hindered; / OBJECT在四个方向上是否受到阻碍up.down.left.right;#endif该类主要定义了基类的属性和方法,绝大多数方法都在头文件提供了简单的实现,实现文件只提供了init方法的实现:#include BaseObje

6、ct.hbool BaseObject:init() if (!Sprite:init() return false; return true;(2) 坦克类Tank的封装:#ifndef _TANK_H_#define _TANK_H_#include BaseObject.h#include cocos2d.h#include cocostudio/CocoStudio.h#include ui/CocosGUI.h#include Global.h#include Bullet.hUSING_NS_CC;using namespace cocos2d;using namespace co

7、costudio;using namespace cocos2d:ui;#define TANKBASELIFE 1 / TANK基础生命#define TANKSPEED 1 / TANK默认速度#define TANKSIZE 32 / TANK尺寸大小#define TANK_UP 1 / TANK向上状态#define TANK_DOWN 2 / TANK向下状态#define TANK_LEFT 3 / TANK向左状态#define TANK_RIGHT 4 / TANK向右状态#define TANK_STAY 5 / TANK停止状态class Tank : public Ba

8、seObjectpublic: static Tank* create(int ID, float x, float y, int dir, int kind); void MoveUP(); void MoveDown(); void MoveLeft(); void MoveRight(); void Fire(); void Stay(int dir); void Blast(); / 爆炸时已自动设置life为0 bool isMoving() return m_isMoving; ; Rect getRect() return m_rect; ; Vector getBulletLi

9、st() return m_bulletList; ;private: virtual bool init(int ID, float x, float y, int dir, int kind); void Draw(); void update(float t); void deleteObj(Sprite* obj);private: Sprite* m_sprite; / 图片精灵 Texture2D* m_texture; / 保存texture Vector m_bulletList; / 子弹列表 bool m_moveUp; / 坦克往上移动 bool m_moveDown;

10、/ 坦克往下移动 bool m_moveLeft; / 坦克往左移动 bool m_moveRight; / 坦克往右移动 float m_frametime; / 切换图片时间步长 float m_temptime; / 每经过temptime切换图片 int m_texchange; / 坦克履带纹理切换控制 Rect m_rect; / 坦克包围框 bool m_isMoving; / 坦克正在移动 int m_textureX; int m_textureY;#endifTank中主要的注意点在Tank的爆炸Blatant完成之后需要销毁自己,所以需要实现一个对应的销毁自己的方法:de

11、leteObj,实现文件如下:#include Tank.hTank* Tank:create(int ID, float x, float y, int dir, int kind) Tank* pRet = new(std:nothrow) Tank(); if (pRet & pRet-init(ID, x, y, dir, kind) pRet-autorelease(); return pRet; else delete pRet; pRet = NULL; return NULL; bool Tank:init(int ID, float x, float y, int dir,

12、int kind) if (!BaseObject:init() return false; Director:getInstance()-setProjection(Director:Projection:_2D); / 改为正交投影,避免图片模糊 setLife(TANKBASELIFE); / tank life setSpeed(TANKSPEED); / tank speed setLevel(1); / tank level setHindered(TANK_STAY); / tank hindered m_moveUp = FALSE; m_moveDown = FALSE; m

13、_moveRight = FALSE; m_moveLeft = FALSE; m_isMoving = false; m_frametime = 2.0; m_temptime = 0; / tank init ifo setID(ID); this-setPositionX(x); this-setPositionY(y); setDirection(dir); setKind(kind); / tank kind if (kind = 1) m_texture = Director:getInstance()-getTextureCache()-addImage(Chapter12/ta

14、nk/player1.png); if (kind = 2) m_texture = Director:getInstance()-getTextureCache()-addImage(Chapter12/tank/player2.png); / tank initY state m_textureX = (this-getLevel() - 1) * 4 + 1) * 14; if (dir 0 & dir 0 & dir 0 & dir 0 & dir getPositionX() - 16, this-getPositionY() - 16, 32, 32); m_sprite-setP

15、osition(Vec2:ZERO); m_sprite-setScale(TANKSIZE/28); this-addChild(m_sprite); this-scheduleUpdate(); return true;void Tank:MoveUP() m_moveUp = true; m_moveDown = false; m_moveLeft = false; m_moveRight = false; setDirection(TANK_UP);void Tank:MoveDown() m_moveDown = true; m_moveUp = false; m_moveLeft

16、= false; m_moveRight = false; setDirection(TANK_DOWN);void Tank:MoveLeft() m_moveLeft = true; m_moveDown = false; m_moveRight = false; m_moveUp = false; setDirection(TANK_LEFT);void Tank:MoveRight() m_moveRight = true; m_moveLeft = false; m_moveUp = false; m_moveDown = false; setDirection(TANK_RIGHT

17、);void Tank:Fire() Vec2 position; switch (this-getDirection() case TANK_UP: position = Vec2(this-getPositionX(), this-getPositionY() + 14); break; case TANK_DOWN: position = Vec2(this-getPositionX(), this-getPositionY() - 14); break; case TANK_LEFT: position = Vec2(this-getPositionX() - 14, this-get

18、PositionY(); break; case TANK_RIGHT: position = Vec2(this-getPositionX() + 14, this-getPositionY(); break; auto bullet = Bullet:create(position, 3, this-getDirection(); m_bulletList.pushBack(bullet); / 添加到子弹列表 this-getParent()-addChild(bullet, 8); / 添加到游戏场景void Tank:Draw() if(this-getLife() m_textur

19、eX = (this-getLevel() - 1) * 4 + 1) * 14; / get tank textureX / 控制坦克履带转动 if (m_moveUp | m_moveDown | m_moveLeft | m_moveRight) m_temptime += m_frametime; if(m_temptime 5) m_temptime -= 5; m_texchange = (m_texchange+1) % 2; switch (m_texchange) case 0: m_textureX = (this-getLevel() - 1) * 4 + 1) * 14

20、; break; case 1: m_textureX = (this-getLevel() - 1) * 4 + 1) * 14 + 2*14; break; this-removeChild(m_sprite, true); / 重要:把前一个精灵移除,避免内存无法释放 m_sprite = Sprite:createWithTexture(m_texture, Rect(m_textureX-14.0, m_textureY-14.0, 28, 28); m_sprite-setScale(TANKSIZE/28); this-addChild(m_sprite); / 更新精灵图片 v

21、oid Tank:Blast() this-setVisible(false); / 坦克消失 this-setLife(0); auto explode = Sprite:create(Chapter12/tank/explode2.png); this-getParent()-addChild(explode); explode-setPosition(this-getPosition(); / 显示爆炸 explode-runAction(Sequence:create( DelayTime:create(0.3f), FadeOut:create(0.3f), / 爆炸消失 CallF

22、unc:create(CC_CALLBACK_0(Tank:deleteObj, this, explode), NULL );void Tank:update(float t) m_isMoving = m_moveUp | m_moveDown | m_moveLeft | m_moveRight; / 更新移动状态 m_rect = Rect(this-getPositionX() - 16, this-getPositionY() - 16, 32, 32); / 更新rect for (int i = 0;i getLife() getLife() unscheduleUpdate(

23、); if (m_moveUp) m_textureY = 1*14; if (this-getPositionY() getHindered() != TANK_UP) setHindered(TANK_STAY); this-setPositionY(this-getPositionY() + this-getSpeed(); Draw(); if (m_moveDown) m_textureY = 5*14; if (this-getPositionY() = 14) & (this-getHindered() != TANK_DOWN) setHindered(TANK_STAY);

24、this-setPositionY(this-getPositionY() - this-getSpeed(); Draw(); if (m_moveLeft) m_textureY = 7*14; if (this-getPositionX() = 14) & (this-getHindered() != TANK_LEFT) setHindered(TANK_STAY); this-setPositionX(this-getPositionX() - this-getSpeed(); Draw(); if (m_moveRight) m_textureY = 3*14; if (this-

25、getPositionX() getHindered() != TANK_RIGHT) setHindered(TANK_STAY); this-setPositionX(this-getPositionX() + this-getSpeed(); Draw(); void Tank:Stay(int dir) switch (dir) case TANK_UP: m_moveUp = false; this-setPositionY(this-getPositionY() - 1); break; case TANK_DOWN: m_moveDown = false; this-setPos

26、itionY(this-getPositionY() + 1); break; case TANK_LEFT: m_moveLeft = false; this-setPositionX(this-getPositionX() + 1); break; case TANK_RIGHT: m_moveRight = false; this-setPositionX(this-getPositionX() - 1); break; void Tank:deleteObj(Sprite* obj) obj-removeFromParent(); this-removeFromParent();(3) 子弹类Bullet的封装,子弹相对简单,只涉及到方向、速度、爆炸以及自身销毁等操作,实现起来比较简单,对应的头文件和实现文件如下:#ifndef _BULLET_H_ / Bullet.h#define _BULLET_H_#include BaseObject.h#include Global.h#define BULLET_UP 1 / BULLET向上状态#define BULLET_DOWN 2 / BULLET向下状态#define BULLET_LEFT 3 / BULLET向左状态#define BULLET_RIGHT 4

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1