JAVA 水果机游戏及编码
【转自 http://tech.it168.com/j/2007-11-07/200711070910328_1.shtml】
3. 游戏的开发与编码
* ClientView.java
*
* Created on 2007年10月2日, 下午2:00
* 此类专门负责视图的实现,此类中须定义从模型中
* 取出数据并重绘的方法
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.hadeslee.apple.client;
import com.hadeslee.apple.common.Bet;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import javax.swing.*;
import java.util.Vector;
/**
*
* @author lbf
*/
public class ClientView extends JPanel {
private ClientModel cm; //模型类的一个对象
private volatile boolean isStar;
private Image starA; //表示当前星星的图片
private Image[] star; //星星的数组
private int x1;
private int y1; //星星的座标
private Image bg2; //表示底衬的那层
private Image ratio; //赔率底衬的那层
private int x;
private int length; //表示跑马灯的位置
/** Creates a new instance of ClientView */
public ClientView(ClientModel cm) {
this.cm = cm;
initOther();
x = 646;
new RunStar().start();
new Draw().start();
}
//初始化视图类的一些参数
private void initOther() {
star = new Image[3];
MediaTracker mt = new MediaTracker(this);
for (int i = 0; i < 3; i++) {
star[i] = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/star/" + (i + 1) + ".png"));
mt.addImage(star[i], i);
}
bg2 = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/bg2.png"));
ratio = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/ratio.png"));
mt.addImage(bg2, 4);
mt.addImage(ratio, 5);
try {
mt.waitForAll();
} catch (Exception exe) {
exe.printStackTrace();
}
starA = star[0];
//把默认的鼠标改成我们自定义的鼠标形式,以配合主题
Image icon = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/login/icon.png"));
Cursor cu = Toolkit.getDefaultToolkit().createCustomCursor(icon, new Point(0, 0), "my");
this.setCursor(cu);
}
//覆盖的方法
protected void paintComponent(Graphics g) {
//先调用父类的方法,清除以前画的内容
super.paintComponent(g);
//然后设置一些提示,比如屏幕抗锯齿,以及文字抗锯齿
Graphics2D gd = (Graphics2D) g;
gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gd.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//画背景
g.drawImage(cm.getBg(), 0, 0, this);
g.drawImage(bg2, 0, 0, this); //再画第二个背景
//画赔率的闪动
if (cm.isRunning()) {
drawRatio(g);
}
//再画桌面
drawTable(g);
//如果现在正在跑,那么就调用跑的那个方法
if (cm.isRunning()) {
drawRunning(g);
}
//如果现在正在赌剪刀石头布,那么就调用比倍的方法
if (cm.isBetting()) {
drawBetting(g);
}
//画出永远存在的星星
if (isStar) {
g.drawImage(starA, x1, y1, this);
}
//画出跑马灯,提示文字
drawTip(g);
}
private void drawTip(Graphics g) {
g.setFont(new Font("宋体", Font.PLAIN, 22));
g.setColor(Color.RED);
g.drawString(cm.getInfo().getTip(), x, 25);
FontMetrics fm = g.getFontMetrics();
length = (int) fm.getStringBounds(cm.getInfo().getTip(),g).getWidth();
}
//画出赔率
private void drawRatio(Graphics g) {
RatioA ra = cm.getRa();
RatioB rb = cm.getRb();
if (ra != null) {
g.drawImage(ratio, ra.x, ra.y, this);
}
if (rb != null) {
g.drawImage(ratio, rb.x, rb.y, this);
}
}
//画出正在跑的方法
private void drawRunning(Graphics g) {
Vector<PP> ps = cm.getP();
for (PP p : ps) {
g.drawImage(p.current, p.x, p.y, this);
}
}
//画出跑完的方法
private void drawRunOver(Graphics g) {
Vector<PP> ps = cm.getP();
for (PP p : ps) {
g.drawImage(p.current, p.x, p.y, this);
}
}
//画出正在比倍的方法
private void drawBetting(Graphics g) {
g.drawImage(cm.getPKBG(), 172, 39, this);
g.drawImage(cm.getPkA(), 267, 245, this);
g.drawImage(cm.getPkB(), 386, 247, this);
}
//画桌面以及桌面上的一些信息
private void drawTable(Graphics g) {
g.drawImage(cm.getTable(), 0, 0, this);
drawMoney(g);
drawBet(g);
}
//画下注的那九格下注数字
private void drawBet(Graphics g) {
Bet b = cm.getBet();
drawNumber(80, 570, 12, 19, b.getBet(1), g, b.getWin(1));
drawNumber(183, 570, 12, 19, b.getBet(2), g, b.getWin(2));
drawNumber(252, 570, 12, 19, b.getBet(3), g, b.getWin(3));
drawNumber(318, 570, 12, 19, b.getBet(4), g, b.getWin(4));
drawNumber(424, 570, 12, 19, b.getBet(5), g, b.getWin(5));
drawNumber(527, 570, 12, 19, b.getBet(6), g, b.getWin(6));
drawNumber(597, 570, 12, 19, b.getBet(7), g, b.getWin(7));
drawNumber(664, 570, 12, 19, b.getBet(8), g, b.getWin(8));
drawNumber(767, 570, 12, 19, b.getBet(9), g, b.getWin(9));
}
//画有余额,赢的钱,用户ID,大小彩金等的方法
private void drawMoney(Graphics g) {
//画余额和赢的钱
int allMoney = cm.getAllMoney();
int winMoney = cm.getWinMoney();
if (allMoney < 10000) {
drawNumber(762, 88, 24, 38, allMoney, g);
} else {
drawNumber(762, 94, 18, 28, allMoney, g);
}
if (winMoney < 10000) {
drawNumber(129, 86, 24, 38, winMoney, g);
} else {
drawNumber(129, 90, 18, 28, winMoney, g);
}
drawNumber(740, 208, 12, 19, cm.getId(), g); //画ID号
//画大彩金和小彩金
int smallBonus = cm.getInfo().getSmallBonus();
int bigBonus = cm.getInfo().getBigBonus();
if (smallBonus < 10000) {
drawNumber(760, 390, 24, 38, smallBonus, g);
} else {
drawNumber(760, 396, 18, 28, smallBonus, g);
}
if (bigBonus < 10000) {
drawNumber(128, 390, 24, 38, bigBonus, g);
} else {
drawNumber(128, 396, 18, 28, bigBonus, g);
}
}
//定义两个重载的方法,分别针对于图放大的图片和一般大小的图片
private void drawNumber(int startX, int startY, int num, Graphics g, boolean isWin) {
drawNumber(startX, startY, 24, 38, num, g, isWin);
}
private void drawNumber(int startX, int startY, int width, int height, int num, Graphics g) {
drawNumber(startX, startY, width, height, num, g, false);
}
private void drawNumber(int startX, int startY, int width, int height, int num, Graphics g, boolean isWin) {
String ns = Integer.toString(num);
int i = 0;
for (int start = ns.length() - 1; start >= 0; start--) {
i++;
char c = ns.charAt(start);
int index = c - 48;
if (isWin) {
g.drawImage(cm.getWinNumber(index), startX - (i * width), startY, width, height, this);
} else {
g.drawImage(cm.getNumber(index), startX - (i * width), startY, width, height, this);
}
}
}
//此类专门用于后台调用重绘线程
private class Draw extends Thread {
public void run() {
while (true) {
try {
x -= 5;
if (x + length < 0) {
x = 800;
}
Thread.sleep(200);
repaint(x,0,length+20,30);
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
}
//此类专门用于跑星星的闪动
private class RunStar extends Thread {
private int total;
public RunStar() {
isStar = true;
x1 = 339;
y1 = 106;
}
public void run() {
int index = 0;
while (true) {
try {
Thread.sleep(100);
if (index < star.length - 1) {
starA = star[++index];
} else {
starA = star[0];
index = 0;
total++;
}
if (total > 1) {
isStar = false;
repaint();
total = 0;
x1 = (int) (Math.random()*100-50) + 339;
y1 = (int) (Math.random()*100-50) + 106;
int sleep = (int) (Math.random()*3000) + 1000;
Thread.sleep(sleep);
isStar = true;
}else{
repaint(x1,y1,150,150);
}
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
}
}
abstract Image |
createImage(byte[] imagedata, int imageoffset, int imagelength) 创建一幅图像,该图像对存储在指定字节数组中指定偏移量和长度处的图像进行解码。 |
abstract Image |
|
abstract Image |
|
abstract Image |
mt.waitForAll();
static BufferedImage |
|
static BufferedImage |
read(ImageInputStream stream) 返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 ImageInputStream 的结果。 |
static BufferedImage |
read(InputStream input) 返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 InputStream 的结果。 |
static BufferedImage |
JAVA 水果机游戏及编码的更多相关文章
- 从零开始手把手教你使用原生JS+CSS3实现幸运水果机游戏
项目体验地址 免费视频教程 游戏介绍 幸运水果机是一款街机游戏,游戏界面由24个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...
- 【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结
大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现九宫格水果机抽奖 实现思路: Vue component实现九宫格水果机组件,可以嵌套到任意 ...
- 水果机抽奖(CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 一.前言 在前面给大家分享了大转盘的抽奖方式,这是现在游戏使用较多的一种抽奖方式,今天给大家介绍另一抽奖方式--水果 ...
- 手把手教你用JS/Vue/React实现幸运水果机(80后情怀之作)
项目体验地址 免费视频教程 分别使用原生JS,Vue和React,手把手教你开发一个H5小游戏,快速上手Vue和React框架的使用. 项目截图 在线体验 在线体验 游戏介绍 幸运水果机是一款街机游戏 ...
- 2015-2016-2 《Java程序设计》 游戏化
2015-2016-2 <Java程序设计> 游戏化 实践「<程序设计教学法--以Java程序设计为例>」中的「游戏化(Gamification)理论」,根据 2015-201 ...
- 用html5+js实现掌机游戏赛车demo
最近无聊,用html5+js做了一个以前玩过的掌机赛车游戏,顺便学习一下画布的api以及巩固一下js基础. 游戏界面,没做什么美化. 游戏规则:游戏界面分为三列,黑色方块随机落下,红色方块可以在三列自 ...
- 最牛叉的街机游戏合集 & 模拟器
亲爱的小伙伴们,是否还记得那年我们玩的疯狂的街机游戏吗,街机中心提供400多个街机游戏,让你爽到底. 例如:拳皇96,拳皇97,恐龙新世纪.名将.快打旋风.惩罚者.魂斗罗.超级玛丽.雪山兄弟.忍者神龟 ...
- ios水果风暴游戏源码下载
游戏源码是从那个IOS教程网IOS.662p.com分享给大家的. 这是一款ios水果风暴游戏源码下载,介绍给大家一下,喜欢的朋友可以下载学习一下吧.应用介绍:这是一个以获得高分和挑战更高难度为目的的 ...
- [置顶] ios 水果连连看游戏源码
原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9251917 demo功能:水果连连看游戏源码.iphone6.1 测试通 ...
随机推荐
- Java使用HttpURLConnection调用WebService(原始方法)
说明:使用Java原生的HttpURLConnection调用WebService可以免去引入SOA的框架,比如一些CXF框架等.可以使代码足够精简,比如对于一些只调用一两个接口的,这种方式是最适合的 ...
- Java分布式服务框架Dubbo初探(待实践)
Dubbo是什么? Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ...
- Linux(三) 一些命令
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- ArcObject开发,“异常在 ESRI.ArcGIS.Version.dll”错误
“System.DllNotFoundException”类型的未经处理的异常在 ESRI.ArcGIS.Version.dll 中发生 其他信息: 无法加载 DLL“ArcGISVersion.dl ...
- EasyMvc入门教程-高级控件说明(14)列布局控件
想起刚做网页时候,看着这么大的屏幕,一直在 想该如何布局呢,后来经过Table布局,Div布局,Border布局,列式布局. 目前EasyMvc主要支持12列的列式布局(手机兼容性好).请看下面的例子 ...
- 漫谈程序员系列:3D打印能打印出程序员吗
首先声明,本文是一本正经的胡扯,绝不是随随便便的胡扯,请您不要随便攻击我胡说八道.我要反复星爷在<喜剧之王>里的台词:事实上.我是一本正经的喷子. 3D打印的定义 关于3D打印,以下是来自 ...
- newlisp HTTP Basic Authentication
HTTP Basic Authentication原来很easy,參考文档:http://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E ...
- apache TIME_WAIT解决办法
最近发现apache与负载均衡器的的连接数过多,而且大部分都是TIME_WAIT,调整apache2.conf后也没效果,最后百度到如下解决方案 通过调整内核参数解决 vi /etc/sysctl.c ...
- html中图片上传预览的实现
本地图片预览 第一种方法 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type& ...
- XTUOJ 1176 I Love Military Chess(模拟)
I Love Military Chess Accepted : 45 Submit : 141 Time Limit : 1000 MS Memory Limit : 65536 KB ...