java可以开发手游开发公司么

您是不是想找:
Copyright &
好例子网(www.haolizi.net).All Rights Reserved备案编号:冀ICP备号 石公备号(10)兄弟正式在51cto安家了~
cping 的BLOG
用户名:cping
文章数:228
评论数:183
访问量:568879
无忧币:18
注册日期:
Java桌面游戏开发
啊啊啊啊!一休大师降临了!我知道..
没有问题。捎带题一下,这个小程序..
感谢您对本文的关注,“等距坐标实..
That’s no problem
这部分我看了,是挺传统的延迟加载..
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。
如果我们将游戏引擎和游戏数据理解为人与积木,那么脚本就是用来搭建积木的图样;如果我们将游戏引擎和游戏数据理解为海洋与大陆,那么脚本就是通行在海洋与大陆间传递资源的货轮。
老实说,延迟下载游戏资源及调用只是一种辅助手段,与游戏开发本身关系并不大,实质也无非只是文件下载及文件读取的混用。但考虑到上周有网友问及此类问题,笔者觉得与其回邮件单独解释,倒不如写篇博文看起来更具体清晰,还能令大家帮助笔者斧正刊误,故成此文,仅供参考。
在笔者的观念中,2.5D严格上说并不能算是一种技术,而只是一种实现方式或者说应用手段。大多数时候,游戏公司之所以会采取2.5D方式开发游戏,常是为解决3D及2D技术混用而采取的一种折中,而并不是说这种手段有多么先进。2.5D游戏的实现方式虽然很多,但主要无非有三类,即:2D角色+3D场景(比如RO1)、3D角色+2D场景(比如生化复刻版)、2D角色+2D场景(比如仙剑),另外有些纯3D游戏出于操作性考虑而固定视角,勉强擦了个2.5D的边,但严格上讲依旧是3D。
众所周知,Java应用的运行速度虽然不慢,却也谈不上快,以最新的JRE1.6表现来说,至多也就是优胜于一些纯粹的解释型语言,距离C/C++等编译型的执行效率还有一定差距。平心而论,如果我们使用Java去制作一些简单的桌面应用,那么目前Java组件的绘图速度勉强还能接受;但如果用Java来进行游戏开发,尤其是制作一些需要高FPS才能满足的动态效果,就必须利用技术手段对其加以优化,解决其绘图效率问题,其它才有的谈。
TLOH(英文名:The Legend of Heroes,中文名:英烈志),是笔者准备根据以前发布的loonframework-game包演示程序而修改制作的类《三国志曹操传》项目,此文为开发预告。
SLG或者说战棋游戏,在大多数英文站点是归类到Simulation Game的(包括模拟城市之类的纯SIM),并没有进行SRPG(Strategies Role Play Games)、RTS(Real-Time Strategy Game)乃至RSLG(Role play Simulation Game)种种的细分。归结原因,想必还是因为近似因素太多,在大多数时候已经难以区分其本来面貌,只能一概而论,所以本文也可以理解为SRPG或 RSLG开发的入门示例。
把最近发的部分示例代码打了压缩包,丢在了新建的code.google上,准备以后loonframework-game写示例程序就拿这些改了,还能对比一下代码优化及效率的提高,也方便各位看客下载。
作为Adventure Game,AVG的图文部分向来便是整个游戏的核心之一,所以本回将以图像绘制为中心讲解AVG的CG生成问题。(CG,即Computer Graphics,直译可称[计算机图形],此处以其为AVG开发中图形部分的代称)。
AVG,即Adventure Game,可以直译为[冒险游戏]。但是通常情况下我们说AVG是指[文字冒险游戏],也有人更直白的解释成自己选择路线和结局的电子小说,与硬砍硬杀的RPG或者揉破键盘的ACT不同,AVG多以解谜或文字游戏等脑力攻关推动剧情发展。
“本鹏”上接前文,继续来进行Java RPG开发讲座,上次我们谈到了JFrame和JPanel合作进行界面开发,这次我们再结合实例继续讲解。
在谈完Java中窗体和面板的使用后,接下来就要..
开场诗:不儒不道又不仙,非神非圣也非贤。轻吐心头寻常语,开辟文武一片天。自表诗:北冥沉渊有鲲鹏,吞噬金乌戮真龙。一日扶摇凌天起,三千世界可横行。
这是一个吃豆游戏的Java实现,具体代码较多请下载文件。下载地址:http://download.csdn.net/source/396925
在现代,摒弃传统的会话方式,很多的图形广告或游戏采用了[逐字打印]的效果来展示文字,当然,这样做的目的无非是为了突出内容或吸引眼球。但是这种实现方式却是值得借鉴的,以下,我给出一个JAVA实现的简单用例..
FPS:即帧 /秒(frames per
second)的缩写,也称为帧速率。是指1秒钟时间里刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。如果具体到手机上就是指每秒钟能够
播放(或者录制)多少格画面..
效果图如下:源码如下:package org./** * &p&Title: LoonFramework&/p& * &p&Description:拼图图像处理[未优化]&/p& * &p&Copyright: Copyright (c) 2007&/p& * &p..
下载地址:[url]http://download.csdn.net/source/586635[/url] 这是一个简单的Java仿雷电游戏(源码见包内),共设置有三关三个小BOSS。采用有GreenJVM发布,因此可以运行在未装载JRE的Windows系统之上。 ..
说到SLG游戏开发,无论其如何运转,里面都离不开各种数据的处理,一般来说,游戏越专业,需要处理的数据量将相对越大,类别也分得越细。
游戏离不开美工,也离不开策划,各项参数的专业划分同样..
什么是SLG呢?也就是Simulation Game的缩写,即模拟策略游戏。
以我这种准骨灰级玩家的视点来看(鄙人88年开始玩FC,时年6岁),早期的SLG游戏,大体只是《三国志》(I由1985年开始发售)这类发布指令扩充
..
源码较长,请自行下载,已打包入jar中。
下载地址:[url]http://download.csdn.net/source/501281[/url]
此示例根据日本Hudson公司推出的炸弹人游戏改编而成,采用Java实现,运行于pc平台下。需要声明一点..下次自动登录
现在的位置:
& 综合 & 正文
如何用java编写小游戏
应一起学习java的众兄弟姐妹们的要求,对塔防游戏小做一个简单的说明,本人学习java两年时间,现在刚刚入职,虽然上班基本不用java swing相关的知识,但由于大学期间运用awt、swing编写小游戏的那种成就感与喜悦使我仍然对编写小游戏有着很强烈的兴趣,编程么,没有什么比编写游戏更吸引人了(I think so),大学期间,当我第一次接触java图形化界面(awt)时,心里很是激动,那是我在校期间头一次感觉到自己写的程序与应用软件有点联系了,因为之前已经写了一年的控制台程序,整天scanf、printf什么的,那时候俄罗斯方块在我心目中一直是个神话,往事不堪回首啊。。。
当然,对于喜欢编游戏的朋友们,我还是推荐从简单到复杂,我是先后编写的贪吃蛇、俄罗斯方块(这两个比较经典了)、扫雷(这个可以编,只要你会一点awt,基本就是按钮+递归)、超级玛丽(背景不会移动)、坦克大战(这个绝对没看马士兵视频)、愤怒的小鸟(障碍物不会动)、塔防那款(这些游戏在我的资源里都有),超级玛丽后是我看过魔乐科技超级玛丽教学后编写完成的,这个视频对我编写贴图游戏有很大的帮助,内面有关于双缓冲图片、图片刷新的讲解,建议大家可以看一下。
接下来简单说一下我编游戏的基本步骤吧,希望对大家有帮助,我编写的基本都是贴图游戏,所谓贴图游戏也就是把图片一张一张画到窗体中(包括背景、敌人、障碍物),我在绘制的时候要用到双缓冲技术,简单说一下我对双缓冲的理解,我是按照视频上学来的方法,首先创建一张缓冲图片,然后将游戏所需要绘制的图片全部画到缓冲图片中,最后将缓冲图片画到窗体,这样做的目的是为了避免图片闪烁,因为这样每次都是将一张完整的图片绘制到窗体,如果不用这张缓冲图片,也就是将背景、敌人、障碍物等元素逐一绘制到窗体的话,由于不同元素绘制不是同时的(有先后顺序),所以会产生图片闪烁的现象,上一段:
import java.awt.C
import java.awt.G
import java.awt.image.BufferedI
import javax.swing.JF
public class BaseFrame extends JFrame {
* 构造函数
public BaseFrame() {
this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
this.setVisible(true); // 设置窗体可见
* 绘制方法
public void paint(Graphics gr) {
BufferedImage image = new BufferedImage(500, 500,
BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
* 这里面就可以画东西了,而且时候到image缓冲图片上,想画什么查阅java API里的Graphics 例如
* g2.drawRect(50, 50, 100, 100);
g2.setColor(Color.WHITE); // 设置画笔颜色
g2.drawRect(50, 50, 100, 100);
g2.fillRect(200, 200, 100, 100);
gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
public static void main(String[] args) {
new BaseFrame();
这个差不多算是我编写游戏的基本架构,创建一个窗体,绘制一张缓冲图片到窗体,而且获取到了缓冲图片的画笔,这样你就可以用画笔画你需要的形状或是图片了。如果想让绘制的东西动起来,可以通过加入线程来实现,改变绘制物体的坐标,最重要一点不要忘记repaint;
import java.awt.C
import java.awt.G
import java.awt.image.BufferedI
import javax.swing.JF
public class BaseFrame extends JFrame implements Runnable {
* 绘制方块x坐标
private int x = 30;
* 绘制方块y坐标
private int y = 30;
* 构造函数
public BaseFrame() {
this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
this.setVisible(true); // 设置窗体可见
Thread thread = new Thread(this); //创建线程
thread.start(); //启动线程
* 绘制方法
public void paint(Graphics gr) {
BufferedImage image = new BufferedImage(500, 500,
BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
* 这里面就可以画东西了,而且时候到image缓冲图片上,想画什么查阅java API里的Graphics 例如
* g2.drawRect(50, 50, 100, 100);
g2.setColor(Color.WHITE); // 设置画笔颜色
g2.fillRect(x, y, 100, 100);
gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
* 线程执行方法
public void run() {
while (true) {
if (x & 400 || y & 400) {
this.repaint();
Thread.sleep(50); //while(true)的循环里一点要记得sleep一会,要不然太可怕了。。。
} catch (InterruptedException e) {
e.printStackTrace();
public static void main(String[] args) {
new BaseFrame();
这个就实现了让图片动起来,但是这顶多算是一个动画,因为没有交互性,游戏是人来玩的嘛,这个可以通过加入事件来完成,下面加入一个键盘事件:
接下来,就是见证奇迹的时刻
import java.awt.C
import java.awt.G
import java.awt.event.KeyE
import java.awt.event.KeyL
import java.awt.image.BufferedI
import javax.swing.JF
public class BaseFrame extends JFrame implements Runnable, KeyListener {
* 绘制方块x坐标
private int x = 200;
* 绘制方块y坐标
private int y = 200;
* 构造函数
public BaseFrame() {
this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
this.setVisible(true); // 设置窗体可见
this.addKeyListener(this); // 添加键盘监听器
Thread thread = new Thread(this); // 创建线程
thread.start(); // 启动线程
* 绘制方法
public void paint(Graphics gr) {
BufferedImage image = new BufferedImage(500, 500,
BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
g2.setColor(Color.WHITE); // 设置画笔颜色
g2.fillRect(x, y, 100, 100);
gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
* 线程执行方法
public void run() {
while (true) {
this.repaint();
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
* 按下时调用
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
// System.out.println(keyCode); // 打印按键的keyCode
if (keyCode == 38) { // 上按键
if (keyCode == 40) { // 下按键
if (keyCode == 37) { // 左按键
if (keyCode == 39) { // 右按键
* 释放按键时调用
public void keyReleased(KeyEvent e) {
public void keyTyped(KeyEvent e) {
public static void main(String[] args) {
new BaseFrame();
这个程序可以用上下左右按键控制方块移动了,运用这些知识基本可以搞定贪吃蛇、俄罗斯方块了,想再来复杂的可以学习一下鼠标监听器,祝你成功。
&&&&推荐文章:
【上篇】【下篇】Java在游戏服务器开发中的应用
发表于 15:55|
作者王广帅
摘要:随着游戏市场的兴起,特别是网页游戏、手机游戏的崛起,对游戏开发技术的需求越来越多。触云游戏公司选择使用Java做服务器开发语言,一起来看下Java在触云游戏服务器开发中的应用。
随着游戏市场的兴起,特别是网页游戏、手机游戏的崛起,对游戏开发技术的需求越来越多。网络游戏开发是一个庞大的体系,总体来说是客户端与服务器端。客户端是玩家接触的游戏图像显示端,服务器是处理游戏运行中的各种数据,由于一台服务器要支持众多玩家的请求,所以服务器的性能高低决定了同一个游戏的用户数量。我们公司选择使用Java做服务器开发语言,主要原因是:1.Java是跨平台的,方便部署;2.Java是安全的高级语言,可以提高开发效率;3.Java是面向对象的,代码可以重用;4.Java的分布式应用。图1 服务器架构图服务器架构Java在我们的服务器开发中的应用。服务器架构如图1所示。服务器架构的几个模块:登录服务器逻辑服务器用户中心服务器充值服务器数据库服务器日志服务器这些模块都是分开的,可以灵活地分布式部署到不同的物理服务器上。只需要修改一些配置文件即可,非常方便。服务器详细功能模块登录服务器负责处理玩家登录的请求。一个登录服务器对应多个游戏逻辑分区。当玩家登录的时候,登录服务器向用户中心服务器发送登录信息。请求对登录信息的验证。通过验证之后,返回分区地址,之后,客户端与登录服务器断开,连接到游戏逻辑服务器。登录服务器是一个单独的Java运行程序,当访问量增加大,可以增加部署到多个物理服务器上面,均衡负载访问压力。它通过使用Java的NIO(非阻塞)方式与客户端进行通信。通过用户中心服务器提供的接口访问用户中心,进行数据处理。逻辑服务器对玩家的操作进行逻辑处理。逻辑服务器是整个游戏的心脏。它的工作效率直接影响玩家在游戏中的体验,所以对它的要求就是速度,快速返回处理结果。为了达到满足要求的速度,逻辑服务器的大部分操作必须在内存中操作,避免I/O操作,I/O操作可以放到另外的线程中进行。说是大部分,是因为玩家在第一次登录的时候可能会从数据库加载所要用到的数据。在图中,大家看到了缓存,缓存的作用就是把数据放在内存中。当玩家退出时,它的数据也会在缓存中保存一段时间,在一定时间内,玩家再次登录,将不会再重新从数据库加载数据。在逻辑服务器中对数据库的操作可以先放入一个Java队列中,再另起一个Java线程负责从这个队列取数据,并发送到数据库服务器,这就是使用Java的阻塞队列,快速实现一个生产者—消费者模式,数据生产与处理相分离,这样既减轻了逻辑服务器的压力,也保证了数据处理的效率。逻辑服务器的日志也不在逻辑服务器入库,同样的发送到日志服务器处理。还有一种方法是以一种特定格式的方式,记录到本地文件中,再启动一个进程,读取这个文件,然后入库。用户中心服务器现在很多游戏都对用户进行了集中管理。这方便了对用户提供更好的服务,比如充值、活动、礼包领取、新游戏导入用户等。有的游戏公司可能会用用户中心的数据发展游戏运营平台。这部分与游戏逻辑服务器分开,也减少了游戏逻辑服务器的压力。用户中心采用JavaWeb开发,它对游戏服务器只提供特定访问的接口,把数据与逻辑分离开来,方便管理,以及分布式部署,增强了架构的灵活性。充值服务器充值是游戏收入的唯一方式,所以这个功能必须流畅,毫无压力。如果由于网络或服务器性能原因,导致玩家充值不了,会直接影响收益的。所以充值服务器最好部署在一台单独的物理机上面,也可以多个分区使用一个充值服务器,这要视游戏人数而定。数据库服务器负责对数据入库及更新的操作。把这部分操作从逻辑服务器分离出来,就是为了减轻逻辑服务器的压力,减少逻辑服务器资源的占用。而且,如果逻辑服务器突然宕机的话,也能尽量保证数据少丢失。为了保证对数据的更新是顺序性的,这里把数据入库的操作使用队列单线程化。逻辑服务器与数据库服务器通过Java的TCP/IPSocket进行长连接,而且为了防止由于意外原因导致连接中断,在逻辑服务器与数据库服务器之间加入了一个心跳连接,这样短暂的中断可以被很快恢复,防止数据的丢失。日志服务器处理玩家日志的入库。日志入库方便游戏运营管理游戏,统计玩家信息。当玩家人数比较多的时候,日志也会占用很多资源。所以把日志从逻辑服务器也分开了,因为日志只是插入操作,所以可以开几个线程进行并发插入到数据库。线程数要根据你数据库的连接池的最大连接数进行设置,要不然会导致连接资源被占完,数据插入不了数据库。注意事项在游戏服务器开发中,有几个需要注意的问题。通信协议开始的时候,我们为了快速开发,采用了JSON的变长协议处理方式,即把要传送的数据编码成json的字符串,再把json字符串转化为字节数据,传输过程中包的总结构为:总包长度(int四个字节)+消息长度(int四个字节)+消息体,即数据长度,n个字节。这样做的好处是可以快速开发,缺点是在传输过程中无效的字节太多。而且这部分完全可以用代码自动完成。后来我们采用Java的反射机制,从定义好的xml描述协议文件中读取传输的内容格式,自动化生成传输的对象,在发送信息时,根据这个对象再把数据转化为二进制的数据流,解析的时候,同样也根据xml的描述文件,按顺序读取数据并转化为对象的JavaBean对象。如果时间充足,在游戏开发前期应该把这个做好。多线程并发游戏服务器是一个多用户的环境,其中多线程是必不可少的,它可以提交程序对CPU的利用率,提高处理性能。但它也有一个致命的缺点,就是在多线程下,数据同步的问题。因为在目前多核CPU下,线程算得上是可以并行执行的了。比如竞技场中的排行榜,每个玩家的名次变化都会对排行榜进行操作。如果不考虑数据同步的话,每个玩家可以随意更新排行榜,那这个排行榜的数据就会非常乱,名次也不正确。这个时间就需要保证在一个玩家更新排行的时候,其他玩家不能更新,只能阻塞等待。一般有两种方法可以解决:1.直接使用锁,当一个玩家更新排行榜时,使用锁锁定排行榜集合,让其他玩家不能再对排行榜操作,Java有自带的两种方式,非常方便,一个是Lock接口,一个是Synchronized;2.使用乐观同步,这种方式需要自己额外实现,之所以说是乐观,是因为它有可能执行失败。原理是当我取数据时,获得一个数据的一个版本号,而当写入数据时,如果版本一致,可写入,如果版本不一致,就需要重新获取数据,执行逻辑,直到版本一致后写入。可以设定重复次数,达到这个次数后,还没有成功就判定失败。根据我们目前的运行环境,我们采用了第一种方式。
均衡负载一台物理服务器的处理能力是有限的,对于可能支持数据众多的游戏服务器来说,分布式部署和动态添加服务器是不可缺少的。在逻辑上,可以把需要集中处理,与逻辑运算关系不大的模块单独部署。比如登录服务器、地图服务器、聊天服务器、数据库服务器等。像我们把登录服务器和数据库服务器分离开就是为了减少逻辑服务器的压力。缓存的设计起初,为了快速敏捷开发,我们采用了一级缓存方式,即图1中的Redis缓存,它是一个分布式的缓存,内部通过Socket连接。在玩家第一次进入游戏的时候会把玩家数据从数据库加载到Redis缓存之中,再取数据只从缓存中取。后来为了更加提高处理速度,增加了二级缓存,即内存缓存,利用Java提供的Map、List等集合保存数据,开发了一个基于内存的缓存构架MemoryCacheTool,对外只提供操作接口。由于是直接从内存中读取或写入数据,其速度相对于Redis提高大约20%左右。总结Java是一门安全、高效、跨平台的语言,它在游戏服务器开发过程中可以提高开发效率,减少异常,增强程序的健壮性。它很容易实现各个功能的衔接,方便后期的维护。
王广帅作者简介:王广帅,网名wgslucky,2011年毕业开始参加工作,一直从事于游戏服务器的开发工作。现任北京触云科技有限公司服务器端技术主程,是一名技术狂,热爱读书,喜欢挑战,热衷与技术同道分享交流游戏开发方面的技术。本文选自程序员电子版2015年5月B刊,该期更多文章请查看。2000年创刊至今所有文章目录请查看。欢迎(含iPad版、Android版、PDF版)。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章

我要回帖

更多关于 java手游服务器开发 的文章

 

随机推荐