求一个C++写的java飞机大战源代码的游戏代码

c++写了个简单的飞机游戏_gamemaker吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,027贴子:
c++写了个简单的飞机游戏收藏
https分行防删://pan.baidu.c分行防删om/s/1eRTJNlK
低租费、低噪音、低油耗的发电机
嗯,很强势
其实你用表情来阻断蓝链更好,复制到浏览器上表情都没了。也不会被和谐。
pan.baidu.com/s/1eRTJNlK就像这样。
整体效果不错!
进游戏画面好高端以为是3D 后一张就成2D了
谔谔 因为打了错别字..本来想删除自己回复的内容的..结果把你的删除了..抱歉抱歉以前也碰到过win10打不开的情况..好像还没有错误提示,不知道怎么解决好
回复的帖子被度娘傲娇的删掉了,突然感觉说话有些吃力。。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或只需一步,快速开始
后使用快捷导航没有帐号?
查看: 793|回复: 7
飞机大战小游戏编写教程(3)
累计签到:142 天连续签到:1 天&
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
本帖最后由 zlh 于
19:43 编辑
教程开始之前先和大家说一声抱歉,因为前两天晚上都和同学出去玩,忘记发教程了。
今天我们要说的是飞机的移动。
相信大家在写一些小游戏的时候都会遇到如何让单位移动的问题。
这个问题确实也困扰过我,不过我也找到了解决方法。
就是使用gotoxy()来控制。gotoxy()只要改变一下其中的一个变量就可以实现移动。
例如gotoxy(x,y)是飞机的当前位置。x--就是向左走,x++就是向右走.y--就是向前走,y++就是向后走。
至于子弹的移动,可以用gotoxy()+for循环。
具体代码是这样的。
void kongzhi(int bx,int by)
{
& &
& & a=getch();
& & switch(a)
& & {
& & case Left:if(x != 1)
& & {
& && && && && && && && &x++;
& && && && && && && && &gotoxy(x,y);
& & & & & & & && && && &printf(& &);
& & & & & & & & & & & &&&x--;
& & & & & & & && && && & x--;
& & & & & & & && && && & gotoxy(x,y);
& & & & & & & & & & & &&&printf(&♂&);
& &&&}
& &&&case Right:if(x != 18)
& &&&{
& & & & & & & & & & & && &x++;
& & & & & & & & & & & && &gotoxy(x,y);
& & & & & & & & & & & && &printf(& &);
& & & & & & & & & & & && &x--;
& && && && && && && && &&&x++;
& & & & & & & && && && &&&gotoxy(x,y);
& & & & & & & & & & & && &printf(&♂&);
& && &&&}
& & & & case Kong:
& & & & {
& && && && &&&bx=y;
& && && && &&&for(by=y;by&1;) //发射子弹
& & & && && & {
& & & & & & & && &by--;
& && && && && && &gotoxy(x,by);
& & & & & & & && &printf(&θ&);
& && && && && && &Sleep(20);
& && && && && && &gotoxy(x,by);
& & & & & & & && &printf(& &);
& && && && && && &y=
& && && && && && &jifan();
& && && && && && &if(r==0||r1==0||r2==0)
& & & && && && &}
& && && && && & y=
& & & & }
& && &&&case Esc:t=0; //退出
& & & & default:
& & & & }
}复制代码
这里我们还加入了按Esc退出的功能。
接下来我们讲一下敌机的移动.
敌机的移动和我机的移动大概相同,只要用一个循环一直让他前进就可以了。
这里顺便回答一下为什么让我机不用前进,因为敌方靠过来和我方前进是差不多的。
具体代码:
void dfeiji ()
{
& & while(1)
& & {
& & & & gotoxy(d,r);
& & & & printf(&Ψ&);
& & & & gotoxy(d2,r2);
& & & & printf(&♀&);
& & & & Sleep(900);
& & & & gotoxy(d,r);
& & & & printf(& &);
& && &&&gotoxy(d1,r1);
& & & & printf(& &);
& & & & gotoxy(d2,r2);
& & & & printf(& &);
& & & & if(kbhit())
& & & & {
& & & & & & & & kongzhi(0,0);
& & & & }
& & & & if(!r){d=rand()%17+1; m++;}
& && &&&if(!r1) {d1=rand()%17+1; m++;}
& && &&&if(!r2) {d2=rand()%17+1; m++;}
& & & & r++;
& & & & r1++;
& & & & r2++;
& && &&&byebye();
& && &&&if(r==18) r=0;
& && &&&if(r1==18) r1=0;
& && &&&if(r2==18) r2=0;
& && &&&if(r==0||r1==0||r2==0)
& & }
}复制代码
那么今天的教程就到这里,最后还是要和大家说一声抱歉。那么明天就是我们程序的最后一步,判定游戏结束和分数等数据的统计。
本帖被以下淘专辑推荐:
& |主题: 32, 订阅: 7
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:142 天连续签到:1 天&
我要狠狠的吐槽一下鱼C的代码格式。复制进去之前是好好地,复制进去之后变得一塌糊涂的
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:142 天连续签到:1 天&
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:362 天连续签到:1 天&
我们都不会出现这个问题啊
还有 ♂ 是啥?
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:142 天连续签到:1 天&
我们都不会出现这个问题啊
还有 ♂ 是啥?
这个就是飞机啊。不过为毛在鱼C上输出变成了斜的
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:77 天连续签到:1 天&
支持楼主ing...
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:17 天连续签到:1 天&
支持!!!
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:9 天连续签到:1 天&
很想学习下是如何编写的。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
小甲鱼强烈推荐 /2
如果要问世界上最好的语言是什么?度娘会告诉你是:php!
本站最帅的人都订阅了这个专辑,你还在犹豫么?
欢迎来到三剑客的世界~
HTML5、CSS3、JavaScript
带着你自己的兴趣,在实战中锻炼,成长~
•••(
Powered byhtml5横版飞机大战游戏源码
html5横版飞机大战游戏源码
作者:林曦丶
资源类型:
运行环境:
html5横版飞机大战游戏源码,画面清晰,运行效果不错,初学者可以看一下,希望能帮助到大家。
服务热线:400-678-8266基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)
来源:博客园
接《基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)》
三、代码分析
1.界面初始化

 1 bool PlaneWarGame::init()
 2 {
 3
bool bRet = false;
 4
do 
 5
CC_BREAK_IF(! CCLayer::init());
 7 
 8
_size = CCDirector::sharedDirector()-&getWinSize();
 9 
10
// 设置触摸可用
11
this-&setIsTouchEnabled(true);
12
// 从窗口中取消息
13
CCDirector::sharedDirector()-&getOpenGLView()-&SetWin32KeyLayer( this );
14 
15
// 初始化游戏背景
16
CC_BREAK_IF(!initBackground());
17
// 菜单1(暂停/声音/炸弹)
18
CC_BREAK_IF(!initMenu1());
19
// 菜单2(继续/重新开始/返回)
20
CC_BREAK_IF(!initMenu2());
21
// 菜单3(重新开始/返回)
22
CC_BREAK_IF(!initMenu3());
23 
24
// 创建玩家飞机
25
_player = new PlayS
26
_player-&setPosition(CCPointZero);
27
addChild(_player);
28 
29
// 调度器:定时调用自定义的回扫函数
30
this-&schedule( schedule_selector(PlaneWarGame::gameLoop));
31
this-&schedule( schedule_selector(PlaneWarGame::shoot), 0.1 );
32
this-&schedule( schedule_selector(PlaneWarGame::addEnemy), 0.3 );
33
this-&schedule( schedule_selector(PlaneWarGame::addProp), 5 );
34 
35
// 初始化两个数组
36
_enemys = CCArray::array();
37
_enemys-&retain();
38
_bullets = CCArray::array();
39
_bullets-&retain();
40
// 背景音乐
42
CocosDenshion::SimpleAudioEngine::sharedEngine()-&playBackgroundMusic(
43
"planewar/game_music.wav", true);
44 
45
bRet = true;
46
} while (0);
47 
48
return bR
49 }

初始化的工作包括:
设置触摸可用
  设置可自定义处理消息
初始化游戏背景
  初始化三个菜单(界面菜单/游戏暂停时的菜单/游戏结束时的菜单)
  初始化两个CCArray类型的数组,分别用来存储有效的敌机精灵对象和子弹对象
设置需要定时调用函数的调度器
设置背景音乐
添加玩家角色
 
2.初始化游戏背景

 1 bool PlaneWarGame::initBackground()
 2 {
 3
// 显示分数
 4
_label = CCLabelBMFont::labelWithString("","planewar/font.fnt");
 5
_label-&setPosition(ccp(220,_size.height-20));
 6
_label-&setColor(ccc3(0,0,0));
 7
this-&addChild(_label, 1);
 8 
 9
// 显示炸弹数量
10
CCLabelBMFont* bombcount = CCLabelBMFont::labelWithString("X09","planewar/font.fnt");
11
bombcount-&setAnchorPoint(ccp(0,0));
12
bombcount-&setPosition(ccp(73,10));
13
bombcount-&setColor(ccc3(0,0,0));
14
addChild(bombcount, 10,111);
15 
16
// 添加背景
17
CCSprite* bg1 = CCSprite::spriteWithFile("planewar/bg1.png");
18
if (!bg1)return false;
19
bg1-&setAnchorPoint(ccp(0,1));
20
bg1-&setPosition( ccp(0, _size.height) );
21
this-&addChild(bg1, 0, 11);
22 
23
bg1-&runAction(
24
CCSequence::actions(
25
CCMoveBy::actionWithDuration(10,ccp(0,-720)),
26
CCCallFunc::actionWithTarget(this, callfunc_selector(PlaneWarGame::bg1roll)),NULL));
27 
28
CCSprite* bg2 = CCSprite::spriteWithFile("planewar/bg2.png");
29
if (!bg1)return false;
30
bg2-&setAnchorPoint(ccp(0,1));
31
bg2-&setPosition( ccp(0, _size.height*2) );
32
this-&addChild(bg2, 0, 12);
33 
34
bg2-&runAction(
35
CCSequence::actions(
36
CCMoveBy::actionWithDuration(20,ccp(0,-1440)),
37
CCCallFunc::actionWithTarget(this, callfunc_selector(PlaneWarGame::bg2roll)),NULL));
38
return true;
39 }
40 
41 void PlaneWarGame::bg1roll(){
42
//运动出屏幕重设位置,运动
43
CCSprite * bg = (CCSprite *)getChildByTag(11);
44
bg-&setPosition(ccp(0,1440));
45
CCAction* seq = CCSequence::actions(
46
CCMoveBy::actionWithDuration(20,ccp(0,-1440)),
47
CCCallFunc::actionWithTarget(this, callfunc_selector(PlaneWarGame::bg1roll)),NULL);
48
bg-&runAction(seq);
49 }
50 
51 void PlaneWarGame::bg2roll(){
52
//运动出屏幕重设位置,运动
53
CCSprite * bg = (CCSprite *)getChildByTag(12);
54
bg-&setPosition(ccp(0,1440));
55
CCAction* seq = CCSequence::actions(
56
CCMoveBy::actionWithDuration(20,ccp(0,-1440)),
57
CCCallFunc::actionWithTarget(this, callfunc_selector(PlaneWarGame::bg2roll)),NULL);
58
bg-&runAction(seq);
59 }

 初始化游戏背景时,需要注意的是:要做出飞机向上走的视觉效果,就要把背景向下滚动,这里使用两个背景bg1和bg2,大小分别为屏幕大小。初始bg1在屏幕内,bg2在屏幕上方,两个同事向下运动;当bg1刚刚运动到屏幕外,bg2刚好盖住屏幕,bg1挪到屏幕上方向下运动...循环操作,就能做出循环滚动的背景效果了。
 
3.子弹的处理

 1 // 确定子弹类型
 2 void PlaneWarGame::shoot(float dt)
 3 {
 4
if (_isOver)return;
 5
if(_player==NULL) return;
 6 
 7
if(_player-&_bulletKind == BK_SINGLE)
 8
CCSprite *bullet = CCSprite::spriteWithFile(
10
"planewar/plane.png", CCRectMake(112,2,9,17));
11
addBullet(bullet,_player-&getPlayerPt());
12
}else if (_player-&_bulletKind == BK_DOUBLE)
13
CCSprite *bullet = CCSprite::spriteWithFile(
15
"planewar/plane.png", CCRectMake(66,238,8,15));
16
addBullet(bullet,ccp(_player-&getPlayerPt().x-20,_player-&getPlayerPt().y));
17
CCSprite *bullet1 = CCSprite::spriteWithFile(
18
"planewar/plane.png", CCRectMake(66,238,8,15));
19
addBullet(bullet1,ccp(_player-&getPlayerPt().x+20,_player-&getPlayerPt().y));
20
}
21 }
22 // 添加子弹
23 void PlaneWarGame::addBullet(CCSprite* bullet, CCPoint pt)
24 {
bullet-&setPosition(pt);
26
this-&addChild(bullet);
27 
28
bullet-&runAction( CCSequence::actions(
29
CCMoveTo::actionWithDuration(0.5, ccp(pt.x,_size.height+bullet-&getContentSize().height/2)),
30
CCCallFuncN::actionWithTarget(this,callfuncN_selector(PlaneWarGame::spriteMoveFinished)), 
31
NULL) );
32 
33
bullet-&setTag(1);
34
_bullets-&addObject(bullet);
35 }
36 // 回收
37 void PlaneWarGame::spriteMoveFinished(CCNode* sender)
38 {
39
CCSprite *sprite = (CCSprite *)
40
this-&removeChild(sprite, true);
41
if (sprite-&getTag()==1)//子弹
42
_bullets-&removeObject(sprite);
43 }

 吃道具可改变子弹类型。子弹的回收方式:从飞机坐标处出发,运动到屏幕外被回收。道具的处理类似。
 
4.设置触摸/鼠标点击控制玩家角色的移动

 1 bool PlaneWarGame::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
 2 {
 3
if(_player==NULL) return false;
 4 
 5
CCPoint pt = CCDirector::sharedDirector()-&convertToGL(
 6
pTouch-&locationInView(pTouch-&view()));
 7 
 8
CCRect rt = _player-&getRect();
 9
if (CCRect::CCRectContainsPoint(rt,pt))
10
_player-&_isDragEnabled = true;
11
return true;
12 }
13 
14 void PlaneWarGame::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
15 {
16
if(_player==NULL) return;
17 
18
CCSize size = CCDirector::sharedDirector()-&getWinSize();
19
CCPoint pt = CCDirector::sharedDirector()-&convertToGL(
20
pTouch-&locationInView(pTouch-&view()));
21
CCRect rt = CCRect(0,0,size.width,size.height);
23 
24
if (_player-&_isDragEnabled && CCRect::CCRectContainsPoint(rt,pt))
25
_player-&setPlayerPt(pt);
26 }
27 
28 void PlaneWarGame::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
29 {
30
_player-&_isDragEnabled = false;
31 }

这里重写3个虚函数。移动角色的方式:触摸/鼠标按下时,如果点击位置在角色上,将角色可被拖拽状态置为触摸/鼠标移动时,根据角色的可被拖拽状态和屏幕范围确定是否移动;触摸/鼠标弹起时,将角色的可被拖拽状态恢复为false。
 
5.碰撞检测

1 void PlaneWarGame::updateGame(float dt)
CCArray *bulletsToDelete = CCArray::array();
CCObject* it = NULL;
CCObject* jt = NULL;
if(_player==NULL) return;
CCRect playerRect = _player-&getRect();
 10
// 己方飞机和敌方飞机的碰撞
 11
CCARRAY_FOREACH(_enemys, jt)
 12
EnemySprite *enemy = dynamic_cast&EnemySprite*&(jt);
 14
if (!enemy-&isNull() && CCRect::CCRectIntersectsRect(playerRect, enemy-&getRect()))
 15
_player-&die();
 17
gameover(false);
 18
return;
 19
}
 21 
 22
//////////////////////////////////////////////////////////////////////////
 23
// 道具和角色的碰撞检测
 24
CCSprite* prop = (CCSprite*)getChildByTag(8);//子弹
 25
if (NULL != prop)
 26
CCRect propRect = CCRectMake(
 28
prop-&getPosition().x - (prop-&getContentSize().width/2),
 29
prop-&getPosition().y - (prop-&getContentSize().height/2),
 30
prop-&getContentSize().width,
 31
prop-&getContentSize().height);
 32
if (CCRect::CCRectIntersectsRect(playerRect, propRect))
 33
_player-&_bulletKind = BK_DOUBLE;
 35
removeChild(prop,true);
 36
CocosDenshion::SimpleAudioEngine::sharedEngine()-&
 37
playEffect("planewar/get_double_laser.wav",false);
 38
CCSprite* prop1 = (CCSprite*)getChildByTag(9);//炸弹
 41
if (NULL != prop1)
 42
CCRect prop1Rect = CCRectMake(
 44
prop1-&getPosition().x - (prop1-&getContentSize().width/2),
 45
prop1-&getPosition().y - (prop1-&getContentSize().height/2),
 46
prop1-&getContentSize().width,
 47
prop1-&getContentSize().height);
 48
if (CCRect::CCRectIntersectsRect(playerRect, prop1Rect))
 49
_player-&_bombCount++;
 51
removeChild(prop1,true);
 52
CocosDenshion::SimpleAudioEngine::sharedEngine()-&
 53
playEffect("planewar/get_bomb.wav",false);
 54
}
 56 
 57
//////////////////////////////////////////////////////////////////////////
 58
// 子弹和敌机的碰撞检测
 59
CCARRAY_FOREACH(_bullets, it)
 60
for (int i=0; i&_bullets-&count(); i++)
 61
CCSprite *bullet = dynamic_cast&CCSprite*&(_bullets-&objectAtIndex(i));
 63
CCRect bulletRect = CCRectMake(
 64
bullet-&getPosition().x - (bullet-&getContentSize().width/2),
 65
bullet-&getPosition().y - (bullet-&getContentSize().height/2),
 66
bullet-&getContentSize().width,
 67
bullet-&getContentSize().height);
 68 
 69
CCArray* enemysToDelete =CCArray::array();
 70 
 71
CCARRAY_FOREACH(_enemys, jt)
 72
EnemySprite *enemy = dynamic_cast&EnemySprite*&(jt);
 74
if (!enemy-&_die && CCRect::CCRectIntersectsRect(bulletRect, enemy-&getRect()))
 75
if (enemy-&_hp&0)
 77
enemy-&_hp--;
 79
//bulletsToDelete-&addObject(bullet);
 80
_bullets-&removeObject(bullet);
 81
removeChild(bullet,true);
 82
else if (enemy-&_hp&=0)
 84
//bulletsToDelete-&addObject(bullet);
 86
_bullets-&removeObject(bullet);
 87
removeChild(bullet,true);
 88
enemysToDelete-&addObject(enemy);
 89
}
 92 
 93
CCARRAY_FOREACH(enemysToDelete, jt)
 94
EnemySprite *enemy = dynamic_cast&EnemySprite*&(jt);
 96
enemy-&_die = true;
 97
enemy-&die();
 98
_bulletsDestroyed++;
 99
}
100 
101
enemysToDelete-&release();
102
}
103 
104
// 释放已死亡的子弹
105
CCARRAY_FOREACH(bulletsToDelete, it)
106
CCSprite* projectile = dynamic_cast&CCSprite*&(it);
108
_bullets-&removeObject(projectile);
109
this-&removeChild(projectile, true);
110
bulletsToDelete-&release();
112 }


 碰撞检测使用最简单的矩形检测。
 
6.玩家角色的添加和操作

1 void PlaySprite::onEnter()
CCNode::onEnter();
CCSize size = CCDirector::sharedDirector()-&getWinSize();
_sprite = CCSprite::spriteWithFile("planewar/hero1.png");
_sprite-&setContentSize(CCSize(62,68));
_sprite-&setPosition( ccp(size.width/2,_sprite-&getContentSize().height/2) );
addChild(_sprite,10);
 10 
 11
CCAnimation * animation = CCAnimation::animation();
 12
animation-&addFrameWithFileName("planewar/hero1.png");
 13
animation-&addFrameWithFileName("planewar/hero2.png");
 14
CCAction* action = CCRepeatForever::actionWithAction(
 15
CCAnimate::actionWithDuration(0.1f, animation, false));
 16
action-&setTag(11);
 17
_sprite-&runAction(action);
 18 
 19
// 调度器
 20
schedule( schedule_selector(PlaySprite::move), 0.002 );
 21 }
 22 
 23 CCRect PlaySprite::getRect()
 24 {
 25
if (_sprite!=NULL)
 26
return CCRect(
 27
_sprite-&getPosition().x - (_sprite-&getContentSize().width/2),
 28
_sprite-&getPosition().y - (_sprite-&getContentSize().height/2),
 29
_sprite-&getContentSize().width,
 30
_sprite-&getContentSize().height);
 31 }

 32 
 33 CCPoint PlaySprite::getPlayerPt()
 34 {
 35
if (_sprite!=NULL)
 36
return _sprite-&getPosition();
 37 }
 38 
 39 void PlaySprite::setPlayerPt(CCPoint pt)
 40 {
 41
if (_sprite!=NULL)
 42
return _sprite-&setPosition(pt);
 43 }
 44 
 45 void
PlaySprite::setMoveMode( UINT
message, WPARAM
wParam) 
 46 {
 47
if (message == WM_KEYDOWN)
 48
{// 控制飞机移动
 49
if (wParam == VK_UP)
 50
_mode = MM_UP;
 51
else if (wParam == VK_DOWN)
 52
_mode = MM_DOWN;
 53
else if (wParam == VK_LEFT)
 54
_mode = MM_LEFT;
 55
else if (wParam == VK_RIGHT)
 56
_mode = MM_RIGHT;
 57
}else if (message == WM_KEYUP)
 58
if (wParam == VK_UP || wParam == VK_DOWN ||wParam == VK_LEFT||wParam == VK_RIGHT)
 60
_mode = MM_NONE;
 61
}
 62 }
 63 
 64 void PlaySprite::move(float dt)
 65 {
 66
CCSize winSize = CCDirector::sharedDirector()-&getWinSize();
 67 
 68
switch(_mode)
 69
case MM_NONE:
 71
break;
 72
case MM_UP:
 73
if (getPlayerPt().y&winSize.height)
 74
setPlayerPt(ccp(getPlayerPt().x,getPlayerPt().y+1));
 75
break;
 76
case MM_DOWN:
 77
if (getPlayerPt().y&0)
 78
setPlayerPt(ccp(getPlayerPt().x,getPlayerPt().y-1));
 79
break;
 80
case MM_LEFT:
 81
if (getPlayerPt().x&0)
 82
setPlayerPt(ccp(getPlayerPt().x-1,getPlayerPt().y));
 83
break;
 84
MM_RIGHT:
 85
if (getPlayerPt().x&winSize.width)
 86
setPlayerPt(ccp(getPlayerPt().x+1,getPlayerPt().y));
 87
break;
 88
}
 89 }
 90 
 91 void PlaySprite::die()
 92 {
 93
if (_sprite==NULL)return;
 94 
 95
_sprite-&stopActionByTag(11);
 96
CCAnimation * animation = CCAnimation::animation();
 97
animation-&addFrameWithFileName("planewar/hero_blowup_n1.png");
 98
animation-&addFrameWithFileName("planewar/hero_blowup_n2.png");
 99
animation-&addFrameWithFileName("planewar/hero_blowup_n3.png");
100
animation-&addFrameWithFileName("planewar/hero_blowup_n4.png");
101
_sprite-&runAction(CCSequence::actions(
102
CCAnimate::actionWithDuration(0.1f, animation, false),
103
CCCallFunc::actionWithTarget(this, callfunc_selector(PlaySprite::destroy)),NULL));
104 }
105 
106 void PlaySprite::destroy()
107 {
108
if (_sprite==NULL)return;
109
removeChild(_sprite,true);
111
_sprite = NULL;
112 }

玩家角色类是派生自CCNode类,用组合的方式包含一个CCSprite类的成员对象,在玩家角色类内部封装对精灵的操作。
重写onEnter函数初始化_sprite成员,设置位置、大小、图片和帧动画等。
玩家的方向键控制移动和鼠标拖拽移动方式类似,在操作时设置移动状态,在schedule定时调用的函数move中根据移动状态来移动玩家角色。
关于碰撞之后的动画和销毁,参照上面的die和destroy函数,对象被碰撞时调用die函数运行爆炸的帧动画,动画结束后自动调用destroy函数销毁对象。
敌机对象的操作和玩家角色类似。
 
四、完成效果图
经过不到一周的时间,从什么都没有,到游戏正常运行、功能完整,体会了cocos2dx的调用机制。
下面是运行效果图:



 
如果实现中有什么问题,欢迎大家在评论中指教!
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 飞机大战js代码 的文章

 

随机推荐