超级玛丽制作揭秘2

C++打印超级玛丽游戏场景 各位大佬,先点个赞再看吧! 如何用C++来打印超级玛丽游戏中的一个场景?这对于C++学习者来说实在是太简单了。 题目网址在这: http://noi.openjudge.cn/ch0101/10/ 先上效果: 要实现这种效果,只要疯狂输出就行。 接下来是代码: #include<bits/stdc++.h> using namespace std; int main(){ cout<<" ********"<<.. 阅读详情

先说一下代码风格,大家都说看不懂,这就对了。整套代码约有3000行,并不都是针对这个游戏写的。我想把代码写成一个容易扩展、容易维护、功能全面的“框架”,需要什么功能,就从这个框架中取出相应功能,如果是一个新的功能,比如新的图像显示、新的运动控制,我也能方便地实现。所以,这个游戏的代码,是在前几个游戏的基础上扩充起来的。部分函数,部分变量在这款游戏中,根本不用,但要保留,要为下一款游戏作准备。只要理解了各个类,就理解了整个框架。

今天先讲最基础的图像类 MYBITMAP:
成员函数功能列表:
//功能 根据一个位图文件,初始化图像
//入参 应用程序实例句柄 资源ID 横向位图个数 纵向位图个数
void Init(HINSTANCE hInstance,int iResource,int row,int col);
//功能 设置环境信息
//入参 目的DC(要绘制图像的DC),临时DC,要绘制区域的宽 高
void SetDevice(HDC hdest,HDC hsrc,int wwin,int hwin);
//功能 设置图片位置
//入参 设置方法 横纵坐标
void SetPos(int istyle,int x,int y);
//功能 图片显示
//入参 图片显示方式
void Draw(DWORD dwRop);
//功能 图片缩放显示
//入参 横纵方向缩放比例
void Stretch(int x,int y);
//功能 图片缩放显示
//入参 横纵方向缩放比例 缩放图像ID(纵向第几个)
void Stretch(int x,int y,int id);
//功能 在指定位置显示图片
//入参 横纵坐标
void Show(int x,int y);
//功能 横向居中显示图片
//入参 纵坐标
void ShowCenter(int y);
//功能 将某个图片平铺在一个区域内
//入参 左上右下边界的坐标 图片ID(横向第几个)
void ShowLoop(int left,int top,int right,int bottom,int iframe);
//功能 不规则图片显示
//入参 横纵坐标 图片ID(横向第几个)
void ShowNoBack(int x,int y,int iFrame);
//功能 不规则图片横向平铺
//入参 横纵坐标 图片ID(横向第几个) 平铺个数
void ShowNoBackLoop(int x,int y,int iFrame,int iNum);

//动画播放
//功能 自动播放该图片的所有帧,函数没有实现,但以后肯定要用:)
//入参 无
void ShowAni();
//功能 设置动画坐标
//入参 横纵坐标
void SetAni(int x,int y);

成员数据
//跟踪打印类
// FILEREPORT f;

//图像句柄
 HBITMAP hBm;

//按照行列平均分成几个
 int inum;
 int jnum;

//按行列分割后,每个图片的宽高(显然各个图片大小一致,派生后,这里的宽高已没有使用意义)
 int width;
 int height;

//屏幕宽高
 int screenwidth;
 int screenheight;

//要绘制图片的dc
 HDC hdcdest;

//用来选择图片的临时dc
 HDC hdcsrc; 

//当前位置
 int xpos;
 int ypos;

//是否处于动画播放中(功能没有实现)
 int iStartAni;

这个基类的部分函数和变量,在这个游戏中没有使用,是从前几个游戏中保留下来的,所以看起来有些零乱.这个游戏的主要图像功能,由它的派生类完成.由于基类封装了物理层信息(dc和句柄),派生类的编写就容易一些,可以让我专注于逻辑含义.
基类的函数实现上,很简单,主要是以下几点:
1.图片初始化:
//根据程序实例句柄,位图文件的资源ID,导入该位图,得到位图句柄
 hBm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResource));
//获取该位图文件的相关信息
 GetObject(hBm,sizeof(BITMAP),&bm);
//根据横纵方向的图片个数,计算出每个图片的宽高(对于超级玛丽,宽高信息由派生类处理)
 width=bm.bmWidth/inum;
 height=bm.bmHeight/jnum;

2.图片显示
各个图片的显示函数,大同小异,都要先选入一个临时DC,再bitblt到要绘制的dc上.矩形图片,可以直接用SRCCOPY的方式绘制.不规则图片,需要先用黑白图与目的区域相"与"(SRCAND),再用"或"的方法显示图像(SRCPAINT),这是一种简单的"去背"方法.
例如下面这个函数:
void MYBITMAP::ShowNoBack(int x,int y,int iFrame)
{
 xpos=x;
 ypos=y;
 SelectObject(hdcsrc,hBm);
 BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,height/2,SRCAND); 
 BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,0,SRCPAINT);  
}


3.图片缩放
用StretchBlt的方法实现
void MYBITMAP::Stretch(int x,int y,int id)
{
 SelectObject(hdcsrc,hBm);
 StretchBlt(hdcdest,xpos,ypos,width*x,height*y,
  hdcsrc,0,id*height,
  width,height,
  SRCCOPY); 
}

在超级玛丽中的使用
在这个游戏中,哪些图像的处理是通关这个基类呢?只有一个:
MYBITMAP bmPre;
由于这个基类只能处理几个大小均等的图片,只有这些图片大小一致,且都是矩形:游戏开始前的菜单背景,操作信息的背景,每一关开始前的背景(此时显示LIFE x WORLD x),通关或游戏结束时显示的图片.共5个,将这5个图片,放在一个位图文件中,于是,这些图片的操作就做完了,代码如下:

//初始设置,在InitInstance函数中
bmPre.Init(hInstance,IDB_BITMAP_PRE1,1,5);
bmPre.SetDevice(hscreen,hmem,GAMEW*32,GAMEH*32);
bmPre.SetPos(BM_USER,0,0);

//图片绘制,在WndProc中,前两个参数指横纵方向扩大2倍显示.
bmPre.Stretch(2,2,0);
bmPre.Stretch(2,2,4);
bmPre.Stretch(2,2,2); 
bmPre.Stretch(2,2,1); 
bmPre.Stretch(2,2,3);

图像控制部分,基类就讲到这里,欲知后事,下回分解.
附:
超级玛丽第一版源码链接:http://download.youkuaiyun.com/source/497676
超级玛丽增强版源码链接:http://download.youkuaiyun.com/source/584350


 

超级玛丽制作揭秘20地图切换  地图分两种,普通地图和隐藏地图(指通过水管进入的地图)。先讲普图地图的切换,再讲隐藏地图的切换。普通地图的切换:思路:很简单,用一个数字iMatch表示当前是第几关。每过一关,iMatch+1,加载下一张地图。存储: int iMatch;初始化: iMatch=0;(0表示第一关)过关检测:用一个函数不停地检测玩家是否到了地图终点,如果是,加载下一关的地图。函数:int GAMEMAP:: 阅读详情

相关推荐

Java制作超级玛丽

在你的童年记忆里,是否有一个会蹦跳,会吃蘑菇的小人? 超级玛丽是一款经典并且流行的小游戏,通过键盘来控制 马里奥的移动,跳跃可以顶掉砖块,下落时还可以踩死蘑菇敌人~~ 《超级玛丽》1985出品的游戏,啊,我还没有出生,游戏虽老但尤为经典,现在我还会去回顾一下的游戏,今天我将它做出来了!!!>>" data-link-title="超级玛丽视频>>>">超级玛丽视频>>> 那么你们想做出超级玛丽游戏吗,如何利用Java编写一款属于自己的

编程领域的博客 806

用C++的一个cout指令画出超级玛丽

用C++的一个cout指令画出超级玛丽

weixin_73780105的博客 1724

超级玛丽的 python 实现

超级玛丽的 python 实现 在经过三四天的摸索,参考了Github上的一个大神的代码的前提下,也算是初步搭建起了自己的超级玛丽,下面就给大家分享一些自己踩的坑。 这里是Github上大神的代码,对超级玛丽的第一关进行了很好的还原。 推荐一下Github上一个pygame的游戏仓库 推荐一本《python和pygame游戏开发指南》,想要深入研究的朋友可以去翻阅一下 关于 pygame 模块可以...

qq_43733805的博客 6197

怎样做小游戏挖金子(VC,源码2)

先别急着看源码,首先要解决的问题是程序框架。VC只是一个开发环境,支持的是C++。Windows下的程序,当然是用Windows API(Application Programming Interface)写成的。 VC提供了一个类库MFC,如同课本中介绍的一样,“点几下鼠标即可生成一个程序”。控件靠拖动即可生成。很方便,但也是最大的缺陷。隐藏了太多东西。我的电脑中VC的一个链接库有点问题,无

programking的快乐生活 3675

超级玛丽制作揭秘6时钟控制 类MYCLOCK

类说明:时间就是生命。这对于游戏来说,最为准确。游戏程序只做两件事:显示图片、处理逻辑。更准确的说法是:每隔一段时间显示图片并处理逻辑。程序中,要设置一个定时器。这个定时器会每隔一段时间发出一个WM_TIMER消息。在该消息的处理中,先逻辑处理。逻辑处理完毕,通过InvalidateRect函数发出WM_PAINT消息,显示各种图片。游戏就不停地运行下去,直至程序结束。时间表示:用一个整数iN

programking的快乐生活 1325

保姆级教你用Python制作超级玛丽游戏(文末赠书)

你绝对玩过超级玛丽,还不来看看?(爷青回~)

阿玥的小博客 4120

超级玛丽制作揭秘1

两个版本的超级玛丽下载量已达到5000,谢谢大家支持。谁无法下载,请告诉我邮箱,我直接发。现在普遍反映两个问题,一没有帮助文档,二代码注释太少。今天起,我揭秘制作过程,保证讲解到每一行代码,每一个变量。代码我已经发布了,可见做这样一个游戏并不难。今天讲准备工作,也就是所需要的开发工具。代码编写调试:VC 6.0,美术工具:Windows自带的画图(开始-程序-附件-画图)。这是最简陋的开发工具

programking的快乐生活 2340

C++超级玛丽游戏源代码

C++超级玛丽游戏源代码,源代码仅供参考学习。

C++ 超级玛丽制作揭秘(包含完整源文件与文档)

首先,我说说对C++的最直观的感受吧!熟悉了.net 智能提示,开始一开始发现C++根本没有提示了。后来google了一下,下载了一个visual assist 这个插件,比vs自动提示强多了。 然后,就是习惯了在.net中,把所有的声明和方法实现写在同一文件中。可是C++不是这么回事。 他一个声明在头文件中,实现 在源文件中,说实在话,一开始并怎么习惯。后来渐渐就习惯了。然后,写C++的文件就是...

6625

工作间的轻松 VBA 在 EXCEL 中画超级玛丽 (XP,EXCEL 2007成功)

工作间的轻松 VBA 在 EXCEL 中画超级玛丽 (XP,EXCEL 2007成功)

vb游戏开发-仿超级玛丽游戏

这一是款VB仿超级玛丽游戏,功能齐全,界面优美,全vb编程。

pygame简易超级玛丽制作

需要安装pygame,做的超级玛丽简易代码,记录一下,素材需要如下,音频,积分,子弹,障碍物,人物,背景图片。 import pygame from pygame.locals import * import sys SCREENWIDTH = 822 SCREENHEIGHT = 199 FPS = 30 def mainGame(): score = 0 # 得分 ov...

qq_36710311的博客 3877

HTML5超级玛丽小游戏源代码.zip

多款HTML5 游戏源代码特辑,包括了捕鱼达人、植物僵尸、Solarmax、俄罗斯方块、扫雷、切水果、超级玛丽、三国杀、驴子跳、太空战舰、坦克大战等

超级玛丽制作揭秘17地图物品

 自从游戏机发明以来,地图是什么样的呢?打蜜蜂,吃豆,地图是一个矩形,玩家在这个矩形框内活动。后来,地图得到扩展,可以纵向移动,比如打飞机;可以横向移动,比如超级玛丽、魂斗罗等等横板过关游戏。再后来,横向纵向都可以移动,后来又有45度地图,3D技术后终于实现了高度拟真的虚拟世界。超级玛丽的地图可以看成是一个二维的格子。每个格子的大小是32x32像素。游戏窗口大小为12个格子高,16个格子宽。游戏地

programking的快乐生活 1710

超级玛丽制作详细大解密

本源码资源对刚希望学习游戏开发的朋友来说是一个不错的开始,简单易懂.至少说我是这样认为的,里面没有设计多深奥的东西,希望对你是个好的开始

【VB源码】牛人纯VB打造的经典游戏

牛人纯VB打造的经典游戏 - 超级玛丽 欢迎下载测试!

超级玛丽制作揭秘8跟踪打印 类FILEREPORT

 前面介绍了图片显示、时钟控制、字体管理几项基本技术。这是所有游戏都通用的基本技术。剩下的问题就是游戏逻辑,例如益智类、运动类、射击类、格斗类等等。当然,不同的游戏需要针对自身做一些优化,比如益智类游戏的时钟控制、画面刷新都更简单,而格斗游戏,画面的质量要更酷、更炫。下面要介绍整个游戏的核心层:逻辑控制。地图怎样绘制的?物品的坐标怎么存储?人物怎样移动?游戏流程是什么样的?在介绍这些内容前,先打断

programking的快乐生活 1205

Python制作超级玛丽源码

本代码是用Python制作超级玛丽小游戏的代码,仅供学习参考

上一篇: 超级玛丽制作揭秘1
下一篇: 新的工作开始
programking
博客等级 码龄23年 450粉丝 140原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值