VUE 는 Flappy Bird 게임 의 예제 코드 를 실현 합 니 다.
이 게임 을 실현 하려 면 먼저 게임 인터페이스 에서 어떤 물건 이 움 직 여야 하 는 지 분석 해 보 세 요.
1.첫째,당연히 위아래 로 움 직 이 는 새 이다.
2.가로로 이동 하 는 배경 그림 으로 작은 새 가 가로로 비행 하 는 것 처럼 보이 게 한다.
3.화면 오른쪽 끝 에서 들 어 오 는 배관.
이렇게 하면 우 리 는 위의 세 가지 내용 을 규칙 에 따라 운동 하 게 한 다음 에 규칙 경계 판단 과 점 수 를 더 하면 완전한 게임 을 얻 을 수 있다.그 러 니까 같이 해결 해.
먼저 상수 와 변 수 를 정의 합 니 다.
let rafId = null; // requestAnimationFrame ID
let startSpeed = 1;
const SPEED = 0.04; //
const UP = 5.0; //
const UP_SUM = 30; //
const BIRD_WIDTH = 50; // 50px
const PIPE_DISTANCE = 350; //
let id = 0; // id, 0
...
data() {
return {
start: false,
clientWidth: 0,
clientHeight: 0,
spaceHeight: [240, 200, 160], //
pipeArr: [], //
score: 0, //
jumpSum: 0, //
jumpFlag: false, // true- ;false-
dropBirdImg: require("@/assets/img/bird/bird0_0.png"),
flyBirdImg: require("@/assets/img/bird/bird0_2.png"),
gameOver: false, // flag,
};
},
1.위아래 로 움 직 이 는 새작은 새 와 파이프 의 위 치 를 각각 제어 하기 위해 요소 의 포 지 셔 닝 은 모두 position:absolute 를 사용 합 니 다.
작은 새 자체 가 div+배경 그림 이 고 화면 에 있 는 초기 위 치 를 정의 합 니 다.
<div class="bird" id="bird" ref="bird"></div>
#bird {
height: 50px;
width: 50px;
border-radius: 50%;
background: url("~assets/img/bird/bird0_1.png") no-repeat center/contain;
//
position: absolute;
left: 300px;
top: 300px;
}
그리고 아무것도 조작 하지 않 은 상태 에서 작은 새 는 초기 위치 에서'추락'하기 시작 했다.작은 새 의 추락 은 떨 어 질 수록 빠 른 과정 이다.여기 서 나 는 물리 적 중력 가속도 공식 을 사용 하지 않 고 곡선 가속 과정 을 간단하게 모 의 했다.이것 은 지속 적 인 애니메이션 이기 때문에 이 동작 을 애니메이션 프레임 에 넣 습 니 다.즉,requestAnimationFrame 입 니 다.각 프레임 의 함 수 는 loop()으로 정의 합 니 다.그래서 loop 함수 에서 offsetTop 과 부모 요소 의 client Height 에 따라 작은 새 가 화면의 상하 경 계 를 건 드 렸 는 지 여 부 를 판단 하면 게임 이 끝 납 니 다.아 닙 니 다.style.top 을 추가 하여 새 를 떨 어 뜨 립 니 다.
loop() {
let _this = this;
if (_this.jumpFlag) {
//
_this.jump();
}
let top = _this.$refs.bird.offsetTop;
if (top > _this.clientHeight - BIRD_WIDTH || top <= 0) {
// ,
_this.resetGame();
} else if (!_this.jumpFlag) {
_this.$refs.bird.style.background = `url('${_this.dropBirdImg}') no-repeat center/contain`;
_this.$refs.bird.style.top = top + startSpeed * startSpeed + "px"; //
if (startSpeed < UP) {
startSpeed += SPEED;
}
}
_this.pipesMove(); //
}
게임 에서 게이머 들 이 스페이스 바 를 누 르 면 작은 새 는 위로 거 리 를 뛰 어 올 라 this.jumpFlag[true/false]로 이 상 태 를 기록 합 니 다.누 르 면 true 로 설정 하고 loop 함수 에서 작은 새 는 jmp()로 설정 합 니 다.jmp 에서 일정한 거리 가 되면 jmpFlag 은 false 로 설정 하고 작은 새 는 떨 어 지기 시작 합 니 다.그래서 jmp 함 수 는 쉽게 이 루어 집 니 다.
jump() {
let _this = this;
_this.$refs.bird.style.background = `url('${_this.flyBirdImg}') no-repeat center/contain`;
if (_this.jumpSum > UP_SUM) {
//
_this.jumpFlag = false;
_this.jumpSum = 0;
startSpeed = 1;
} else {
_this.$refs.bird.style.top = _this.$refs.bird.offsetTop - 8 + "px";
_this.jumpSum += 8;
}
}
2.가로 이동 배경 그림이것 은 비교적 간단 합 니 다.바로 background-position 이 무한 순환 으로 전환 하면 됩 니 다.위 치 는 자신 이 다운로드 한 배경 그림 소재 의 너비 에 따라 결정 합 니 다.
animation: bgMove 8s linear infinite;
@keyframes bgMove {
0% {
background-position: 805px 0;
}
100% {
background-position: 0 0;
}
}
이 두 단 계 를 통 해 우 리 는 비행 중인 작은 새 를 얻 을 수 있 습 니 다.document.onkeydown 감청 스페이스 바 를 사용 하여 jmpFlag 을 전환 할 수 있 습 니 다.다음 그림:3.오른쪽 에서 왼쪽으로 이동 하여 파이프 에 들어간다.
파 이 프 는 상하 두 개의 div 로 구성 되 어 있 으 며,각 div 는 서로 다른 top:xx 와 bottom:-yy 를 통 해 중간 에 간격 이 있 습 니 다.
먼저 무 작위 간극 파 이 프 를 만 드 는 함 수 를 실현 합 니 다.파 이 프 는 pipeArr 대상 배열 에 저 장 됩 니 다.
addPipe(id) {
let obj = {};
let top_num = this.sum(10, 170);
let height = this.spaceHeight[
Math.floor(Math.random() * this.spaceHeight.length)
]; //
let bottom_num = height - top_num;
obj.top = top_num;
obj.id = id;
obj.right = -(PIPE_DISTANCE / 2);
obj.bottom = bottom_num;
this.pipeArr.push(obj);
},
sum(m, n) {
// n-m
return Math.floor(Math.random() * (m - n) + n);
}
그 다음 에 파 이 프 를 이동 시 켜 야 합 니 다.즉,loop()에서 파이프 이동 함수 pipes Move()입 니 다.전체 함 수 는 다음 과 같 습 니 다.
pipesMove() {
let _this = this;
if (_this.pipeArr.length === 0) {
return;
}
let right0 = _this.pipeArr[0].right;
if (right0 > this.clientWidth + 300) {
this.pipeArr.shift();
}
let right_last = _this.pipeArr[_this.pipeArr.length - 1].right;
if (right_last >= PIPE_DISTANCE / 2) {
id++;
this.addPipe(id);
}
for (let i = 0; i < _this.pipeArr.length; i++) {
// , 50*50,left:300px; 100px; right width-450 width-300
if (
_this.pipeArr[i].right >= _this.clientWidth - 450 &&
_this.pipeArr[i].right <= _this.clientWidth - 300
) {
//
let bird_top = _this.$refs.bird.offsetTop;
// 12
if (
bird_top <= _this.clientHeight / 2 - _this.pipeArr[i].top - 12 ||
bird_top >=
_this.clientHeight / 2 + _this.pipeArr[i].bottom - BIRD_WIDTH + 12
) {
//
_this.resetGame();
return;
}
}
if (_this.pipeArr[i].right === _this.clientWidth - 300 && _this.pipeArr[i].right === _this.clientWidth - 301) { // , , id
_this.score = _this.pipeArr[i].id + 1;
}
_this.pipeArr[i].right = _this.pipeArr[i].right + 2; // 2px
}
}
여기 서 다섯 가지 일 을 했다.(1)파이프 가 왼쪽 화면 에서 나 온 후 shift()의 가장 왼쪽 파이프;
(2)가장 오른쪽 파 이 프 는 화면 오른쪽 에서 일정한 거 리 를 두 고 새로운 파 이 프 를 넣는다.
(3)순환 과정 에서 작은 새 가 특정한 파이프 의 범위 에 들 어 갔 는 지 판단 하고 작은 새 top 이 상하 관 로 를 건 드 렸 는 지 판단 하 며 건 드 리 면 진다.
(4)어떤 파이프 가 작은 새 의 왼쪽 에 있 을 때 작은 새 가 성공 적 으로 통과 했다 는 것 을 증명 한다.점수+1;
(5)파이프 마다 2px 픽 셀 을 이동 하고 수 치 는 right 속성 에 기 록 됩 니 다.
DOM 리:style 을 통 해 right 를 설정 하면 파 이 프 를 가로로 이동 시 킬 수 있 습 니 다.
<section class="pipes-wrap" ref="pipes">
<div
class="pipe-item"
v-for="(item, index) in pipeArr"
:key="item.id"
:id="'pipe' + index"
:style="'right:' + item.right + 'px;'"
>
<div
class="pipe pipe-top"
:style="'top:-' + item.top + 'px;'"
></div>
<div
class="pipe pipe-bottom"
:style="'bottom:-' + item.bottom + 'px;'"
></div>
</div>
</section>
.pipes-wrap {
position: relative;
height: 100%;
overflow: hidden;
.pipe-item {
position: absolute;
height: 100%;
width: 100px;
.pipe {
width: 100%;
height: 50%;
position: relative;
}
.pipe-top {
background: url('"~assets/img/bird/pipe_down.png') no-repeat;
background-size: 100px;
background-position: bottom;
}
.pipe-bottom {
background: url('"~assets/img/bird/pipe_up.png') no-repeat;
background-size: 100px;
background-position: top;
}
}
}
이상 은 vue 가 flappy bird 를 실현 하 는 사고방식 과 핵심 코드 입 니 다.모두 200 여 줄 의 코드 입 니 다.내 가 보기에 난점 은 주로 파이프 의 이동,터치 판정 과 점수 계산 에 집중 되 어 있다.물론 코드 에 최적화 할 수 있 는 부족 한 점 이 많 습 니 다.함께 노력 하 세 요~~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
VUE 기반 장치가 PC인지 모바일 포트인지 판단실제 개발 과정에서 자주 발생하는 수요는 현재 웹 페이지에 로그인한 장치가 PC인지 이동인지를 판단하고 PC 측과 모바일 측이 서로 다른 웹 내용을 표시하도록 요구하는 것이다. 그러면 현재 로그인 장치에 대한 판단이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.