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 测试通 ...
随机推荐
- popcount 算法分析
转载: http://blog.csdn.net/gaochao1900/article/details/5646211 http://www.cnblogs.com/Martinium/archiv ...
- [转] VS2015中跑OpenGL红宝书第八版的第一章示例代码,运行
Ori Article Link OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资 ...
- (译)关于使用Eclipse Memory Analyzer的10点小技巧
作者 Rave_Tian 2016.02.01 17:56* 字数 2988 阅读 520评论 0喜欢 0 分析和理解应用的内存使用情况是开发过程中一项不小的挑战.一个微小的逻辑错误可能会导致监听器没 ...
- Android内存泄露调试
Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...
- 【Python】matplotlib绘制折线图
一.绘制简单的折线图 import matplotlib.pyplot as plt squares=[1,4,9,16,25] plt.plot(squares) plt.show() 我们首先导入 ...
- C# DataTable 总结
(1)构造函数 DataTable() 不带参数初始化DataTable 类的新实例. DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例. ...
- 王立平--eclipse中改动android项目的版本
改动版本 1.右键-->properties 2.android.改动须要的版本 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTU ...
- 试验笔记 - 使用7-ZIP压缩来减小APK安装包体积
7-ZIP版本:9.20 x86 And x64 Windows(2010-11-18) 1. 将APK包解压到文件夹2. 全选所有文件,右键“添加到压缩包”3.“压缩格式”必须“zip”4.“压缩等 ...
- php设计模式中的类型安全 指--只接受特定的对象 ---以避免发生错误
在百度百科中---类型安全代码指访问被授权可以访问的内存位置
- grunt前端打包——css篇
[导读] 前端打包的工具有很多,我用的习惯的就是这个grunt,无论是你要在github上做开源,还是让自己的项目变得更易于维护,grunt都是首选. 前端打包的工具有很多,我用的习惯的就是这个gru ...