游戏场景
进入游戏后,我们一般会有 欢迎界面,游戏界面,介绍界面,这些不同的界面,我们定义为一个个场景。那么需要使用一个场景类来管理游戏界面。
定义一个基类,所有的场景都继承这个基类
#ifndef SKVIEW_H_
#define SKVIEW_H_
#include "SkComm.h"
#include "SkShow.h"
namespace sk_park {
/**游戏场景**/
class SkView {
public:
class ViewMovingEvent {
public:
bool m_bListen;
bool m_bMoveing;
Sint32 m_iLastXPixel;
Sint32 m_iLastYPixel;
ViewMovingEvent();
bool handleEvent(SkView * pSkView, SkEvent &stEvent);
};
SkView();
virtual ~SkView();
virtual void doEvent(SkEvent & stSkEvent, Sint64 iCurMTime);
virtual void show(SkShow* pSkShow, Sint64 iCurMTime);
virtual void run(Sint64 iCurMTime);
virtual void resize();
Sint32 m_iPosX;
Sint32 m_iPosY;
};
}
extern sk_park::SkView g_SkView;
#endif /* SKVIEW_H_ */
#include "pch.h"
#include "SkView.h"
using namespace sk_park;
SkView::ViewMovingEvent::ViewMovingEvent() {
m_bMoveing = false;
m_iLastXPixel = 0;
m_iLastYPixel = 0;
m_bListen = true;
}
bool SkView::ViewMovingEvent::handleEvent(SkView * pSkView, SkEvent &stEvent) {
if (!m_bListen) {
return false;
}
Sint32 iX = stEvent.iX;
Sint32 iY = stEvent.iY;
if (stEvent.type.type == SDL_MOUSEMOTION) {
if (m_bMoveing) {
Sint32 iTX = (iX - m_iLastXPixel);
Sint32 iTY = (iY - m_iLastYPixel);
int iTmp = 200;
if (iTX > -iTmp && iTX < iTmp && iTY > -iTmp && iTY < iTmp) {
pSkView->m_iPosX += iTX;
pSkView->m_iPosY += iTY;
m_iLastXPixel = iX;
m_iLastYPixel = iY;
}
}
} else if (stEvent.type.type == SDL_MOUSEBUTTONDOWN) {
m_bMoveing = true;
m_iLastXPixel = iX;
m_iLastYPixel = iY;
} else if (stEvent.type.type == SDL_MOUSEBUTTONUP) {
m_bMoveing = false;
}
return m_bMoveing;
}
SkView::SkView() {
m_iPosX = 0;
m_iPosY = 0;
}
SkView::~SkView() {
}
void SkView::show(SkShow* pSkShow, Sint64 iCurMTime) {
}
void SkView::doEvent(SkEvent & stSkEvent, Sint64 iCurMTime) {
}
void SkView::run(Sint64 iCurMTime) {
}
void SkView::resize() {
}
SkView g_SkView;
前面一节中的欢迎界面就是我们的第一个游戏界面,实现如下:
#ifndef VIEWFIRST_H_
#define VIEWFIRST_H_
#include "../../sk_game/sk_inc.h"
using namespace sk_park;
class ViewFirst: public SkView {
public:
ViewFirst();
void doEvent(SkEvent & stSkEvent, Sint64 iCurMTime);
void show(SkShow* pSkShow, Sint64 iCurTime);
void run(Sint64 iCurTime);
void resize();
private:
SkImage m_background;
SkAnimation m_testAnimation;
SkMove m_testMove;
SkButton m_testButton;
};
#endif /* VIEWFIRST_H_ */
#include "pch.h"
#include "ViewFirst.h"
ViewFirst::ViewFirst() {
int iRet = m_background.load("pic/bg.png", 800, 600);
g_SkComm.log("load pic=%d", iRet);
{
SkImage image;
image.load("pic/p0.png");
m_testAnimation.addPic(image.m_skSurface, 100);
}
{
SkImage image;
image.load("pic/p1.png");
m_testAnimation.addPic(image.m_skSurface, 100);
}
{
SkImage image;
image.load("pic/p2.png");
m_testAnimation.addPic(image.m_skSurface, 100);
}
{
SkImage image;
image.load("pic/p3.png");
m_testAnimation.addPic(image.m_skSurface, 100);
}
m_testAnimation.setBeginTime(g_SkGameTimer.m_siGameLastTime);
SkMoveType stMoveType;
m_testMove.setBeginPos(300, 300);
stMoveType.ResetLineSpeedForSec(100, 0);
m_testMove.addMoveType(stMoveType, 4000);
stMoveType.ResetLineSpeedForSec(0, 100);
m_testMove.addMoveType(stMoveType, 4000);
stMoveType.ResetLineSpeedForSec(-100, 0);
m_testMove.addMoveType(stMoveType, 4000);
stMoveType.ResetLineSpeedForSec(0, -100);
m_testMove.addMoveType(stMoveType, 4000);
m_testMove.setBeginTime(g_SkGameTimer.m_siGameLastTime);
SkImage pic_ch_1;
SkImage pic_ch_2;
pic_ch_1.load("pic/ch1.png");
pic_ch_2.load("pic/ch2.png");
m_testButton.setShow(pic_ch_1.m_skSurface, pic_ch_1.m_skSurface,
pic_ch_2.m_skSurface);
m_testButton.m_area.addPoint(0, 0);
m_testButton.m_area.addPoint(0, pic_ch_1.m_iHeight);
m_testButton.m_area.addPoint(pic_ch_1.m_iWidth, pic_ch_1.m_iHeight);
m_testButton.m_area.addPoint(pic_ch_1.m_iWidth, 0);
m_testButton.setPosition(400, 400);
}
void ViewFirst::doEvent(SkEvent & stSkEvent, Sint64 iCurMTime) {
bool bRet = m_testButton.handleEvent(m_testButton.m_iPosX,
m_testButton.m_iPosY, stSkEvent, NULL);
if (bRet) {
return;
}
}
void ViewFirst::show(SkShow* pSkShow, Sint64 m_iCurTime) {
/**清空屏幕背景为黑色矩形**/
//pSkShow->clear(0x00, 0xff, 0x00, 0xff);
/**游戏区域背景为蓝色矩形**/
SkRect backRect;
backRect.x = 0;
backRect.y = 0;
backRect.w = g_SP.m_iBaseWidth;
backRect.h = g_SP.m_iBaseHeight;
pSkShow->fillRec(&backRect, 0x00, 0x00, 0xff, 0xff);
/**绘制游戏背景**/
SkPostion * pPos = m_testMove.getPostion(m_iCurTime);
SkRect stPos;
stPos.x = 0;
stPos.y = 0;
pSkShow->drawPic(NULL, &m_background, &stPos);
stPos.x = pPos->x;
stPos.y = pPos->y;
pSkShow->drawAnm(NULL, &m_testAnimation, &stPos, m_iCurTime);
stPos.x = m_testButton.m_iPosX;
stPos.y = m_testButton.m_iPosY;
pSkShow->drawButton(NULL, &m_testButton, &stPos, m_iCurTime);
/**绘制一个红色矩形**/
SkRect stSkRect;
stSkRect.x = 100;
stSkRect.y = 200;
stSkRect.w = 300;
stSkRect.h = 200;
//g_SkComm.log("[%s][%d]x:%d y:%d w:%d h:%d\n", __FILE__, __LINE__,
// stSkRect.x, stSkRect.y, stSkRect.w, stSkRect.h);
pSkShow->fillRec(&stSkRect, 0xff, 0x00, 0x00, 0xff);
}
void ViewFirst::run(int64_t m_iCurTime) {
}
void ViewFirst::resize() {
}