Screen Layout & Background Image

Slides:



Advertisements
Similar presentations
面向对象与设计模式 RD 常见编程范式介绍  并行编程 - Process-orientedProcess-oriented  组件编程 - Component-basedComponent-based  事件驱动 - Service-oriented,Time-drivenService-orientedTime-driven.
Advertisements

项目7 面向对象高级.
第二章 中药总论 ----中兽药的基本知识.
第1单元 操作系统概论 第一节 绪论 操作系统定义.
四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
第一章 C语言概述 计算机公共教学部.
第 5 章 流程控制 (一): 條件分支.
第6章 多态性与虚函数.
第二章 JAVA语言基础.
類別與物件 Class & Object.
QT编程简介 李杨 Qt系列讲座 组织:柴树杉 1. Qt编程简介 智能仿生,柴树杉 2. 创建主窗口程序 3. Qt+VTK开发三维应用
C++程序设计 王希 图书馆三楼办公室.
第三章 控制结构.
第二十八章 開發新的VCL元件 雖然BCB內提供了很多VCL元件,但是一定還有一些我們常常需要用的介面並沒有製作成VCL元件,或是一些個人化的介面,我們也有需要做成VCL元件。在第十三章,我們將介紹如何自行開發新的VCL元件。
OOSDL 靜宜大學資工系 蔡奇偉 副教授
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
CHAPTER 9 建構方法 ROBERT.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
本單元介紹何謂變數,及說明變數的宣告方式。
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
程式設計實作.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
可降阶的高阶方程 一、 型的微分方程 二、不显含未知函数的方程 三、不显含自变量的方程.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
Animation(動畫) 靜宜大學資工系 蔡奇偉 副教授
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
程式結構&語法.
101年度經費結報說明 會計室 黃玉露.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++复习2----类与对象.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
第二章 类型、对象、运算符和表达式.
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第九章 物件導向-進階.
第 9 章 建構函式與解構函式.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
硬幣遊戲解題詳解 王豐緒 銘傳大學資訊工程學系.
97年會計業務座談會 課程:代收款系統簡介 報告人:林輝
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
PROGRAM 1 Simple E. Angel, Interactive Computer Graphics A Top-Down Approach with OpenGL, Third Edition Addison-Wesley Longman, 2003.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

Screen Layout & Background Image 靜宜大學資工系 蔡奇偉 副教授 2006-2007

內容大綱 Screen Layout 座標系統 Background Image Painter’s Algorithm

Screen Layout 佈置螢幕的畫面,以達到下列目標: 美觀 營造遊戲氣氛 清楚的遊戲資訊展示 螢幕可以顯示下列的畫面: 遊戲開始的操作畫面 遊戲主畫面 即時性的遊戲資訊 遊戲設定、遊戲角色屬性展示或調整的 GUI 影片(開場、 橋段、結局) 終場 兩者通常同時顯現

GBA Final Fantasy VI Advance

失落的星球:極限狀態

暗黑破壞神 2資料片:毀滅之王

暗黑破壞神 2資料片:毀滅之王

伊蘇:始源

迷城國度 中文版

爆走卡車之橫越美洲

救世英豪 3 中文版

終極動員令 3:泰伯倫戰爭

終極動員令 3:泰伯倫戰爭

座標系統 右手座標系統 左手座標系統 y x (0, 0) x (0, 0) y SDL 的螢幕和繪圖頁採用左手座標系統。

遊戲裏的座標系統 世界座標系統 描述遊戲世界所採用的座標系統。可以是左手或右手座標系統; 其範圍也可能超過遊戲窗口的大小。 螢幕座標系統 通常是左手座標系統 遊戲窗口座標系統 顯示遊戲世界的窗口,因此通常採用與世界同類型的座標系統。 繪圖頁座標系統 物件座標系統 定義遊戲物件屬性所用的座標系統,可以是左手或右手座標系統。

世界座標與螢幕座標間的轉換 window screen viewport world 以後使用下面的簡稱: W: world S: screen V: viewport

Case 1: W = S = V, 左手座標系統 W S = V

Case 2: W (右) = S (左) = V (右) S W HS V

Case 3: W = V < S, 左手座標系統 W S V

Case 4: W (右) = V (右) < S (左)

Case 5: 左手座標系統 W S V

Case 6: W (右), V (右), S (左) S W V

座標系統的選擇 全部採用左手座標系統 優點:具有一致性,座標轉換的計算也比較簡單 缺點:不符合日常的直覺。 螢幕和繪圖頁使用左手座標系統,其他用右手座標系統 優點:世界座標的使用符合日常的直覺。 缺點:座標轉換的計算比較複雜。 不過,我們可以運用一些輔助程式把圖資裏的右手座標先轉成左手座標,然後才匯入遊戲程式使用。

Background Image 合成方式 一整張圖當背景圖 優點:比較容易繪製也比較容易管理。 缺點:若是圖很大,一次整個讀入會佔用很多的記憶體, 對某些掌上型遊樂器而言,可能無法負擔。 分割成若干比較小的子圖 優點:不必一次讀入整個背景圖,因而可減少記憶體的需求。 缺點:遊戲程式需要把這些分割圖合成原來的背景圖,同時也必 須判斷目前使用到的子圖為何。

範例 B1 B2 B3 B4 B5 B6 B7 B8 背景圖由 8 張子圖 B1, …, B8 組成。 viewport 跨佔 B2, B3, B6, 和 B7。 因此,程式必需保留可儲存四張子圖的記憶體。

由圖磚 (tiles) 組成背景圖 圖磚 背景圖中,許多圖磚是相同的圖形。

+ Tile Map int background_map[4][3] = { 1, 2, 3, 2, 2, 3, 3, 2, 1, 3, 1, 3, }

範例 gamebackground.zip 1600x400 採用全圖式的背景圖 全都用左手座標系統 程式的遊戲鏡頭左右來回地顯示背景圖片

CGameBackground 類別 private: // 儲存背景圖的繪圖頁 CSurface m_backgroundImage; // 遊戲鏡頭的位移量 int m_dx, m_dy; // 螢幕上的 viewport 矩形 CRect m_viewport; // 遊戲世界的 window 矩形 CRect m_window;

// Default Constructor CGameBackground() : m_dx(0), m_dy(0) { } // 載入背景圖。若參數 bDisplayFormat 為 true,則背景圖會 // 轉換成螢幕的像素格式。 bool LoadImage (const char *file, bool bDisplayFormat = true) return m_backgroundImage.LoadImage(file, bDisplayFormat);

W S V // 設定 viewport 矩形,同時把 window 設成一樣大小的 // 矩形,而且擺在背景圖的左上角位置。 void SetViewport (const CRect &rect) { m_viewport = rect; m_window.w = rect.w; m_window.h = rect.h; } W S V

bool FirstShow () { return m_backgroundImage.Show (m_window, m_viewport); } bool Show () if (m_dx != 0 || m_dy != 0) m_window.x += m_dx; m_window.y += m_dy; return true;

// 水平移動遊戲鏡頭 dx 個像素。參數 dx 為正,表示右移, // 否則為左移。 int HPan (int dx) { if (dx > 0) int gap = m_backgroundImage.Width() – (m_window.x + m_window.w); if (dx > gap) dx = gap; if (dx >= 0) m_dx = dx; } else if (dx < 0) if (m_window.x < -dx) dx = -m_window.x; else m_dx = 0; return dx; // 傳回真正的移動量 gap

// 垂直移動遊戲鏡頭 dy 個像素。參數 dy 為正,表示下移, // 否則為上移。 int VPan (int dy) { if (dy > 0) int gap = m_backgroundImage.Height() – (m_window.y + m_window.h); if (dy > gap) dy = gap; if (dy >= 0) m_dy = dy; } else if (dy < 0) if (m_window.y < -dy) dy = -m_window.y; else m_dy = 0; return dy; // 傳回真正的移動量

// 任意方向地移動遊戲鏡頭可以用如下的 HPan() 和 VPan() // 合成方式。 void Pan (int dx, int dy) { HPan(dx); VPan(dy); }

// main.cpp #include <SDL/OOSDL.h> #include "gamebackground.h" // The attributes of the screen const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int SCREEN_BPP = 32; const char* WINDOW_TITLE = "Scroll Game Background";

class CMyGameApp : public CGameApp { public: CMyGameApp () : CGameApp() {} protected: virtual bool InitializeApp (); virtual bool AppMain (); private: CGameBackground m_background; int m_panSpeed; // 鏡頭移動的速度 };

bool CMyGameApp::InitializeApp () { CRect viewport(40, 40, 560, 400); m_background.LoadImage ("bg.png"); m_background.SetViewport(viewport); m_pScreen->Clear(); m_background.FirstShow(); m_panSpeed = 3; return true; }

bool CMyGameApp::AppMain () { int speed = m_background.HPan(m_panSpeed); if (speed == 0) m_panSpeed = -m_panSpeed; m_background.Show(); return true; }

int main( int argc, char* argv[] ) { CMyGameApp myGameApp; myGameApp.InitializeSDL(); myGameApp.SetScreen(); myGameApp.SetCaption(WINDOW_TITLE); myGameApp.Run(); return EXIT_SUCCESS; }