收录日期:2018/10/23 18:46:17 时间:2016/05/20 18:28:12 标签:GAME,图形处理/多媒体
大家讨论下超级玛利的设计思想,如果能设计出类似于超级玛利游戏,那么更复杂的RPG也能想像了!
有点意思,但是从来没做过。


我想是不是就是载入图像呀?
将屏幕分成几乘几得方格矩阵,然后不停的用图片来填充呀?
不知道是不是这么简单?


大家都说说自己的看法:)


应该是,推箱子也是这样的,
这样比较直接哦!
但好象很麻烦,
如果游戏很长,填充就比较麻烦!

有更好的方法么?
超级玛利是用汇编编的,推箱子倒有delphi的,不知道超级玛利有没有delphi的
超级马里什么时候变成RPG了?

超级马里的激情就是拯救一个被恶魔捉走的公主,年找这个思路去编吧。
呵呵,想当年

俺的超级马里可是能从头玩到尾的:)
超级玛利是我的最爱,你还记得那个大火龙吗?
经典的马里奥!!
不应算是RPG吧。

呵呵找到事做了没事用DELPHI实现一下
没事用DELPHI实现一下。
在www.cpascal.com里面有pascal的例子
真的有吗?我也在关注中,期待ing
在移动的过程中,背景图片不停的向后移,有点难,是不是要比窗口更大的背景缓冲区啊
用DirectX来开发就很简单了.

背景和动画精灵都有相关的类来处理.


各位马力奥这个游戏是FC上通用的也是16位以下的游戏机通用的方法,就是使用了二维卷轴.

这个卷轴是通过汇编点阵来输出到屏幕上的,他有一个结构体,是大概16X16的一个一个图组成的,只要在卷轴上定点的坐标上输入(就是绘制)一个图的数据位置就能画出一个二维卷轴,其实,马力奥是只能向后移动的,但还卷轴是不能向后移动的(不知是否说清楚了),所以当马力奥向后走是,走到屏幕的左方就不能在走了,当马力奥走到屏幕右方(当然不能到最右方,这个坐标是程序控制的),在往前走时,卷轴就跟着动了.

大致的原理就是这样的.
neo 说的有道理!
如果用Delphi+DirectX,有何好的见解???
MARIO那个70K的代码本身就是用PASCAL做的
有沒有3d的馬利歐啊?可以用openGL編寫支持的。最近在學OpenGL,有地址或相關資料的告訴我,最好是基於Delphi,C++ builder也行
最新的马力奥是在任天堂的新机种(也不算新了,哈哈)GAME CLUB上的《阳光马力奥》(是3D版),其他的都是GBA上的超级马力奥进化版,GBA上的游戏都是用C开发的,可GAME CLUB的我就不知道了。
还有没有什么好的见意
各位没事去开发一下GBA的游戏好了,有非常帮的调试工具(模拟器)^^

函数库和编译器也是中国人做的(虽然这个游戏机是小日本做的,但我们破解的技术还是很高名的说) ^^
up
靠有人叫 纳兰容若 的。
I服了U。

你们说的那种移动叫双轴滚动。在内存里开两个 Bitmap 就可以实现了。不是很难
用不着 DirectX 。
有时间我也想写一个。
玛莉有C版本的,程序员大本营光盘上有过
其实2D卷轴并不是什么很难的技术,3D旋转的RPG地图才值得研究呢,像PS里那样的游戏,PS是没有DirectX的吧,具我所知PS里的程序也是用C编的,具体就不知道了,我只是在搞汉化,没研究过编游戏的说,在这里希望各位能贴一点代码  ^^
好简单%……
超级玛利好像不是RPG吧,是ACT(动作)类的吧
现在我正有这样的想法,我的想法是用 Win32 汇编来写一个。
暂时不用 DirectX (DirectX 我还不会用,还有这种基于 COM 的东东在 ASM 下好复杂的。)
我想用 GDI 来实现。但我不知道 GDI 能不能实现这样大的图像传输而不闪烁,
我还是想试一下,( 还有时间可能不太够 )现在正在思考阶段。

推箱子就简单了。我用 Delphi 实现了一次,又用 Win32ASM 实现了一次。
还是 Win32ASM 爽,写出来的程序只有 13.5K。速度快。
(ASM 版的,附加的功能就没有写了。有 100 个关。图像与关是从斗名居的“偷”的)
学习中
up
很多不理解
碰撞检测 没发现有其他的东西
计算机图形学我学的最烂。
在这里要认真学习,学习。
新手学习!
好得来学习学习
认真学习
这个帖子好象还挺热的么,怎么没人贴代码呢?
部分代码...
/*
  file: GAMEDEFS.H

  purpose:
    basic defines and other useful stuff
*/

#ifndef _GAMEDEFS_H_
#define _GAMEDEFS_H_

/* BYTE & WORD already defined in xlib.h */

typedef int             BOOL;
typedef unsigned int    DWORD;

#define FARPTR(x)       (MK_FP(FP_SEG(x),FP_OFF(x)))

#define FALSE           0
#define TRUE            (!FALSE)

#define PIC 0x20
#define NONSPECIFIC_EOI 0x20

#define UP              0
#define RIGHT           1
#define DOWN            2
#define LEFT            3

#define CENTER          4
#define BUTTON_1        5
#define BUTTON_2        6
#define NONE            7
#define QUIT            8

#endif
/*
  file: KEY.C

  purpose:
    new keyboard interrupt handler and various keyboard routines
    based on code from ZKEY.ASM

  date: 11/4/95

  note:
    the key interrupts are not passed down or "chained" to the previous
    interrupt handler.
*/
#include<f:\smb\key.h>
#include<f:\smb\xlib.h>
#include<f:\smb\gamedefs.h>

#define KEYBOARD_PORT     0x60
#define KEYBOARD_XT_CLEAR 0x61

void far interrupt new_int09_handler(void);
void far interrupt (*old_int09_handler)();

BYTER far *keybuf;

static int new_key_handler_installed = FALSE;

void install_new_key_handler(void)
{
  keybuf = farmalloc(KEY_WAS_PRESSED * 2);
  clear_key_buffer();

  old_int09_handler = getvect(9);
  setvect(9, new_int09_handler);
  new_key_handler_installed = TRUE;
}

void far interrupt new_int09_handler(void)
{
  BYTER scan_code;
  BYTER temp;

  /* read scan code */
  scan_code = inportb(KEYBOARD_PORT);

  /* clear keyboard controller on XT machines */
  temp = inportb(KEYBOARD_XT_CLEAR);
  outportb(KEYBOARD_XT_CLEAR, temp | 0x80);
  outportb(KEYBOARD_XT_CLEAR, temp & 0x7F);

  if (scan_code & 0x80) {
    /* key up */
    scan_code &= 0x7F;
    keybuf[scan_code] = 0;
  }
  else {
    /* key down */
    keybuf[scan_code] = 1;
    keybuf[KEY_WAS_PRESSED+scan_code] = 1;
  }

  outportb(PIC, NONSPECIFIC_EOI);
}

void clear_key_buffer(void)
{
  int i;
  for (i = 0; i < KEY_WAS_PRESSED * 2; i++)
    keybuf[i] = 0;
}

void uninstall_new_key_handler(void)
{
  if (new_key_handler_installed) {
    farfree(keybuf);
    setvect(9, old_int09_handler);
  }
}
/*
  file: KEY.H

  purpose:
    header file for keyboard module
*/

#ifndef _KEY_H_
#define _KEY_H_

#define KEY_ESC         0x01
#define KEY_1  0x02
#define KEY_2  0x03
#define KEY_3  0x04
#define KEY_4  0x05
#define KEY_5  0x06
#define KEY_6  0x07
#define KEY_7  0x08
#define KEY_8  0x09
#define KEY_9  0x0A
#define KEY_0  0x0B
#define KEY_DASH 0x0C
#define KEY_EQUAL 0x0D

#define KEY_A 0x1E
#define KEY_B  0x30
#define KEY_C  0x2E
#define KEY_D  0x20
#define KEY_E  0x12
#define KEY_F  0x21
#define KEY_G  0x22
#define KEY_H  0x23
#define KEY_I  0x17
#define KEY_J  0x24
#define KEY_K  0x25
#define KEY_L  0x26
#define KEY_M  0x32
#define KEY_N  0x31
#define KEY_O  0x18
#define KEY_P  0x19
#define KEY_Q  0x10
#define KEY_R  0x13
#define KEY_S  0x1F
#define KEY_T  0x14
#define KEY_U  0x16
#define KEY_V  0x2F
#define KEY_W  0x11
#define KEY_X  0x2D
#define KEY_Y  0x15
#define KEY_Z  0x2C

#define KEY_SPACE  0x39
#define KEY_HOME        0x47
#define KEY_UP          0x48
#define KEY_PGUP        0x49
#define KEY_MINUS       0x4A
#define KEY_LEFT        0x4B
#define KEY_CENTER      0x4C
#define KEY_RIGHT       0x4D
#define KEY_PLUS        0x4E
#define KEY_END         0x4F
#define KEY_DOWN        0x50
#define KEY_PGDOWN      0x51
#define KEY_INS         0x52
#define KEY_DEL         0x53
#define KEY_CTRL 0x1D
#define KEY_ALT 0x38
#define KEY_BACK 0x0E
#define KEY_TAB 0x0F
#define KEY_ENTER 0x1C
#define KEY_LSHIFT 0x2A
#define KEY_RSHIFT 0x38

#define KEY_WAS_PRESSED 128

void install_new_key_handler(void);
void uninstall_new_key_handler(void);
void clear_key_buffer(void);

/* allow outside modules to access the keyboard buffer directly */
//extern BYTER far *keybuf;

#endif
void addscore(int x, int y, char *pscore)
{
  scoretype *temp,*s;
  s=bscore;
  while ((s->next)!=NULL)
    s=s->next;
  temp=(scoretype *)malloc(sizeof(scoretype));
  temp->next=NULL;
  temp->scorex=x;
  temp->scorey=y;
  temp->scoreloop=0;
  strcpy(temp->num,pscore);
  s->next=temp;
}

void removescore()
{
  scoretype *temp;
  scoretype *s=bscore;
  temp=s->next;
  s->next=s->next->next;
  free(temp);
}

void drawscore(int x)
{
  scoretype *s=bscore;
  while ((s->next)!=NULL)
  {
    s=s->next;
    graphstring((s->scorex)*16+32-x,(s->scorey)*16+(s->scoreloop),s->num,TEXTCOLOR,HiddenPageOffs);
    s->scoreloop--;
    if (s->scoreloop<=-20)
       removescore();
  }
}
/****************************************************************************
*Super Mario Bros.     *
*Copyright 1985 Nintendo     *
*Coded by:     *
*  William Merrill Buerger     *
*  Buergerw@warp.msoe.edu     *
*  http://www.msoe.edu/~buergerw     *
*With help from:     *
*  John Ratke -Keyboard Handler     *
*  Themie Gouthas -XLIB graphics stuff     *
****************************************************************************/

#include<f:\smb\smb.h> //Main Header file (f:\smb\ = path of smb.h)//
#include<f:\smb\smbfunc.c> //Function file//

//MAIN///////////////////////////////////////////////////////////////////////
void main()
{
  int move; //DEFINE & INITIALIZE LOCAL VARIABLES//
  int up;
  int down=0;
  int finish=0;
  int jumploop=0;
  int numplayers;
  int palloop;
  colorpal tempc;

  init();
  curplay=0;
  getmario();
  getinputs();
  numplayers=startscreen();
  if (numplayers==1)
    player[1].lives=0;

//MAIN GAME LOOP/////////////////////////////////////////////////////////////
  while(finish!=3)
  {
    setcolors();
    times[0]=201;
    levelscreen();
    marioy=getinputs();
    if (player[curplay].screenx>=data.startpos[0]*16)
      player[curplay].screenx=data.startpos[0]*16;
    else
      player[curplay].screenx=0;
    if (player[curplay].screenx>0)
      marioy=data.startpos[1];
    mariox=40;
    up=0;
    move=0;
    down=0;
    palloop=0;
    tempc=data.palette[21];
    data.sprite=6;
    gettime(&t);
    times[1]=t.ti_sec;
    times[2]=times[1]-1;
    fillscreen(BACKGROUND);
    while(!finish) //CURRENT LEVEL AND PLAYER LOOP//
    {
      x_page_flip(0,0);
      rotatepal(&palloop,&tempc);
      fillscreen(BACKGROUND);
      drawscreen(player[curplay].screenx);
      drawmario(mariox,marioy);
      gettime(&t);
      times[1]=t.ti_sec;
      if (marioy<207)
check_keybuf(&move,&finish,&up,&down,&jumploop);
      animate_mario(move);
      move_mario(&move);
      check_jump(&up,&down,&jumploop);
      check_blocks();
      check_finish(&finish);
    }

//REACT TO END OF CURRENT PLAYER LOOP////////////////////////////////////////
    switch (finish)
    {
      case 1:
player[curplay].lives--;
finish=0;
if (numplayers==2)
{
  if (curplay==0 && player[1].lives!=0)
    curplay=1;
  else
    if (curplay==1 && player[0].lives!=0)
      curplay=0;
}
if (player[0].lives==0 && player[1].lives==0)
  finish=3;
break;
      case 2:
player[curplay].level++;
if (player[curplay].level%5==0)
  player[curplay].level++;
player[curplay].screenx=0;
finish=0;
break;
      case 3:
graphstring(130,100,"Game Over",TEXTCOLOR,VisiblePageOffs);
// while(!keybuf[KEY_ENTER]);
break;
    }
  }

//RETURN SCREEN AND KEYBOARD TO NORMAL///////////////////////////////////////
  exitgame();
}
//END////////////////////////////////////////////////////////////////////////
太长了,不贴了...
用DelphiX精灵类的思想,反正发生碰撞就死
我觉得这一点是和RPG有本质区别的

RPG是先判断碰撞后移动,射击和动作类的通常相反
啊!好麻烦,一个这么大的程序,就放在一个很小的芯片中了!好奇怪!
而且一般还不只放一个程序!
光是背景图片,我想就已经很大了!每一关的背景都不同啊!
随着人物的走动,背景在一点一点的变。
这个好难做到啊!想不通!

如何判断鼠标是否在该控件? 大家推荐一下最近有什么好歌 请问HttpContext有什么用?如何用?有没有例子? 怎么用js调用服务器控件的文本? 时间控件的超简单问题,解决就结贴 在jsp中如何判断下拉列表框是否被选择,我明明选了,还是提示没有选择 请问大家,我的问题在CSDN揭帖后就不显示了,请问在什么地方能找到. 2000不同的关机方式为什么时间区别那么大? 上传文件时,怎么覆盖己有的文件呀!!1很急 大哥们,我是菜鸟!问个问题 链表的问题 各位动网论坛的高手,问一个弱智的问题,怎么把论坛显示的默认模板改为别的设置? 请问几个VB的简单问题! 100分求解一个问题? 如何做类似股票实时系统. 类型转化的问题 动态控件属性赋值 肚皮抽筋!谁遇到过??散分! C#写的类,添加了XML注释(///

myremark /// ) ,为什么编译为dll后,这些函数参数注释却没有显示? NDIS错误 紧急求助:用asp语言能否访问DOMINO数据库? ASP调用oracle存储过程能否返回记录集? 类型转化的问题 ASP调用oracle存储过程能否返回记录集? (娜娜)上海日记--我在越南的经历 当报表连接到数据库访问对象时出现的问题。 与SQL Server连接的问题 Weblogic8.1 连接 SqlServer2000 的问题 请教各位大侠,如何修改系统的时间!!! 多线程问题,高手请进,分数不限,请赐教!!!!!