Unity3D写雷电游戏(五)

己方的飞机控制已经初步完成了,现在要加入敌机了。

理论上应该有两种方式:

1.预先设定,就是在编辑器里在你想要的位置上加上敌方的攻击单位

2.动态生成,根据游戏进行的时间来控制敌方攻击单位的产生。

 

这边采用第2个方式来产生,有一些地面单位倒是可以用第一种方式来产生。

 

我们首先要设置一个敌机的产生位置,用空的object可以随意的定一个坐标。

using UnityEngine;
using System.Collections;

public class EnemyManager : MonoBehaviour {

public GameObject m_EnemyPre;
public Transform m_CreatePoint;

//一波飞机的数量
public const int MAX_GROUP_ENEMYS = 4;
//两波飞机之间的时间间隔
public float GROUP_INTERVAL = 2.0f;
//同一波中两架飞机之间产生的间隔
public float CREATE_INTERVAL = 0.25f;

private float m_fTimeAfterOneGroup = 0.0f;
private float m_fTimeAfterCreate = 0.0f;
private int m_nEnemyNum = 0;


// Use this for initialization
void Start ()
{

}

// Update is called once per frame
void Update ()
{
m_fTimeAfterOneGroup +=Time.deltaTime;
m_fTimeAfterCreate += Time.deltaTime;

if (m_fTimeAfterOneGroup > 2.0f)
{
if (m_fTimeAfterCreate > 0.25f)
{
GameObject clone = (GameObject)Instantiate(m_EnemyPre,
m_CreatePoint.position, m_CreatePoint.rotation);

clone.AddComponent("MoveScript_Shake");
m_nEnemyNum +=1;
m_fTimeAfterCreate = 0;
}

if (m_nEnemyNum == MAX_GROUP_ENEMYS)
{
m_fTimeAfterOneGroup = 0.0f;
m_nEnemyNum = 0;
}
}
}
}

 

敌机的移动脚本,可自己再定义新的移动脚本,在创建新敌机时挂上去就好:

using UnityEngine;
using System.Collections;

public class MoveScript_Shake : MonoBehaviour {

//标志左右移动方向
private int m_nDir = 1;
//原始位置
private Vector3 m_OriginalPos;
//水平移动速度
public float m_HoriSpeed = 0.1f;
//翻转速度
public float m_RotSpeed = 1.0f;
//向前移动速度
public float m_MoveSpeed = 0.0005f;

public Vector3 curScreenPos;

public Vector3 LDPoint;

// Use this for initialization
void Start ()
{
m_OriginalPos = transform.position;
LDPoint = GameObject.Find("LDPoint").transform.position;
print (LDPoint);
}

// Update is called once per frame
void Update ()
{
float relativeOffset = transform.position.x - m_OriginalPos.x;

if (Mathf.Abs(relativeOffset) > 5)
{
m_nDir = -m_nDir;
}

transform.Translate(new Vector3(m_nDir * m_HoriSpeed, 0, m_MoveSpeed));

Transform planeTrans = transform.GetChild(0).transform;
planeTrans.Rotate(0.0f, 0.0f, -m_nDir * m_RotSpeed);


//出屏则消除
// curScreenPos = Camera.mainCamera.WorldToScreenPoint(transform.position);
//print("Cur:"+curScreenPos);
if (transform.position.z < Camera.mainCamera.transform.position.z - 10)
{
Destroy(this.gameObject);
}
// print("Cur:"+transform.position);
// if (transform.position.z < LDPoint.z)
// {
// Destroy(this.gameObject);
// }
}
}


实现效果:



转载于:https://www.cnblogs.com/gameprogram/archive/2011/12/16/2290734.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Python 雷电游戏代码,希望能帮到你: ```python import pygame import random # 定义常量 SCREEN_WIDTH = 480 SCREEN_HEIGHT = 800 BULLET_WIDTH = 8 BULLET_HEIGHT = 20 ENEMY_WIDTH = 50 ENEMY_HEIGHT = 50 # 初始化 Pygame pygame.init() # 创建游戏窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("雷电游戏") # 加载背景图片 bg_img = pygame.image.load("bg.jpg").convert_alpha() # 加载玩家飞机图片 player_img = pygame.image.load("player.png").convert_alpha() player_rect = player_img.get_rect() player_rect.centerx = SCREEN_WIDTH // 2 player_rect.bottom = SCREEN_HEIGHT - 20 # 加载子弹图片 bullet_img = pygame.image.load("bullet.png").convert_alpha() # 加载敌机图片 enemy_img = pygame.image.load("enemy.png").convert_alpha() # 加载游戏音效 bullet_sound = pygame.mixer.Sound("bullet.wav") enemy_down_sound = pygame.mixer.Sound("enemy_down.wav") # 定义子弹类 class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = bullet_img self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -10 def update(self): self.rect.top += self.speed if self.rect.bottom < 0: self.kill() # 定义敌机类 class Enemy(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = enemy_img self.rect = self.image.get_rect() self.rect.centerx = random.randint(ENEMY_WIDTH // 2, SCREEN_WIDTH - ENEMY_WIDTH // 2) self.rect.bottom = 0 self.speed = random.randint(3, 5) def update(self): self.rect.top += self.speed if self.rect.top > SCREEN_HEIGHT: self.kill() # 创建玩家飞机精灵组 player_group = pygame.sprite.Group() player_group.add(pygame.sprite.Sprite()) # 创建子弹精灵组 bullet_group = pygame.sprite.Group() # 创建敌机精灵组 enemy_group = pygame.sprite.Group() # 设置游戏时钟 clock = pygame.time.Clock() # 定义游戏结束函数 def game_over(): font = pygame.font.SysFont(None, 48) text = font.render("Game Over", True, (255, 0, 0)) text_rect = text.get_rect() text_rect.centerx = SCREEN_WIDTH // 2 text_rect.centery = SCREEN_HEIGHT // 2 screen.blit(text, text_rect) pygame.display.update() pygame.time.wait(2000) pygame.quit() exit() # 游戏循环 while True: # 处理游戏事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() exit() elif event.key == pygame.K_SPACE: bullet_sound.play() bullet = Bullet(player_rect.centerx, player_rect.top) bullet_group.add(bullet) # 处理键盘输入 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: player_rect.left -= 5 if player_rect.left < 0: player_rect.left = 0 elif keys[pygame.K_RIGHT]: player_rect.right += 5 if player_rect.right > SCREEN_WIDTH: player_rect.right = SCREEN_WIDTH elif keys[pygame.K_UP]: player_rect.top -= 5 if player_rect.top < 0: player_rect.top = 0 elif keys[pygame.K_DOWN]: player_rect.bottom += 5 if player_rect.bottom > SCREEN_HEIGHT: player_rect.bottom = SCREEN_HEIGHT # 更新玩家飞机位置 player_group.sprites()[0].rect = player_rect # 更新子弹位置 bullet_group.update() # 更新敌机位置 enemy_group.update() # 检测子弹是否击中敌机 hits = pygame.sprite.groupcollide(bullet_group, enemy_group, True, True) for hit in hits: enemy_down_sound.play() enemy = Enemy() enemy_group.add(enemy) # 检测敌机是否撞到玩家飞机 hits = pygame.sprite.spritecollide(player_group.sprites()[0], enemy_group, True) if hits: game_over() # 绘制游戏元素 screen.blit(bg_img, (0, 0)) player_group.draw(screen) bullet_group.draw(screen) enemy_group.draw(screen) pygame.display.update() # 控制游戏帧率 clock.tick(60) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值