制作《Stick Hero》游戏相关代码

本文是依据Cocos2d-x 3.4制作休闲游戏《Stick Hero》系列教程文章所完成的

直接来代码:

AppDelegate.h

 1 #ifndef  _APP_DELEGATE_H_
 2 #define  _APP_DELEGATE_H_
 3
 4 #include "cocos2d.h"
 5
 6 /**
 7 @brief    The cocos2d Application.
 8
 9 The reason for implement as private inheritance is to hide some interface call by Director.
10 */
11 class  AppDelegate : private cocos2d::Application
12 {
13 public:
14     AppDelegate();
15     virtual ~AppDelegate();
16
17     /**
18     @brief    Implement Director and Scene init code here.
19     @return true    Initialize success, app continue.
20     @return false   Initialize failed, app terminate.
21     */
22     virtual bool applicationDidFinishLaunching();
23
24     /**
25     @brief  The function be called when the application enter background
26     @param  the pointer of the application
27     */
28     virtual void applicationDidEnterBackground();
29
30     /**
31     @brief  The function be called when the application enter foreground
32     @param  the pointer of the application
33     */
34     virtual void applicationWillEnterForeground();
35 };
36
37 #endif // _APP_DELEGATE_H_

AppDelegate.cpp

 1 #include "AppDelegate.h"
 2 #include "HelloWorldScene.h"
 3 #include "WelcomeScene.h"
 4
 5 USING_NS_CC;
 6
 7 AppDelegate::AppDelegate() {
 8
 9 }
10
11 AppDelegate::~AppDelegate()
12 {
13 }
14
15 bool AppDelegate::applicationDidFinishLaunching() {
16     // initialize director
17     auto director = Director::getInstance();
18     auto glview = director->getOpenGLView();
19     if(!glview) {
20         glview = GLView::create("My Game");
21         director->setOpenGLView(glview);
22     }
23
24     // 添加设计分辨率适配,参数,(设计分辨率的宽度,高度,分辨率适配的方式)
25     glview->setDesignResolutionSize(1080, 1980, ResolutionPolicy::FIXED_WIDTH);
26
27     // turn on display FPS
28     director->setDisplayStats(true);
29
30     // set FPS. the default value is 1.0/60 if you don‘t call this
31     director->setAnimationInterval(1.0 / 60);
32
33     // create a scene. it‘s an autorelease object
34     //auto scene = HelloWorld::createScene();
35     auto scene = WelcomeScene::create();
36
37     // run
38     director->runWithScene(scene);
39
40     return true;
41 }
42
43 // This function will be called when the app is inactive. When comes a phone call,it‘s be invoked too
44 void AppDelegate::applicationDidEnterBackground() {
45     Director::getInstance()->stopAnimation();
46
47     // if you use SimpleAudioEngine, it must be pause
48     // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
49 }
50
51 // this function will be called when the app is active again
52 void AppDelegate::applicationWillEnterForeground() {
53     Director::getInstance()->startAnimation();
54
55     // if you use SimpleAudioEngine, it must resume here
56     // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
57 }

Resource.h

 1 #ifndef __Resource_H__
 2 #define __Resource_H__
 3
 4 // 游戏欢迎界面 (WelcomScene) 时的背景图片
 5 #define welcome_background_image0 "image/bg/bg1.jpg"
 6 #define welcome_background_image1 "image/bg/bg2.jpg"
 7 #define welcome_background_image2 "image/bg/bg3.jpg"
 8 #define welcome_background_image3 "image/bg/bg4.jpg"
 9 #define welcome_background_image4 "image/bg/bg5.jpg"
10
11 // 游戏欢迎界面 (WelcomeScene) 的标题图片
12 #define welcome_title_image "image/uires_1.png"
13
14 // 游戏欢迎界面 (WelcomeScene) 的开始菜单图片
15 #define welcome_start_image "image/uires_2.png"
16
17 // 游戏欢迎界面 (WelcomeScene) 的平台图片
18 #define welcome_floor_image "image/stage1.png"
19
20 // 游戏人物 Hero 的图片
21 #define hero1 "image/anim1/stay1.png"
22
23 // 棍子 stick 的图片
24 #define stick_image "image/stick1.png"
25
26
27 #endif __Resource_H__

WelcomeScene.h

 1 #ifndef __Welcome_Scene_H__
 2 #define __Welcome_Scene_H__
 3
 4 #include "cocos2d.h"
 5
 6 USING_NS_CC;
 7
 8 class WelcomeScene :public Scene{
 9
10 public:
11
12     WelcomeScene();
13     ~WelcomeScene();
14
15     virtual bool init();
16
17     CREATE_FUNC(WelcomeScene);
18
19
20 };
21
22
23 #endif __Welcome_Scene_H__

WelcomeScene.cpp

 1 #include "WelcomeScene.h"
 2 #include "BackgroundLayer.h"
 3 #include "Resource.h"
 4
 5 WelcomeScene::WelcomeScene(){
 6
 7 }
 8
 9 WelcomeScene::~WelcomeScene(){
10
11 }
12
13 bool WelcomeScene::init(){
14
15     if (!Scene::init()){
16         return false;
17     }
18
19     Size visibleSize = Director::getInstance()->getVisibleSize();
20
21
22
23     BackgroundLayer* _backgroundLayer = BackgroundLayer::create();
24     this->addChild(_backgroundLayer, 1, 1);
25
26     return true;
27 }

BackgroundLayer.h

  1 #ifndef __Background_Layer_H__
  2 #define __Background_Layer_H__
  3
  4 #include "cocos2d.h"
  5 #include "Resource.h"
  6 #include "Player.h"
  7 #include "GameOverLayer.h"
  8
  9 USING_NS_CC;
 10
 11 class BackgroundLayer :public Layer{
 12
 13 public:
 14
 15     BackgroundLayer();
 16     ~BackgroundLayer();
 17
 18     virtual bool init();
 19
 20     CREATE_FUNC(BackgroundLayer);
 21
 22     void BGImageMove(float);
 23
 24     // 开始菜单按钮的回调函数
 25     void start(Ref *pSender);
 26
 27     void addStage();
 28
 29     void stageMove();
 30
 31     // 单点触摸事件回调函数
 32     virtual bool onTouchBegan(Touch *touch, Event *unused_event);
 33     virtual void onTouchMoved(Touch *touch, Event *unused_event);
 34     virtual void onTouchEnded(Touch *touch, Event *unused_event);
 35
 36     // 将棍子添加到视线中
 37     void addStick();
 38     // 将棍子加长
 39     void stickLength(float);
 40     void stopStick();
 41
 42     // 旋转棍子
 43     void rotateStickAndGo();
 44
 45     void stageAndPlayerMove();
 46
 47     void resetStick();
 48
 49     void initStick();
 50
 51     void playerMoveToNextStage();
 52
 53     void PlayerDown();
 54     void PlayerMove();
 55
 56 private:
 57
 58     // 可视区域大小
 59     Size visibleSize;
 60     // 背景
 61     Sprite* _imageOne;
 62     Sprite* _imageTwo;
 63     // 开始按钮菜单
 64     MenuItemSprite* _startButton;
 65     Menu* _menu;
 66     // 标题
 67     Sprite* _gameTitle;
 68
 69     // 英雄所站的平台
 70     Sprite *stage_sprite[3];    // 存储平台数据
 71     int stage_number;           // 标识,为了方便计算
 72
 73     // 单点触摸事件
 74     EventListenerTouchOneByOne *_touchListener;
 75     // 简单的状态机
 76     bool isStart;
 77
 78     // 英雄
 79     Player _player;
 80
 81     // 棍子
 82     Sprite *_stick;
 83
 84     // 存储我们棍子的长度
 85     float touchLength;
 86
 87     int nowStage;
 88     int lastStage;
 89     int nextStage;
 90
 91     Vec2 stickPoint;
 92
 93     GameOverLayer* over;
 94
 95     float destLengthMin;
 96
 97     float destLengthMax;
 98 };
 99
100
101
102 #endif __Background_Layer_H__

BackgroundLayer.cpp

  1 #include "BackgroundLayer.h"
  2
  3
  4 BackgroundLayer::BackgroundLayer():
  5 stage_number(1),
  6 isStart(false),
  7 lastStage(2),
  8 nowStage(0),
  9 nextStage(1){
 10
 11 }
 12
 13 BackgroundLayer::~BackgroundLayer(){
 14
 15 }
 16
 17 bool BackgroundLayer::init(){
 18
 19     if (!Layer::init()){
 20         return false;
 21     }
 22
 23     visibleSize = Director::getInstance()->getVisibleSize();
 24
 25     /*****************    背景图片随机显示    ***************/
 26
 27     // 随机生成 5 种背景图片
 28     srand(time(0));    // 随机生成数种子
 29     int _bgImageNumber = rand() % 5;
 30     log("%d", _bgImageNumber);
 31     switch (_bgImageNumber){
 32
 33     case 0:
 34         _imageOne = Sprite::create(welcome_background_image0);
 35         _imageTwo = Sprite::create(welcome_background_image0);
 36         break;
 37
 38     case 1:
 39         _imageOne = Sprite::create(welcome_background_image1);
 40         _imageTwo = Sprite::create(welcome_background_image1);
 41         break;
 42
 43     case 2:
 44         _imageOne = Sprite::create(welcome_background_image2);
 45         _imageTwo = Sprite::create(welcome_background_image2);
 46         break;
 47
 48     case 3:
 49         _imageOne = Sprite::create(welcome_background_image3);
 50         _imageTwo = Sprite::create(welcome_background_image3);
 51         break;
 52
 53     case 4:
 54         _imageOne = Sprite::create(welcome_background_image4);
 55         _imageTwo = Sprite::create(welcome_background_image4);
 56         break;
 57
 58     default:
 59         break;
 60
 61     }
 62
 63     _imageOne->setPosition(visibleSize.width / 2, visibleSize.height / 2);
 64     _imageTwo->setPosition(visibleSize.width / 2 + _imageTwo->getContentSize().width, visibleSize.height / 2);
 65     this->addChild(_imageOne, 1);
 66     this->addChild(_imageTwo, 1);
 67
 68     /*****************    背景图片随机显示    ***************/
 69
 70     /*****************        添加标题        ***************/
 71
 72     _gameTitle = Sprite::create(welcome_title_image);
 73     _gameTitle->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 5 * 4));
 74     this->addChild(_gameTitle, 2);
 75
 76     /*****************        添加标题        ***************/
 77
 78
 79     /*****************      添加开始按钮      ***************/
 80
 81     _startButton = MenuItemSprite::create(Sprite::create(welcome_start_image), Sprite::create(welcome_start_image), NULL, this, menu_selector(BackgroundLayer::start));
 82     _startButton->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 + 10));
 83     // 按钮上下来回移动的效果
 84     MoveTo *startButtonMoveDown = MoveTo::create(2.0f, Vec2(visibleSize.width / 2, visibleSize.height / 2 - 20));
 85     MoveTo *startButtonMoveUp = MoveTo::create(2.0f, Vec2(visibleSize.width / 2, visibleSize.height / 2 + 20));
 86     Sequence *startButtonSequence = Sequence::create(startButtonMoveDown, startButtonMoveUp, nullptr);
 87     RepeatForever *startButtonRepeatForever = RepeatForever::create(startButtonSequence);
 88     _startButton->runAction(startButtonRepeatForever);
 89     _menu = Menu::create(_startButton, nullptr);
 90     _menu->setPosition(Vec2::ZERO);
 91     this->addChild(_menu, 2);
 92
 93
 94     /*****************      添加开始按钮      ***************/
 95
 96     /*****************   添加英雄所站的平台   ***************/
 97
 98     // 对所有平台进行一次初始化,
 99     // 并且把第一个平台显示在屏幕中心
100
101     for (int i = 0; i < 3; i++){
102         stage_sprite[i] = Sprite::create(welcome_floor_image);
103     }
104     // 在 x轴 方向扩大30倍
105     stage_sprite[0]->setScaleX(30);
106     // 设置另两个平台的位置
107     for (int i = 1; i < 3; i++){
108         stage_sprite[i]->setPosition(Vec2(visibleSize.width + stage_sprite[i]->getScaleX() * stage_sprite[i]->getContentSize().width, stage_sprite[i]->getContentSize().height / 2));
109     }
110     stage_sprite[0]->setPosition(Vec2(visibleSize.width / 2, stage_sprite[0]->getContentSize().height / 4));
111     for (int i = 0; i < 3; i++){
112         this->addChild(stage_sprite[i], 3);
113     }
114
115     /*****************   添加英雄所站的平台   ***************/
116
117
118     /*****************      单点触摸事件      ***************/
119
120     _touchListener = EventListenerTouchOneByOne::create();
121     _touchListener->setSwallowTouches(true);    // true 表示不向下传递触摸事件
122     _touchListener->onTouchBegan = CC_CALLBACK_2(BackgroundLayer::onTouchBegan, this);
123     _touchListener->onTouchMoved = CC_CALLBACK_2(BackgroundLayer::onTouchMoved, this);
124     _touchListener->onTouchEnded = CC_CALLBACK_2(BackgroundLayer::onTouchEnded, this);
125     _eventDispatcher->addEventListenerWithSceneGraphPriority(_touchListener, this);
126
127     /*****************      单点触摸事件      ***************/
128
129
130     /*****************        添加英雄        ***************/
131
132     //// 初始化主角
133     //_player.init();
134     //// 先获取到我们Player对象中的Sprite对象,然后在对Sprite对象进行坐标设置。设置的位置是在我们平台之上
135     //_player.getSprite()->setPosition(Vec2(visibleSize.width / 2, stage_sprite[0]->getContentSize().height / 4 * 3));
136     //// 将我们Player对象中的Sprite对象加入到场景中
137     //this->addChild(_player.getSprite(), 10);
138
139
140     _player.init();
141     _player.setPosition(Vec2(visibleSize.width / 2, stage_sprite[0]->getContentSize().height / 4 * 3));
142     this->addChild(_player.getSprite(), 5);
143     _player.stay();
144
145     /*****************        添加英雄        ***************/
146
147
148     /*****************        添加棍子        ***************/
149
150     _stick = Sprite::create(stick_image);
151     // 这里我们先把锚点设置为图片的正下方,这样我们也方便我们设置它的位置
152     _stick->setAnchorPoint(Vec2(0.5, 0));
153     // 在我们不需要用到这个棍子的时候,我们先把它设置在屏幕外面
154     _stick->setPosition(Vec2(-_stick->getContentSize().width, -_stick->getContentSize().height));
155     this->addChild(_stick, 15);
156
157     /*****************        添加棍子        ***************/
158
159
160
161     return true;
162 }
163
164 void BackgroundLayer::BGImageMove(float){
165
166 }
167
168 void BackgroundLayer::start(Ref *pSender){
169
170     // 设置动画,标题和按钮向上飞出屏幕,平台移动到指定位置
171     MoveTo *menuMove = MoveTo::create(0.8f, Vec2(visibleSize.width / 2, visibleSize.height + _menu->getContentSize().height));
172     MoveTo *gameTitleMove = MoveTo::create(0.8f, Vec2(visibleSize.width / 2, visibleSize.height + _gameTitle->getContentSize().height));
173     _menu->runAction(menuMove);
174     _gameTitle->runAction(gameTitleMove);
175     MoveTo *gamefloor = MoveTo::create(1.0f, Vec2(100, stage_sprite[0]->getContentSize().height / 4));
176     stage_sprite[0]->runAction(Sequence::create(gamefloor, CallFunc::create([this](){
177         // 移除按钮
178         this->removeChild(_menu);
179         log("remove menu");
180         // 移除标题
181         this->removeChild(_gameTitle);
182         log("remove gametitle");
183     }),nullptr));
184     addStage();
185     isStart = true;
186     _player.start(Vec2(100, stage_sprite[0]->getContentSize().height / 4 * 3));
187 }
188
189 void BackgroundLayer::stageMove(){
190
191     /***********************************************
192     *
193     * 开始的三行代码是用来得到当前对应的平台编号和前后平台的编号,
194     * 这里一定要注意我们自己的编号是[1,3],而数组的编号是[0,2],注意逻辑关系
195     *
196     *************************************************/
197
198     nowStage = stage_number == 0 ? 2 : stage_number - 1;
199     lastStage = nowStage == 0 ? 2 : (nowStage - 1);
200     nextStage = nowStage == 2 ? 0 : (nowStage + 1);
201     MoveTo *nowStageMove = MoveTo::create(1.0f, Vec2(100, stage_sprite[0]->getContentSize().height / 4));
202     stage_sprite[nowStage]->runAction(nowStageMove);
203     MoveTo *lastStageMove = MoveTo::create(1.0f, Vec2(-stage_sprite[lastStage]->getContentSize().width * stage_sprite[lastStage]->getScaleX(), stage_sprite[0]->getContentSize().height / 4));
204     stage_sprite[lastStage]->runAction(lastStageMove);
205     addStage();
206     initStick();
207
208 }
209
210 void BackgroundLayer::addStage(){
211
212     /*****************************************************
213     *
214     * setScale 并不会改变它本来的宽度和高度,你必须在你获取长度或者宽度之后在乘以你设置的倍数。
215     * tage_number我们的数组编号是[0,2],初始的时候我们把它的值设置为1,表示第一个平台,
216     * 当我们每加入一个平台这个数就+1,也就是我们接下来控制的平台,
217     * 当这个数==2时,+1之后应该是回到第一个平台的编号,所以这里写一个逻辑判断完成这个功能。
218     *
219     *****************************************************/
220
221     stage_sprite[stage_number]->setScaleX(CCRANDOM_0_1() * 40);
222     stage_sprite[stage_number]->setPosition(Vec2(visibleSize.width + stage_sprite[stage_number]->getScaleX() * stage_sprite[stage_number]->getContentSize().width, stage_sprite[stage_number]->getContentSize().height / 4));
223     MoveTo *stageMove = MoveTo::create(0.5f, Vec2(visibleSize.width / 2 + CCRANDOM_0_1() * visibleSize.width / 3, stage_sprite[stage_number]->getContentSize().height / 4));
224     stage_sprite[stage_number]->runAction(stageMove);
225     if (stage_number + 1 <= 2){
226         stage_number += 1;
227     }
228     else{
229         stage_number = 0;
230     }
231 }
232
233 bool BackgroundLayer::onTouchBegan(Touch *touch, Event *unused_event){
234     if (isStart){
235         //stageMove();
236         addStick();
237     }
238     return true;
239 }
240
241 void BackgroundLayer::onTouchMoved(Touch *touch, Event *unused_event){
242
243 }
244
245 void BackgroundLayer::onTouchEnded(Touch *touch, Event *unused_event){
246
247     stopStick();
248 }
249
250 void BackgroundLayer::addStick(){
251     //stageMove();
252
253     // 棍子设置在平台的右上角那个点上了
254     _stick->setPosition(Vec2(stage_sprite[nowStage]->getPosition().x + stage_sprite[nowStage]->getContentSize().width *
255         stage_sprite[nowStage]->getScaleX() / 2, stage_sprite[nowStage]->getContentSize().height / 4 * 3));
256     //_stick->setPosition(stickPoint);
257     //_stick->setPosition(Vec2(stage_sprite[stage_number]->getPosition().x + stage_sprite[stage_number]->getContentSize().width * stage_sprite[stage_number]->getScaleX() / 2, stage_sprite[stage_number]->getContentSize().height / 4 * 3));
258     this->schedule(schedule_selector(BackgroundLayer::stickLength));
259 }
260
261 void BackgroundLayer::stickLength(float){
262
263     _stick->setScaleY(_stick->getScaleY() + 1);
264 }
265
266 void BackgroundLayer::stopStick(){
267
268     // 存储我们棍子的长度
269     touchLength = _stick->getContentSize().height * _stick->getScaleY();
270     this->unschedule(schedule_selector(BackgroundLayer::stickLength));
271     rotateStickAndGo();
272 }
273
274 void BackgroundLayer::rotateStickAndGo(){
275
276     // 算出棍子到中间的平台之间的最小距离(即,计算出到平台前沿的距离)
277     destLengthMin = abs(
278                                 stage_sprite[lastStage]->getPositionX()
279                                 - stage_sprite[nowStage]->getPositionX()
280                                 - stage_sprite[lastStage]->getContentSize().width
281                                 * stage_sprite[lastStage]->getScaleX() / 2
282                                 - stage_sprite[nowStage]->getContentSize().width
283                                 * stage_sprite[nowStage]->getScaleX() / 2
284                             );
285     // 算出棍子到中间的平台之间的最大距离(即,计算出到平台后沿的距离)
286     destLengthMax = destLengthMin + stage_sprite[nowStage]->getContentSize().width * stage_sprite[nowStage]->getScaleX();
287     // CallFunc是一个动作类回调函数,
288     // 用这样一个回调可以连接不同精灵同时或者按顺序进行一些动作,这里我们设置棍子和主角两个对象的动画
289     CallFunc *moveToNext = CallFunc::create(CC_CALLBACK_0(BackgroundLayer::playerMoveToNextStage, this));
290     RotateTo *stickRotate = RotateTo::create(1.0f, 90);
291     Sequence *gogo = Sequence::create(stickRotate, moveToNext, NULL);
292
293     RotateTo *stickRotateDown = RotateTo::create(1.0f, 180);
294     CallFunc* GoCallBack = CallFunc::create(CC_CALLBACK_0(BackgroundLayer::PlayerMove, this));
295     Sequence* StickDown = Sequence::create(stickRotateDown, GoCallBack, NULL);
296
297     // 判断语句判断我们计算出的棍子长度是不是在我们最大距离和最小距离之间,
298     // 若果是就选择90度,反正则旋转180度。
299     log("%f", touchLength);
300     log("%f", destLengthMin);
301     log("%f", destLengthMax);
302
303
304     if (touchLength >= destLengthMin && touchLength <= destLengthMax){
305         _stick->runAction(gogo);
306     }else    if (touchLength < destLengthMin || touchLength > destLengthMax){
307         _stick->runAction(StickDown);
308     }
309 }
310
311 void BackgroundLayer::stageAndPlayerMove(){
312
313     // 简单说明一下计算逻辑,
314     // 我们每个平台的x坐标都会移动到100这个点上,
315     // 所以我们只需要加上这个平台一半的宽度,
316     // 再减去主角的一半的宽度是因为主角需要站到平台上,
317     // 这样才看着和谐点
318     Vec2 dest;
319     dest.x = 100 + stage_sprite[nowStage]->getContentSize().width * stage_sprite[nowStage]->getScaleX() / 2 - _player.getSprite()->getContentSize().width / 2 - 5;
320     dest.y = stage_sprite[nowStage]->getContentSize().height / 4 * 3;
321     MoveTo *playermove = MoveTo::create(1.0f, dest);
322     _player.getSprite()->runAction(playermove);
323     stageMove();
324     resetStick();
325 }
326
327 void BackgroundLayer::resetStick(){
328
329     // 重新设置的角度属性,这样下一次使用的它依然是向上的
330     _stick->setRotation(0);
331     // 将它移动到屏幕之外
332     _stick->setPosition(-_stick->getContentSize().width, -_stick->getContentSize().height);
333     // 重新设置了长度属性
334     _stick->setScaleY(1);
335 }
336
337 void BackgroundLayer::initStick(){
338
339     stickPoint.x = 100 + stage_sprite[nowStage]->getContentSize().width*stage_sprite[nowStage]->getScaleX() / 2;
340     stickPoint.y = stage_sprite[nowStage]->getContentSize().height;
341 }
342
343 void BackgroundLayer::playerMoveToNextStage(){
344
345     //_player.getSprite()->runAction(MoveBy::create(1.0f, Vec2(destLengthMin + stage_sprite[nowStage]->getContentSize().width * stage_sprite[nowStage]->getScaleX() / 2, 0)));
346
347     stageAndPlayerMove();
348 }
349
350 void BackgroundLayer::PlayerDown()
351 {
352     // 这个函数中,我们实现了落下,简单粗暴一点,我直接设置落下800像素的距离。
353     // 这里我们使用的是MoveBy,提醒一下大家,这个方法和MoveTo是不同的,
354     // 前者是以自己为起点,以提供的Vec2型变量为一个表示方向和长度向量经行移动,
355     // 后者是直接移动的指定的点,都有同样的动画效果,根据情况来使用不同的方法。
356     // 在这里我们顺便加入结束层,
357     // 层上加一个层是一个很常用的做法,没有问题,
358     // 但是在场景上加场景,虽然不会报错,但是会有潜在危险,希望大家不要使用。
359
360     MoveBy* Down = MoveBy::create(1.0f, Vec2(0, -800));
361     _player.getSprite()->runAction(Down);
362     over = GameOverLayer::create();
363     this->addChild(over, 8);
364
365 }
366
367 void BackgroundLayer::PlayerMove()
368 {
369     MoveBy* GO = MoveBy::create(1.0f, Vec2(touchLength, 0));
370     CallFunc* DownCallBack = CallFunc::create(CC_CALLBACK_0(BackgroundLayer::PlayerDown, this));
371     Sequence* Goon = Sequence::create(GO, DownCallBack, NULL);
372     _player.getSprite()->runAction(Goon);
373 }

Player.h

 1 #ifndef __Player_Layer_H__
 2 #define __Player_Layer_H__
 3
 4 #include "cocos2d.h"
 5
 6 USING_NS_CC;
 7
 8 class Player{
 9
10 public:
11
12     Player();
13     ~Player();
14     // 初始化
15     void init();
16     // 获取精灵
17     Sprite* getSprite();
18     // 设置位置
19     void setPosition(Vec2);
20     // 走
21     void walk(Vec2);
22     // 开始
23     void stay();
24     // 暂停
25     void stop();
26     // 开始的时候让主角跟着平台走
27     void start(Vec2);
28
29 private:
30
31     Sprite *_player;
32     Animation *_walkAnimation;
33     Animation *_stayAnimation;
34     Animate *_walkAnimate;
35     Animate *_stayAnimat;
36 };
37
38
39 #endif __Player_Layer_H__

Player.cpp

 1 #include "Player.h"
 2 #include "Resource.h"
 3
 4 Player::Player(){
 5
 6 }
 7
 8 Player::~Player(){
 9
10 }
11
12 void Player::init(){
13
14     _player = Sprite::create(hero1);
15     _player->setAnchorPoint(Vec2(0.5, 0));
16
17     /**************************************
18     *
19     * 先创建一个Vector类型的数据,用来存储我们动画的每一帧,而这个Vector中的数据类型为SpriteFrame*,
20     * 在看到循环内,我先定义了一个字符型数组,这个用来存储我们每一帧图片的名字,这样方便后面使用,
21     * 然后是给这个字符型数组赋值,这里用到的时sprintf()方法,再来说一说SpriteFrame::create()这个方法,
22     * 这个方法我们一般是用来提取打包图片的(所有帧都是一张图片上),它根据后面Rect的不同来提取不同位置上的图片块,
23     * 但我们在这里也可以这样使用它,提取不同的图片,Rect的值就是图片的大小。
24     * 接下来是createWithSpriteFrame()方法,这个方法是用来从一个Vector数据中读取数据来创建一个动画(Animation),
25     * 其中的第二个参数是这个动画执行的持续时间。接下来一行的方法是用设置动画执行完时是否回到原始状态,
26     * setLoops()是用来设置这个动画反复执行的次数,
27     * 最后一句是用Animation对象去创建一个Animate对象,Animate才能被runAciton()方法所接收。
28     *
29     ***************************************/
30     Vector<SpriteFrame*> frameVector;
31     for (int i = 1; i <= 5; i++){
32         char pngName[260] = { 0 };
33         sprintf(pngName, "image/anim1/stay%d.png", i);
34         frameVector.pushBack(SpriteFrame::create(pngName, Rect(0, 0, 54, 58)));
35     }
36     _stayAnimation = Animation::createWithSpriteFrames(frameVector, 0.1f);
37     _stayAnimation->setRestoreOriginalFrame(false);
38     _stayAnimation->setLoops(10000);
39     _stayAnimat = Animate::create(_stayAnimation);
40
41     frameVector.clear();
42     for (int i = 1; i <= 5; i++){
43         char pngName[260] = { 0 };
44         sprintf(pngName, "image/anim1/walk%d.png", i);
45         frameVector.pushBack(SpriteFrame::create(pngName, Rect(0, 0, 54, 58)));
46     }
47     _walkAnimation = Animation::createWithSpriteFrames(frameVector, 1);
48     _walkAnimation->setRestoreOriginalFrame(false);
49     _walkAnimation->setLoops(10000);
50     _walkAnimate = Animate::create(_walkAnimation);
51
52 }
53
54 Sprite* Player::getSprite(){
55
56     return _player;
57 }
58
59 void Player::setPosition(Vec2 _pos){
60
61     _player->setPosition(_pos);
62 }
63
64 void Player::stay(){
65
66     _player->runAction(_stayAnimat);
67 }
68
69 void Player::stop(){
70
71     _player->stopAllActions();
72 }
73
74 void Player::walk(Vec2 _dec){
75
76     MoveTo *move = MoveTo::create(1.5f, _dec);
77 }
78
79 void Player::start(Vec2 _dec){
80
81     MoveTo *move = MoveTo::create(1.0f, _dec);
82     _player->runAction(move);
83 }

GameOverLayer.h

 1 #include "cocos2d.h"
 2 USING_NS_CC;
 3
 4 class GameOverLayer
 5     :public Layer
 6 {
 7 public:
 8     GameOverLayer();
 9     ~GameOverLayer();
10     CREATE_FUNC(GameOverLayer);
11     virtual bool init();
12     void ReStart(Ref*);
13 };

GameOverLayer.cpp

 1 #include "GameOverLayer.h"
 2 #include "WelcomeScene.h"
 3
 4 GameOverLayer::GameOverLayer(){
 5
 6 }
 7
 8 GameOverLayer::~GameOverLayer(){
 9
10 }
11
12 bool GameOverLayer::init()
13 {
14     if (!Layer::init())
15     {
16         return false;
17     }
18     Size MyWinSize = Director::getInstance()->getVisibleSize();
19     MenuItemSprite* ReStartBtn = MenuItemSprite::create(Sprite::create("image/uires_5.png"), Sprite::create("image/uires_5.png"), NULL, this, menu_selector(GameOverLayer::ReStart));
20     ReStartBtn->setPosition(MyWinSize.width / 2, MyWinSize.height / 2 + 8);
21     Menu* menu = Menu::create(ReStartBtn, NULL);
22     menu->setPosition(0, 0);
23     this->addChild(menu);
24     return true;
25 }
26
27 void GameOverLayer::ReStart(cocos2d::Ref * _pSender)
28 {
29     WelcomeScene* scene = WelcomeScene::create();
30     Director* pDirector = Director::getInstance();
31     TransitionFade* jump = TransitionFade::create(0.3f, scene);
32     pDirector->replaceScene(jump);
33 }
时间: 2024-10-27 13:20:45

制作《Stick Hero》游戏相关代码的相关文章

H5游戏开发之Stick Hero

自从上次发布一个小恐龙游戏以后,到现在10天了,前后又写了3个游戏,挑了一个感觉比较有挑战的游戏和大家分享一下. 效果演示 这是我模拟一个苹果游戏<stick hero>游戏写的一个小游戏,在这里记录一下,希望大家会喜欢. 一直按下鼠标,会出一根棍子,棍子会变长,小人会根据棍子长度来移动.判断小人是否停留在柱子上,因为放在网上以后,鼠标判断有点卡,请大家见谅. 那我们还是从头开始介绍一下这游戏的开发过程吧. 图片加载 这次的图片加载器是用的<H5手把手教你玛丽游戏>的图片加载器,个

Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

提要 此篇是一个国外教程的翻译,虽然有点老,但是适合新手入门.自己去写代码,debug,布置场景,可以收获到很多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一篇中,我们学会了怎么在Unity中搭建游戏的场景,并且设置模型的物理属性. 在第二篇中,我们学会了怎么在unity中使用脚本,并且创建了大部分的游戏逻辑,包括投球和得分! 在这最后一节中,我们将会为用户创建一个菜单系统,并且和GameController进行交互,我们开始吧. 在设备上测试 到目前为止,

Eclipse SWT开发教程以及一个连连看游戏的代码实现下载

原创整理不易,转载请标明出处:Eclipse SWT开发教程以及一个连连看游戏的代码实现下载 代码下载地址:http://www.zuidaima.com/share/1772672482675712.htm 我在前面讲过:如果讲GUI编程一味只讲各个控件的使用方法,那么纯粹是浪费大家时间,如果出书,那绝对是骗钱的.所以我并不会详细地讲解SWT各个控件的具体使用方法.然而的众所周知,Eclipse的UI界面是建立在SWT基础之上的,如果一字不提SWT,似乎也不大可能.SWT是一个优秀的GUI编程

Java Swing打猎射击游戏编程代码下载

代码下载地址:http://www.zuidaima.com/share/1858069987494912.htm 原文:Java Swing打猎射击游戏编程代码下载 这是一款java swing编写的打猎射击游戏,从这款游戏的编程中,我们可以练习如何进行射击对象的消失及相关按键的监听. 该游戏的一大亮点还是对运动图片的二级缓冲功能,运行时可以感受到非常的流畅,对于想从事游戏编程的人员来说是必须要掌握的一个技能点. 游戏操作:通过鼠标点击野猪和小鸟来是实现击中功能,子弹不足时提示"装载子弹...

css+jQuery制作的文字循环滚动代码

css+jQuery制作的文字循环滚动代码,尺寸只需要在css中调整即可,另外别忘记在function里面修改相关参数 百度网盘下载

用Phaser来制作一个html5游戏——flappy bird (一)

Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希望大家看后也能做出自己的html5游戏.大家可以先点击这里来试玩一下我已经做好的这个游戏,感受一下Phaser的游戏效果,游戏的完整代码我已经放到github上了.支持的浏览器:IE9+.Firefox.Chrome.Opera.Safari以及移动端的能支持html5的浏览器,推荐使用谷歌浏览器,

【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)

在两个月前曾写了一篇<[Unity3D实战]零基础一步一步教你制作跑酷类游戏(1)>,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止.这个坑一直没有时间去填,(虽然也没多少人看啦),今天刚好有时间完成了一个跑酷类游戏的Demo.放上来给有兴趣的朋友看看. Demo源码及对应素材下载:链接:http://pan.baidu.com/s/1i4QkkuD 密码:p04w 游戏简要说明 游戏类型:跑酷类游戏(Demo,非完整游戏) 操作方式:左右方向键(可自己移植到手

Python制作的射击游戏

如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 你有没有想过电脑游戏是怎样制作出来的?其实它没有你想象的那样复杂! 在这个教程里,你要学做一个叫<兔子和獾>的塔防游戏,兔子作为英雄,需要在城堡里抵御獾的进攻. 为了写这个游戏的代码,你将会用Python.好吧,我不是指一条大蟒蛇! Python是一种计算机语言.我们在这篇教程里选择Python是因为这门语言很容易上手,学习起来也很简单和有趣. 如果你是个Python方面的新手,在开始看教程之前你可以看看这本书< Think

HTML5制作的坦克游戏

HTML5制作的坦克游戏 本游戏是基于HTML5开发的 网页游戏,js,css辅助开发 源码如下: <!DOCTYPE html><html><head><meta charset="utf-8"/><title>坦克大战</title> </head><body onkeydown="getCommand();"><h3>坦克大战(请使用IE浏览器)<