⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameworld.java

📁 实现了 移动 碰撞检测
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                player.move(0, -6);
            }
            return;
        }
        if (downPress || inertia > 0 && way == 8)
        {
            if (!downPress)
            {
                player.move(0, 1);
            } else
            {
                player.move(0, 6);
            }
            return;
        }
        if (leftPress || inertia > 0 && way == 4)
        {
            if (!leftPress)
            {
                player.move(-1, 0);
            } else
            {
                player.move(-6, 0);
            }
            return;
        }
        if (rightPress || inertia > 0 && way == 6)
        {
            if (!rightPress)
            {
                player.move(1, 0);
            } else
            {
                player.move(6, 0);
            }
            return;
        }    
	}

    // 游戏逻辑
    public void logic()
    {
        if (logicTime == 0)
        {
            logicTime = System.currentTimeMillis();
        }
        keyProcess(); // 处理连续按键
        changeOffsetTime += System.currentTimeMillis() - logicTime;
        if (changeOffsetTime >= 50 && !isTop)
        {// 是否移动视口
            start -= 1;
            if (Math.abs(start) == bgWidth)
            {
                start = bgWidth;
            }
            end -= 1;
            if (Math.abs(end) == bgWidth)
            {
                end = bgWidth;
            }
            offsetX--; // 屏幕的偏移
            // 计算需要绘制的地图起始位置和结束位置
            column = -offsetX / 16;
            if (column == 100)
            {
                isTop = true;// 到达关底
            }
            if (column < 0)
            {
                column = 0;
            }
            endColumn = column + screenWidth / 16 + 1;
            // 防止超出地图数组的最大上限
            if (endColumn >= horntest_map[0].length)
            {
                endColumn = 33;
            }
            changeOffsetTime = 0;
        }

        if (!isTop)
        {
            if (endColumn != tempEnd)
            {
                for (int row = 0; row < horntest_map.length; row++)//horntest_map.length 13
                {
                    if (horntest_map[row][tempEnd] != 0)
                    {
                        for (int j = 0; j < allEnemy.length; j++)//20
                        {
                            if (!allEnemy[j].visible)
                            { //空闲对象即不可见的对象
                                //初始化对象为地图数据上类型
                                if (horntest_map[row][tempEnd] == 6)
                                { //运输机将从左边飞入
                                    allEnemy[j].init(-offsetX,
                                            horntest_map[row][tempEnd]);
                                } else
                                { //其它的从右边进入
                                    allEnemy[j].init(tempEnd * 16,
                                            horntest_map[row][tempEnd]);
                                }
                                if (allEnemy[j].spriteType == 1
                                        || allEnemy[j].spriteType == 2
                                        || allEnemy[j].spriteType == 3
                                        || allEnemy[j].spriteType == 4
                                        || allEnemy[j].spriteType == 5
                                        || allEnemy[j].spriteType == 6
                                        || allEnemy[j].spriteType == 13
                                        || allEnemy[j].spriteType == 14
                                        || allEnemy[j].spriteType == 28)
                                {

                                    enemyCount++;
                                }
                                isNewEnemy = true;
                                break;
                            }
                        }
                    }
                }
                tempEnd = endColumn;
            }
            if (enemyCount < 10)
            { //如果画面上的敌人总数少于6人,增加随机出现的敌人
                randomEnmeyTime += System.currentTimeMillis() - logicTime;
                if (randomEnmeyTime > 1648)
                { //对随机出现的敌人进行控制
                    enemyCount++; //出现敌人的数量加1
                    isNewEnemy = true;
                    randomEnmeyTime = 0;
                    for (int j = 0; j < allEnemy.length; j++)
                    {
                        if (!allEnemy[j].visible)
                        {
                            if (randomNum(2) == 0)
                            {
                                randomEnemyType = 5; //手雷兵
                            } else
                            {
                                randomEnemyType = 4; //步兵
                            }

                            if (randomNum(2) == 0)
                            {//设置敌人行走方向
                                allEnemy[j].init(screenWidth - offsetX,
                                        randomEnemyType); //设置敌人类型
                                allEnemy[j].changeState(Enemy.STA_GO_LEFT);
                            } else
                            {
                                allEnemy[j].init(-offsetX, randomEnemyType); //设置敌人类型
                            }
                            break;
                        }
                    }
                }
            }

            if (isNewEnemy)
            {
                //用冒泡法来根据对象的Y坐标排序
                for (int i = 0; i < allEnemy.length; i++)
                {
                    for (int k = i + 1; k < allEnemy.length; k++)
                    {
                        if (allEnemy[k].visible
                                && allEnemy[k].spriteY + allEnemy[k].height < allEnemy[i].spriteY
                                        + allEnemy[i].height)
                        {
                            Enemy tempE = allEnemy[i];
                            allEnemy[i] = allEnemy[k];
                            allEnemy[k] = tempE;
                            isNewEnemy = false;
                        }
                    }
                }
            }
        }

        //调用所有敌人的logic()
        if (player.playerState != Player.DEAD)
        {
            for (int i = 0; i < allEnemy.length; i++)
            {
                if (allEnemy[i].visible)
                {
                    allEnemy[i].logic();
                }
            }
        }

        player.logic(); //调用玩家的游戏逻辑

        if (isTop)
        {
            for (int i = 0; i < allEnemy.length; i++)
            {
                if (allEnemy[i].visible)//检验敌人种类是否带攻击性
                {//不带攻击性的都是辅助性质的
                    if (allEnemy[i].spriteType != 1//士兵
                    		&& allEnemy[i].spriteType != 3
							&& allEnemy[i].spriteType != 8
							&& allEnemy[i].spriteType != 9
							&& allEnemy[i].spriteType != 10
							&& allEnemy[i].spriteType != 11
							&& allEnemy[i].spriteType != 12
							&& allEnemy[i].spriteType != 15
							&& allEnemy[i].spriteType != 16
							&& allEnemy[i].spriteType != 17
							&& allEnemy[i].spriteType != 18
							&& allEnemy[i].spriteType != 19
							&& allEnemy[i].spriteType != 20
							&& allEnemy[i].spriteType != 21
							&& allEnemy[i].spriteType != 22
							&& allEnemy[i].spriteType != 23
							&& allEnemy[i].spriteType != 24
							&& allEnemy[i].spriteType != 25
							&& allEnemy[i].spriteType != 26
							&& allEnemy[i].spriteType != 27
							&& allEnemy[i].spriteType != 29
							&& allEnemy[i].spriteType != 30
							&& allEnemy[i].spriteType != 39)
					{
                        isClean = false;
                        break;
                    }
                }
                isClean = true;
            }
        
        }
        logicTime = System.currentTimeMillis();    
	}

    // 图象绘制
    protected void paint(Graphics g)
    {
		int numW = 5, numH = 8;
		/** **************************开始游戏****************************** */
		if (!isClean && gameStart)
		{
			// 绘制背景
			if (level < 10)
			{
				g.drawImage(backgroundImage, start, -positionY, 20);
				g.drawImage(backgroundImage, end, -positionY, 20);
			} else
			// 生存模式
			{
				g.setColor(0x000000);
				g.fillRect(0, 0, screenWidth, screenHeight);
			}
			// 绘制敌人
			for (int i = 0; i < allEnemy.length; i++)
			{
				allEnemy[i].paint(g);
			}
			// 绘制主角
			player.paint(g);
			// 使用空袭
			if (player.isAirAttack)// 空袭
			{
				addSpeed++;
				if (addSpeed / 2 > 2)
				{
					for (int i = 0; i < allEnemy.length; i++)
					{
						if (allEnemy[i].visible)
						{
							allEnemy[i].changeState(Enemy.STA_DEAD); // 让所有敌人死亡
						}
					}
					player.isAirAttack = false;
					addSpeed = 0;
				} else
				{// 画清屏图片
					drawFrame(bombImage, addSpeed / 2, 100, 50, 63, 64, 0, g);
					drawFrame(bombImage, addSpeed / 2, 100, 150, 63, 64, 0, g);
					drawFrame(bombImage, addSpeed / 2, 0, 50, 63, 64, 0, g);
					drawFrame(bombImage, addSpeed / 2, 0, 150, 63, 64, 0, g);
					drawFrame(bombImage, addSpeed / 2, 50, 100, 63, 64, 0, g);
				}
			}
			// //////////////////UI绘制////////////////////
			g.setColor(0xfdf1c3);
			g.fillRect(74, 178, 103, 5);// 米白色部分
			g.setColor(0xffe400);
			g.fillRect(75, 179, (int) 101, 4);// 淡黄色部分
			g.setColor(0xff0000);
			g.fillRect(75, 179, (int) (player.getHP()), 4);// 红色部分
			g.setColor(0x000000);
			g.fillRect(0, screenHeight - 20, screenWidth, 20);
			//UI 绘制
			drawFrame(uiImage, 0, 0, screenHeight - uiImage.getHeight(), 176,
					44, 0, g);
			//绘制空袭导弹
			for (int i = 0; i < bombVector.size(); i++)
			{
				drawFrame((Image) (bombVector.elementAt(i)), 0, bombImageX[i],
						193, 16, 16, 3, g);
			}
			// 绘制弹壳
			drawFrame(itemImage, 0, screenWidth >> 1, screenHeight - 17, 16,
					16, 4, g);
			//玩家子弹图标绘制
			for (int j = 0; j < bulletVector.size(); j++)
			{
				drawFrame((Image) (bulletVector.elementAt(j)), 0,
						bulletImageX[j], bulletImageY[j], 16, 16, 5, g);
			}
			//绘制子弹数字
			paintNum(g, bulletVector.size(), 94, screenHeight - 13, numW, numH,
					numberImage);
			//绘制生命值数字
			paintNum(g, player.getHP(), 50, screenHeight - 17, numW, numH,
					numberImage);
			if (player.getHP() < 50)//生命警报
			{
				if (lifeAlarm)
				{
					g.setColor(0xffe400);
					lifeAlarm = false;
				} else
				{
					g.setColor(0xff0000);
					lifeAlarm = true;
				}
				g.fillRect(19, 183, 3, 3);
				g.fillRect(24, 183, 3, 3);
				g.fillRect(29, 183, 3, 3);
				g.fillRect(34, 183, 3, 3);
				g.fillRect(39, 183, 3, 3);
			}
			// /////////////////////////////////////////////////////////////////////////
			if (gameMenu)// 游戏中途菜单显示
			{//游戏中的呼出菜单
				if (!keyMenu)
				{
					keyTime += speed;
					if (keyTime >= 500)
					{
						keyMenu = true;
						keyTime = 0;
					}
				}
				drawFrame(menuSelect, 0, (screenWidth - 68) / 2,
						(screenHeight - 58) / 2, 68, 58, 0, g);
				drawFrame(menuSelect, 1, (screenWidth - 68) / 2,
						(screenHeight - 58) / 2, 68, 58, 0, g);
				switch (gameMenuItem)
				{
				case 1:
					drawFrame(menuSelect, 3, (screenWidth - 68) / 2,
							(screenHeight - 58) / 2, 68, 29, 0, g);
					break;
				case 2:
					drawFrame(menuSelect, 3, (screenWidth - 68) / 2,
							29 + (screenHeight - 58) / 2, 68, 29, 1, g);
					break;
				}
//                showMemory(g);
				return;
			}
			//任务失败
			if (player.playerState == Player.DEAD)// 任务失败
			{
				if (usePassTime == 0)
				{
					usePassTime = System.currentTimeMillis();
				}
				useTime += System.currentTimeMillis() - usePassTime;
				if (useTime >= 5000)
				{
					useTime = 0;
					usePassTime = 0;
					reset();//菜单图片加载
					return;
				}
				g.setClip(left, 0, right, screenHeight);
				g.setColor(0x000000);
				g.fillRect(0, 0, screenWidth, screenHeight);
				g.setClip(0, 0, screenWidth, screenHeight);
				if (left <= 0 || right >= screenWidth)
					drawFrame(gameoverImage, 0, (screenWidth - 71) / 2,
							(screenHeight - 18) / 2, 71, 18, 1, g);
				usePassTime = System.currentTimeMillis();
			}
//            showMemory(g);
			return;		
		}
		/* / *************************过关提示********************************* / */
		else if (isClean)
		{
			if (usePassTime == 0)
			{
				usePassTime = System.currentTimeMillis();
			}
			useTime += System.currentTimeMillis() - usePassTime;

			g.setClip(left, 0, right, screenHeight);
			g.setColor(0x000000);
			g.fillRect(0, 0, screenWidth, screenHeight);
			g.setClip(0, 0, screenWidth, screenHeight);
			if (left <= 0 || right >= screenWidth)
			{
				drawFrame(gameoverImage, 0, (screenWidth - 71) / 2,
						(screenHeight - 18) / 2, 71, 18, 0, g);
				g.setColor(0xff0000);
			}
			if (useTime >= 3000)
			{
				useTime = 0;
				level++;
				if (level > 10)
				{
					this.gameStart = false;
					this.isClean = false;
					reset();
					startMenu = true;
					usePassTime = 0;
					return;
				}
				if (level == 10)
				{
					this.autoSave();
					this.gameStart = false;
					this.isClean = false;
					this.reset();// 加载菜单
					startMenu = true;
					//通关;
				} else
				{
					this.autoSave();
					this.initGame(20, level);
				}
				usePassTime = 0;
				return;
			}
			usePassTime = System.currentTimeMillis();
//            showMemory(g);
			return;
		}
		if (isNew)
		{//游戏刚刚开始时仅仅显示LOGO页面
			g.setColor(255, 255, 255);
			g.fillRect(0, 0, screenWidth, screenHeight);
			if (logoImage[logoCount] != null)
				g.drawImage(logoImage[logoCount], screenWidth / 2
						- logoImage[logoCount].getWidth() / 2, screenHeight / 2
						- logoImage[logoCount].getHeight() / 2, 20);
			if (logoCount == 2)
			{
				g.drawImage(nameImage, 30, nameStart, 20);
				if (nameStart <= 120)
					if (showAnyKey < 10)
						g.drawImage(anykeyImage, 40, 160, 20);
			}
//            showMemory(g);
			return;
		}
		/** ******************************开始菜单************************************ */
		if (startMenu)
		{//开始菜单
			if (!keyMenu)
			{
				keyTime += speed;
				if (keyTime >= 500)
				{
					keyMenu = true;
					keyTime = 0;
				}
			}
			g.setColor(0x000000);
			g.fillRect(0, 0, screenWidth, screenHeight);
			if (menuAdd < 88)
			{
				menuAdd += 4;
				return;
			}
			g.drawImage(gameLogoImage, screenWidth / 2
					- gameLogoImage.getWidth() / 2, screenHeight / 2
					- gameLogoImage.getHeight() / 2, 20);
			int x = (screenWidth - 72) / 2;
			switch (menuItem)
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -