1. 程式人生 > >實驗1 二維遊戲場景繪製(英雄快跑)

實驗1 二維遊戲場景繪製(英雄快跑)

教材:

《計算機遊戲程式設計》(基礎篇)(第3版)

說明:

課程教材《計算機遊戲程式設計》(基礎篇)(第3版) 提供示例程式碼,而課程實驗在示例程式碼的基礎上提出更高的實驗要求。除此之外,本人也會額外加入些個人創意,希望同學們在參考之餘也能加入自己的想法。

實現效果:

實驗報告:

一、實驗目的與要求

1.熟悉cocos2d-x開發環境。

2.瞭解cocos2d-x中二維遊戲場景繪製方法。

3.掌握地圖編輯器使用方法。

二、實驗內容與方法

1.完成基本實驗 (70分)

按照“英雄快跑.pdf”檔案指引,成功執行本次實驗遊戲。

2.完成遊戲通關 (5分)

憑自身實力或更改遊戲程式碼的方式通關,成功出現“Success”結束畫面。

3.完成Bug修改 (5分)

通過更改遊戲程式碼的方式修復樹枝檢測Bug。

4.繪製地圖 (20分)

用磚塊地圖編輯器(Tiled Map Editor)繪製一張30×20塊,塊大小為32×32畫素的地圖,並上交PNG檔案(命名格式:2015010001張三.png)。

三、實驗步驟與過程

記錄關鍵步驟/設計過程/設計結果的截圖

1. 成功運行遊戲

按要求新建一個工程名為學號的cocos2d-x的專案。並按要求移除、替換和拷貝實驗給定的原始碼。然後再修改一些原始碼中導致小bug的程式碼。

比如某些遊戲邏輯錯誤

帶來的小bug:

MapScene.cpp檔案的void MapScene::update(float t)函式中,“if (player_screen_y <= -80) { gameOver();} 要加上return表示遊戲結束,更改為“if (player_screen_y <= -80) { gameOver(); return;}

而同一函式下的判斷語句 “if((int)(player_map_y / map->getTileSize().width) >= 0)”和“if (player_map_y/map->getTileSize().width >= 0)

” 也要考慮角色成功通關時跑出地圖最右端的情況,所以判斷語句要加上“player_screen_x < sizeWidthTemp”這一判斷條件(sizeWidthTemp為螢幕寬度)。

此時檔案列表為:

圖 1

運行遊戲,成功執行如下圖2、3所示:

圖 2

圖 3

2. 完成遊戲通關

通過遊戲,螢幕出現“Success!”字樣:

圖 4

3. 完成Bug修改

試圖修復樹枝無法站立的bug。

首先我們找到判斷角色站立在圖塊上的相關程式碼。在MapScene.cpp檔案的void MapScene::update(float t)函式中,有這麼一段程式碼:

// 不跳動時遇到非地面圖塊自動下落

if((int)(player_map_y / map->getTileSize().width) >= 0 && player_screen_x < sizeWidthTemp)

{

int playerTiledID = map->getLayer(MAP_BG_LAYER_NAME)->

getTileGIDAt(Vec2((int)(player_map_x/map->getTileSize().width),

(int)(map->getMapSize().height-1-player_map_y/map->getTileSize().height)));

if ((m_isJump == false)&&(m_jumpDir == Dir::STOP)&& (playerTiledID != 8)

&& (playerTiledID != 7) && (playerTiledID != 151) && (playerTiledID != 170)

 && (playerTiledID != 171) && (playerTiledID != 172)) {

m_isJump = true;

m_jumpDir = Dir::DOWN;

m_jumpSpeed = 2;

}

}

明顯的,這段程式碼是用來判斷角色“不跳動時遇到非地面圖塊自動下落”。而其中有一段加粗了的if判斷語句則是判斷目前角色是否站立在地面圖塊上,只有非地面圖塊才能執行後面的程式碼段更改角色的狀態為下落狀態。

而playerTiledID則明顯是指圖塊的id了,因此,只要找到樹枝圖塊對應的id號,把它作為判斷條件加入到該加粗了的if判斷語句中即可修復“樹枝無法站立”的bug了。

值得注意的是,程式碼中playerTiledID變數的id是從1開始的,0代表空;而地圖塊中的id是從0開始的。因此兩者id號相差1 (即playerTiledID - 1 才是地圖塊真正id號)。

用Tiled軟體開啟該遊戲的地圖素材圖,尋找“樹枝”塊的id。如下圖:

圖 5

圖 6

可見“樹枝”圖塊的id為132和148 。因此,對應的playTiledID為133和149。

修改上文中加粗的if判斷語句為:

if ((m_isJump == false)&&(m_jumpDir == Dir::STOP)&& (playerTiledID != 8) &&

(playerTiledID != 7) && (playerTiledID != 151) && (playerTiledID != 170)&&

(playerTiledID != 171) && (playerTiledID != 172) && (playerTiledID != 133) && (playerTiledID != 149))

    ② 在MapScene.cpp檔案的void MapScene::update(float t)函式中,還有為“處理玩家跳躍”時的這麼一段程式碼:

// 獲取玩家腳下的地圖塊的編號

if (player_map_y/map->getTileSize().width >= 0 && player_screen_x < sizeWidthTemp) {

int tiledID = map->getLayer(MAP_BG_LAYER_NAME)->

getTileGIDAt(Vec2((int)(player_map_x/map->getTileSize().width),

(int)(map->getMapSize().height - 1 - player_map_y/map->

getTileSize().height)));

    if (tiledID == 8 || tiledID == 7 || tiledID == 151 || tiledID == 170 || tiledID == 171

|| tiledID == 172) {

check = true;

player->setPositionY((int)(player_screen_y + player->

getContentSize().height/2 - 6));

m_jumpSpeed = PLAYER_JUMP_SPEED;

m_jumpDir = Dir::STOP;

m_isJump = false;

break;

}

}

在這段程式碼中,tiledID就類似於前文提到的playerTiledID變數一樣。因此同理,在加粗的if語句段中加入“樹枝”的id作為判斷條件即可,更改為:

if (tiledID == 8 || tiledID == 7 || tiledID == 151 || tiledID == 170 || tiledID == 171

|| tiledID == 172 || tiledID == 133 || tiledID == 149)

至此,“樹枝”bug修改完成。如下圖所示,修改完該bug後,角色可以站在樹枝上了:

圖 7

4. 繪製地圖

相關推薦

實驗1 遊戲場景繪製英雄

教材: 《計算機遊戲程式設計》(基礎篇)(第3版) 說明: 課程教材《計算機遊戲程式設計》(基礎篇)(第3版) 提供示例程式碼,而課程實驗在示例程式碼的基礎上提出更高的實驗要求。除此之外,本人也會額外加入些個人創意,希望同學們在參考之餘也能加入自己的想法。

.net c#識別圖片碼 圖片處理Img和BitMap

1.場景 承接上篇,如何對攝像頭得到的圖片或者本地圖片進行二維碼識別   2.程式   程式使用類庫zxing.dll(用來識別二維碼),根據圖片識別二維碼方法是通用的 (1)識別二維碼並得到二維碼資訊的方法。(傳入引數為BitMap物件)

FPGA實驗1-2:電路開發入門DE0開發板

FPGA 實驗 專案建立、編譯和下載 實驗一:用1個撥碼開關控制所有的LED燈亮滅 DE0手冊中的管腳對應 原理圖 RTL檢視 &結果顯示 FPGA 實驗 譯碼器組合邏輯 實驗一:2個2-4譯碼器模組,分別控制對應組的LE

陣列的應用楊輝三角

import java.util.Scanner; /**  * @author Jocany  *程式碼:楊輝三角  */ public class ArrayTest3 { //分析: //A:任何一行的第一列和最後一列都是1 //B:從第三行開始,每一個數據是它上一行

計算幾何入門點,直線及簡單練習

精度問題:定義eps比較浮點數大小時需要引入極小值eps,具體多小由題目要求定例如:當eps=0時,0與0.1相等 0與0.9相等向量:既有方向又有大小的量向量的夾角:用<a,b>表示向量a和向量b的夾角表示:1. 點(point) 用(x,y)表示2.線段:可以

react-native-smart-barcode目前最好用的碼掃描元件IOS、android

最近在製作React-Native專案的時候,條碼識別給我們整個專案帶了不少麻煩,幾款主流的條碼識別元件都不是特別好用,使用者體驗比較差,比如二維碼識別速度慢、掃描頁面十分卡頓用等一系列問題,後來在網上無意間找到一個非常好用的二維碼掃描元件——react-native-smart-barcode,這個元件是

《程式設計基礎》實驗題目1 陣列 氣泡排序

題目:編寫函式,對於給定的二維整型陣列,首先對每行從小到大排序,之後對每列從小到大排序;反覆執 行上述排序過程,直到沒有變動為止。注:作為實參的二維整型陣列,每行元素個數不低於 3 且每列 元素個數不低於 4。 演算法分析: 1.      為方便傳遞引數

劍指offer 1.陣列中的查詢12.26

# -*- coding: utf-8 -*- """ Created on Wed Dec 26 18:48:22 2018 @author: Administrator 1.二維陣列中的查詢 題目: 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序, 每一列都按

關於構建動態內存及釋放

動態內存 size alloc spa pre all class ++ for 分配一維的內存堆可以直接用malloc及free,關於二維有如下方法: a=(int**)malloc(sizeof(int*)*m); for(i=0;i<m;i

微信支付支付寶支付生成碼的方法php生成碼的三種方法

gpo 就是 contents 微信支付 amp 如何 使用 alt scrip 如果圖簡單,可以用在線生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com

題目描述 在一個二維數組中每個一數組的長度相同,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

這樣的 -i 一個 整數 描述 輸入 遞增 lse i+1 題目描述 在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 1

碼詳解QR Code

作者:王子旭 連結:https://zhuanlan.zhihu.com/p/21463650 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。   2016.7.5 更新:長文多圖程式碼預警,電腦食用效果更佳。 完整版程式碼已上傳 GitHub,後

JavaEE程式設計實驗 實驗1 Java常用工具類程式設計未完成

1.使用String類分割split將字串“Solutions to selected exercises can be found in the electronic document The Thinking in Java Annotated Solution Guide,available for a

MATLAB三散點圖的繪製scatter3、plot3,同時標明序號

(1)函式scatter3   用法:scatter3(x,y,z,'.',c) % c 為顏色,需和x,y,z長度相同   例子: x=[4229042.63      4230585.02&nbs

1.陣列中的查詢

二維陣列中的查詢:        在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 分析: 使用暴力法,若從

C# TSC列印碼和條形碼 C#呼叫dll提示"試圖載入格式不正確的程式"解決方法

效果圖   開發、使用環境說明 安裝TSC_7.3.8_M-3.exe印表機驅動,安裝時選擇對應的ttp 244 pro 將TSCLIB.dll複製到C:\Windows\system 驅動安裝說明     選擇下一步   &nbs

微信公眾號 場景統計 場景

數據 sce 開始 led tostring pty .get 目錄 ont 之前接到了一個項目,要求在關註公眾號的用戶,推廣下個用戶,實行獎勵模式(只有兩級!)。然而,一臉懵,網站開發推廣生成二維碼,我知道怎麽做,大不了記錄用戶Id,生成二維碼,掃描的時候,獲取用戶I

資料結構實驗叉樹八:中序後序叉樹的深度SDUT 2804

#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char data ; struct node *l,*r; }; struct node *cr

資料結構實驗叉樹四:先序中序還原叉樹 SDUT 3343

#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100],b[100]; int n; struct node

劍指offer(1)陣列中的查詢

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 解題思路 方法一 最最最簡單的,直接便利全部元素,有相同的就返回true,沒有就返回