SDL游戏之路(十二)--游戏场景

游戏场景


进入游戏后,我们一般会有 欢迎界面,游戏界面,介绍界面,这些不同的界面,我们定义为一个个场景。那么需要使用一个场景类来管理游戏界面。

定义一个基类,所有的场景都继承这个基类

#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() {

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值