游戏编程入门(1) -- 精灵 ISprite

本文介绍游戏编程中的精灵概念,精灵是构成游戏活动体的基本单元,文章详细解释了ISprite接口及其实现,并演示如何通过简单操作使精灵移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    对于游戏编程而言,我也是个初学者,这个游戏编程入门系列的文章,就当作是我在学习游戏编程的笔记和阶段小结吧。我们先从最简单的“精灵”开始,暂时我们不需要考虑DirectX或是OpenGL,不需要考虑3维等等这些复杂情形,直接使用GDI+绘图功能就可以了。

    精灵,是构成游戏中活动体(比如,飞机、野兽等游戏人物)的最基本单元,任何一个活动体都可以由一个或多个精灵组合而成,每个精灵都是一个对象实例,它能够绘制自己、移动(更复杂的还可以旋转)等等基本动作。
    我让所有的精灵都实现ISprite接口,该接口如下:


    对应的代码如下:
    public interface ISprite
    {
        Graphics Graphics{
set ;} //绘制的设备
        Bitmap   Source{set ;}   //精灵表面位图
        Image    BackgroundImage{set ;} //游戏背景

        Point Location{
get ;}

        
void Erase() ;
        
void Draw() ;

        
void SetDirection(CompassDirections dir) ;
        
void Move() ;
    }

    
public enum CompassDirections 
    {
        NotSet 
= 0 ,
        North 
= 1,
        NorthEast 
= 2,
        East 
= 3,
        SouthEast 
= 4,
        South 
= 5,
        SouthWest 
= 6,
        West 
= 7,
        NorthWest 
= 8
    }

    这个接口也许并不是完整的,随了实际的深入,可能还会有很多的元素添加进来,甚至CompassDirections枚举还可以进一步细分,但是ISprite已经有最基本“精灵”功能了。对于大多数简单的任务,我们已经可以给出ISprite的一个实现:
    public class Sprite :ISprite
    {
        
private CompassDirections direction = CompassDirections.South ;

        
#region ISprite 成员
        
private Graphics graphics = null ;
        
public  Graphics Graphics
        {
            
set
            {
                
this.graphics = value ;
            }
        }

        
private Bitmap source = null ;
        
public  Bitmap Source
        {
            
set
            {
                
this.source = value ;
            }
        }

        
private Point location = new Point(0 ,0) ;
        
public  Point Location
        {
            
get
            {
                
return this.location ;
            }
        }

        
#region BackgroundImage
        
private Image backgroundImage = null ; 
        
public  Image BackgroundImage
        {
            
set
            {
                
this.backgroundImage = value ;
            }
        }
        
#endregion
        
        
public void Erase()
        {
            Rectangle ret 
= new Rectangle(this.location.X  , Location.Y, this.source.Width ,this.source.Height );
            
this.graphics.DrawImage(this.backgroundImage, ret, ret, GraphicsUnit.Pixel);            
        }

        
public void Draw()
        {
            
this.graphics.DrawImage(this.source,this.location.X ,this.location.Y);
        }


        
public void SetDirection(CompassDirections dir)
        {
            
this.direction = dir ;
        }

        
public void Move()
        {
            
int stepSize = 5 ;
            
if(this.direction == CompassDirections.South)
            {
                
this.location.Y += stepSize ;
                
return ;
            }

            
if(this.direction == CompassDirections.East)
            {
                
this.location.X += stepSize ;
                
return ;
            }

            
if(this.direction == CompassDirections.West)
            {
                
this.location.X -= stepSize ;
                
return ;
            }

            
if(this.direction == CompassDirections.North)
            {
                
this.location.Y -= stepSize ;
                
return ;
            }
        }

        
#endregion
    }

    我们要特别注意Erase方法的实现,所谓Erase实际上就是用背景图对应的区域重新绘制精灵所在的区域表面--这种技巧在游戏编程中是最基本的技巧之一。

    当精灵接收到游戏环境的时钟脉冲通知时,最常见的方法调用组合是:
                theSprite.Erase() ;
                theSprite.Move() ;
                theSprite.Draw() ;
    首先,精灵擦除自己,然后依据方向CompassDirections移动自己到新的位置,最后在新的位置绘制自己。
    所以,当时钟脉冲连续不断的到来时,我们就可以看到精灵在移动了,通过我们的游戏操纵杆或键盘我们可以调用目标精灵的SetDirection方法来指定其要移动的方向。

    下篇文章,我们将基于ISprite构建一个最简单的游戏示例,在这个示例中,我们可以通过键盘的方向键来控制游戏中主角的移动。



本书手把手教大家写写游戏,是一本非常不错的游戏入门教材,资源内有教材pdf格式的电子书,还有教材的光盘资料(必不可少),因为只允许上传50M以下的,所以就传了六个文件,这是第 2 部分 目录: 第1部分 入门1章 学习开发游戏的基础知识 第2章 创建游戏引擎 第3章 学习绘制基本图形 第4章 绘制图形图像 第2部分 与游戏玩家交互 第5章 使用键盘和鼠标控制游戏 第6章 示例游戏:Brainiac 第7章 使用游戏杆改进输入 第8章 示例游戏:Light Cycles 第3部分 在游戏中使用了画面 第9章 使用子画面动画移动对象 第10章 管理子画面 第11章 示例游戏:Henway 第4部分 使用声音和音乐 第12章 播放数字声音效果 第13章 播放MIDI音乐 第14章 示例游戏:Battle Office 第5部分 高级动画 第15章 实现了画面外观动画 第16章 创建子画面背景 第17章 示例游戏:Meteor Defense 第6部分 让游戏拥有大脑 第18章 教游戏思考 第19章 示例游戏:Space Out 第7部分 增添游戏的趣味性 第20章 使用闪屏增添游戏的活力 第21章 使用演示模式展示游戏 第22章 记录高分 第8部分 附加练习 第23章 使用滋动背景更改远景 第24章 示例游戏:Stunt Jumper 配套光盘上的附录 附录A 选择游戏开发工具 附录B C++编程入门 附录C Windows游戏编程入门 附录D 创建游戏图形 前言: 像Junkyard Wars和American Chopper这样的电视节目获得了极大的成功,在很大程度上是因为它们揭示了有趣的机器(例如潜水艇、破城槌以及摩托车等)构造背后的创造性过程。自从有了电视以来,教育性的电视节目就一直存在,但是直到最近,教育才进入了正统娱乐的领域。这些节目之所以获得成功,是因为它们展示了在头脑中产生一个想法并将它们转化为现实是多么有趣和具有挑战性。是的,它们是教育性的,但是更重要的是,它们很有趣。本书中有同样有挑战性的乐趣在等待着读者,你将学习如何构建自己的视频游戏。不,你不能轰鸣着引擎骑着自己的游戏在街道上飞速行驶,但是你可以与朋友和家人分享,炫耀自己新获得..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值