浅谈STG游戏的开发(4月8日更新,已补全内容)

本文探讨STG游戏的开发,包括弹幕游戏的起源、特点和开发要点。通过LGame的STG扩展包,讲解如何实现弹幕射击与闪避的交互,强调游戏难度与玩家体验的平衡。示例源码采用STGScreen和STGObject类,以及9种弹幕对象属性进行游戏设计。同时,提及STG包在图像资源处理上的优化,以确保弹幕速度。
摘要由CSDN通过智能技术生成
               

PS:从根本上讲,弹幕游戏本就归属于STG,或者说也仅仅是种STG罢了。因此,本文也可以视作在介绍LGame中任意STG类游戏的基本开发。

通常我们所谓的弹幕,词源来自英文的【barrage】,本来是指英国陆军在1915年一战期间,采取的特种战术名称。该战术宗旨为,无差别的不间断发射弹药,组成上天下地的半圆形交织火力网,消灭攻击范围内可能存在的一切敌人。(不过因为弹药消耗过巨,兼之敌我不分,此战术在一战后就不再使用。小弟额外一提,目前各国研发的【金属风暴】系统其实都和它有异曲同工之妙,不过定点性更强了,因此也有人管该系统叫【弹幕墙】)


但具体到中文的【弹幕】二字,则和【达人】【素颜】之类一样,都源于东瀛日本的平假名名词(当然,因为日本文化源自汉唐,所以也可以视为汉文化的回流~)。因此,目前市面上比较流行的具体弹幕类游戏,如东方系列,如虫姬系列,如式神之城系列,又如三国战记系列,都是日式弹幕游戏,他们大多都具有一定程度上的AVG式剧情交互,并且单纯的射击而已。

而一般来说,我们开发游戏的最终目地,是让游戏者玩的开心高兴,并非打击他们的游戏乐趣,更不是想要彻底杀死他们(^^)。

所以在开发弹幕类游戏时,我们就不能,也不可能像军用的【barrage】系统一样真不给人半点生机;相反的,我们还要让玩家【有机可乘】,能够不被那么轻易的消灭掉才行。故而绝大多数的弹幕类游戏,都结合有“射击”与“闪避”两大游戏要素。即要让玩家“在敌人放出的大量子弹(弹幕)的细小空隙间闪避”,“并且能够予以敌人猛烈的还击”,这样才能给以玩家弹幕时的独特快感。

因此,对绝大多数的弹幕游戏而言,通常会有以下共性存在:


1、敌人的子弹速度比普通的射击游戏的慢很多。

2、大量的敌弹会以一定的算法有规则地射出,往往在画面上排出几何形状,必定有空隙存在。

3、敌弹的攻击判定和自机的被击中判定比眼见的小很多,不那么容易射中我方目标。

4、有可能突然减慢,或突然增加自机速度,使精密的避弹更容易操作。

当然,弹幕类游戏中敌方的子弹,毕竟会比普通的射击游戏密集许多,所以不论敌弹判定还是自机被击中判定时有多“放水”,弹幕游戏的难度,也大多会比一般的射击类游戏更高些。

至于小弟下面例举的具体弹幕示例源码,则直接采用LGame自带的STG扩展包开发,所以在默认状态下已经支持了触屏与键盘操作(只要继承了STGHero类,我们的主角机就能够完成相关操作),以及基本的角色碰撞检查。所以,大家并不需要再关注什么额外的代码设定,仅仅理解下所谓弹幕,也不过是一堆形状在屏幕上做自定义碰撞,就足够了。


在STG扩展包中,继承了Screen类的STGScreen,用以显示游戏画面。而STGObject这个对象,则代表了全部的屏幕中机体(包括子弹,敌人,我方,物品等),至于区别它们关系的,则是预先定义好的,位于STGScreen类中的9种弹幕对象属性,即:

//主角public static final int HERO = 0;//主角子弹public static final int HERO_SHOT = 1;//敌人public static final int ENEMY = 2;//敌人子弹public static final int ENEMY_SHOT = 3;//该物体无法命中目标(纯漂过,不和任何对象发生作用)public static final int NO_HIT = 4;//物品public static final int ITEM = 5;//必须取得的物品(也就是任务物品,预留区域)public static final int GET_ITEM = 6;//自杀(与此物体碰撞即宣布游戏失败,预留区域)public static final int SUICIDE = 7;//全部命中,不分敌我public static final int ALL_HIT = 8;


我们可以通过变更STGObject类的attribute参数,修正当前角色的作用。而STGScreen对象,则可以在所有的STGObject对象中调取stg变量获得,该对象对应着作为主窗体的STGScreen,我们可以通过该对象为中介,获得多个子类间的相互合作与调配。

下面小弟将例举一些实际的代码例子。

请注意,所有的角色类都是STGObject对象的衍生。所谓敌机,我方机体,或者弹药等等,不过是继承了STGObject类的对象,设定了不同的attribute参数而已。所以从本质上看,他们都是一种东西。

设定一个主角类:
package org.loon.framework.javase.game.stg.test;import org.loon.framework.javase.game.action.map.Config;import org.loon.framework.javase.game.core.graphics.LColor;import org.loon.framework.javase.game.stg.STGHero;import org.loon.framework.javase.game.stg.STGScreen;public class Hero1 extends STGHero {    public Hero1(STGScreen stg, int no, float x, float y, int tpno) {        super(stg, no, x, y, tpno);        // 设定主角生命值(被击中60次后死亡)        this.setHP(60);        // 设定主角魔法值        this.setMP(60);        // 设定自身动画(第一项参数为动画顺序,第二项参数为对应的图像索引)        this.setPlaneBitmap(0, 0);        // 如果设定有多个setPlaneBitmap,可开启此函数,以完成动画播放        // setPlaneAnime(true);        // 设定动画延迟        // setPlaneAnimeDelay(delay);        // 设定自身位置        this.setLocation(x, y);        // 旋转图像为指定角度        // setPlaneAngle(90);        // 变更图像为指定色彩        // setPlaneBitmapColor(LColor.red);        // 变更图像大小        // setPlaneSize(w, h);        // 显示图像        
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值