祖玛游戏3D版源代码

今天断粮了,饿了一天,到了晚上八点终于买到份四百块钱的水饺。吃撑了,写点东西消化一下。这是一个3D版祖玛小游戏,使用的还是crapell引擎,c++开发,感觉现在还用c++开发游戏的好像不多了,代码比较简单,只有基本的功能,细节就不完善了。

和经典的祖玛游戏玩法类似,发射子弹,三个颜色相同的球连在一起可以消除。小球在路径上推挤前进,路径可以做成架起的铁轨或挖出的河道。有一些想法没做,因为在其它的小游戏中已经实现过,这里就不重复了,比如小球可以由物理引擎驱动,或者加入复杂的地形机关。

暂时写了一个简单的自动挂机算法,没有加入联机功能。

有个直觉,坚持了十几年的游戏开发事业可能快到头了,打算把自己写的一个游戏引擎和二三十个小游戏总结一下。

 

小球类:


//========================================================
//  @Date:     2016.05
//  @File:     Include/Zuma/ZumaBall.h
//  @Brief:     ZumaBall
//  @Author:     LouLei
//  @Email:  twopointfive@163.com
//  @Copyright (Crapell) - All Rights Reserved
//========================================================


#ifndef _ZumaBall_H
#define _ZumaBall_H

#include "General/Pch.h"
#include "Render/Texture.h"

#define ZumaBallRadius 20
#define ZumaBulletSpeed  400
#define ZumaBallFit 7 //万能匹配球

//todov地图上挖沟或建铁轨或随水流   特殊点可以汇聚到轨道上的河或站台上
//
//参考平衡球 管道阻挡   吹起ball   ball进入弹跳板 重力

class MiniGameZuma;
class ZumaPath;
class ZumaBallBase
{
public:
	ZumaBallBase();
	virtual void Render(){};
	virtual void Update (float frameTime);
	void SetSize(float size);
	void SetRot(vec3& axis);

public:
	float m_radius;
	int   m_color;

	int   m_state;	
	float m_stateTime;
	
	vec3  m_pos;
	vec3  m_speed;

	vec3  m_rotAxis;
	float m_rot;

	ZumaPath* m_path;
};

//祖玛球
class ZumaBall:public ZumaBallBase
{
public:
	enum State
	{
		Inactive=-1,
		Running=1,
		Exploiding,
	};
	ZumaBall();
	virtual void Render();
	virtual void Update(float frameTime);

public:
	float m_pathPos;
	float m_pathSpeed;
};

#endif
//========================================================
//  @Date:     2016.05
//  @File:     Include/Render/Curve.h
//  @Brief:     Curve
//  @Author:     LouLei
//  @Email:  twopointfive@163.com
//  @Copyright (Crapell) - All Rights Reserved
//========================================================

#include "General/Pch.h"
#include "General/Timer.h"
#include "Math/MathLib.h"
#include "Zuma/ZumaBall.h"
#include "Zuma/ZumaBullet.h"
#include "Zuma/MiniGameZuma.h"
#include "Render/RendDriver.h"
#include "Render/Curve.h"
#include "General/Pce.h"


ZumaBallBase::ZumaBallBase()
:m_path(NULL)
,m_color(0)
,m_state(0)
,m_radius(ZumaBallRadius)
{

}
void ZumaBallBase::SetSize(float size)
{
	m_radius = size;
}
void ZumaBallBase::SetRot(vec3& axis)
{
	m_rotAxis = axis;
	m_rot = 0;
}
void ZumaBallBase::Update(float frameTime)
{
	if (m_state == false)
	{
		return;
	}
}

ZumaBall::ZumaBall()
:m_pathPos(0)
,m_pathSpeed(0)
{

}

void ZumaBall::Render()
{
	if (m_state == Inactive)
	{
		return;
	}
	mat4 trans;
	trans.FromTranslate(m_pos.x,m_pos.y,m_pos.z);

	mat4 rot1;
	rot1.FromToDir(vec3(0,1,0),m_rotAxis);

	m_rot = m_path->m_curve->Path2Length(m_pathPos)/m_radius;

	mat4 rot2;
	rot2.FromRotateX(m_rot);


	G_RendDriver->PushMatrix();

	G_RendDriver->MultMatrix(trans*rot1*rot2);

	if (m_state == Exploiding)
	{
		if (Rand()%2)
		{
			G_RendDriver->BlendFunc(Blend_Additive);
		}
		else
		{
			G_RendDriver->BlendFunc(Blend_Filter);
		}
	}
	else
	{
		G_RendDriver->BlendFunc(Blend_Filter);
	}
	G_ZumaGame->m_ballMovie[m_color]->GetMaterial()->Bind();
	G_ZumaGame->m_ballMovie[m_color]->GetMesh()->Render();

	G_RendDriver->PopMatrix();
}

void ZumaBall::Update(float frameTime)
{
	if (m_state == Inactive)
	{
		return;
	}
	//ZumaBallBase::Update(frameTime);

	if(m_pathPos > m_path->m_curve->GetPointNum())
	{
		m_state = Inactive;
	}

	if (m_state == Exploiding)
	{
		if (m_stateTime>0.7f)
		{
			m_state = Inactive;
		}
		m_stateTime += frameTime;
	}
	////球和球的作用力
	//{
	//	ZumaBall* ball1,*ball2;
	//	vec3 dif;
	//	vec3 move;
	//	vec3 acc;
	//	float dis;
	//	float radiusSum;

	//	for (int j=i+1;j<MaxBallNum;j++)
	//	{
	//		ball2 = &m_balls[j];
	//		dif = m_pos-ball2->m_pos;
	//		dis = dif.Length();
	//		radiusSum = m_size+ball2->m_size;
	//		if (dis<radiusSum)
	//		{
	//			//分离
	//			acc = (m_speed-ball2->m_speed)*0.5f;
	//			m_speed -= acc;
	//			ball2->m_speed += acc;
	//			if (dis>_EPSILON)
	//			{
	//				move = dif*((radiusSum-dis)/dis);
	//			}
	//			else
	//			{
	//				move = vec3(0.5f,0,0)*(radiusSum-dis);
	//			}
	//			m_pos += move;//*0.1f;
	//			ball2->m_pos -= move;//*0.1f;
	//		}
	//		else if (dis < radiusSum*2)
	//		{
	//			//吸在一起
	//			move = dif*(60/*10*/*frameTime/dis);
	//			m_speed -= move;
	//			ball2->m_speed += move;
	//		}
	//	}
	//}


}


路径类:


//========================================================
//  @Date:     2016.05
//  @File:     Include/Zuma/ZumaBall.h
//  @Brief:     ZumaBall
//  @Author:     LouLei
//  @Email:  twopointfive@163.com
//  @Copyright (Crapell) - All Rights Reserved
//========================================================


#ifndef _ZumaPath_H
#define _ZumaPath_H

#include "General/Pch.h"
#include "Render/Texture.h"
#include "Zuma/ZumaBall.h"
#include <list>

class Curve;

typedef std::list<ZumaBall> ZumaBallList;
class ZumaPath
{
public:
	ZumaPath();
	bool Start();
	bool Stop();
	bool Rend
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值