2019-03-18 15:00:58 +08:00
|
|
|
|
// Copyright (C) 2019 Nomango
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ϻ<EFBFBD>
|
2019-04-11 14:40:54 +08:00
|
|
|
|
KGE_DECLARE_SMART_PTR(Tiger);
|
2019-03-18 15:00:58 +08:00
|
|
|
|
class Tiger
|
|
|
|
|
|
: public Sprite
|
|
|
|
|
|
{
|
|
|
|
|
|
FramesPtr run_frames; // <20>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>֡
|
|
|
|
|
|
FramesPtr stand_frames; // վ<><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
|
|
|
|
|
|
bool facing_left; // <20>泯<EFBFBD><E6B3AF><EFBFBD><EFBFBD><EFBFBD>泯<EFBFBD><E6B3AF>
|
|
|
|
|
|
bool running; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>
|
|
|
|
|
|
Direction running_direction; // <20>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
Tiger()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡͼƬԭʼ<D4AD><CABC>С
|
|
|
|
|
|
ImagePtr image = new Image(L"res/tiger.png");
|
|
|
|
|
|
Size source_size = image->GetSize();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ÿ֡ͼƬ<CDBC><C6AC>С
|
|
|
|
|
|
Size frame_size = { source_size.x / 5, source_size.y / 3 };
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
run_frames = new Frames;
|
|
|
|
|
|
for (int i = 0; i < 6; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
Point pos = { (i % 5) * frame_size.x, (i / 5) * frame_size.y };
|
|
|
|
|
|
ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size });
|
|
|
|
|
|
run_frames->Add(frame);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
stand_frames = new Frames;
|
|
|
|
|
|
for (int i = 0; i < 6; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
Point pos = { ((i + 1) % 5) * frame_size.x, ((i + 1) / 5 + 1) * frame_size.y };
|
|
|
|
|
|
ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size });
|
|
|
|
|
|
stand_frames->Add(frame);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ִ<>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
AddAction(
|
|
|
|
|
|
Tween::Animation(stand_frames)
|
|
|
|
|
|
.SetDuration(1000)
|
|
|
|
|
|
.SetLoops(-1)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2019-04-08 14:15:27 +08:00
|
|
|
|
AddListener(Event::KeyDown, MakeClosure(this, &Tiger::OnKeyDown));
|
|
|
|
|
|
AddListener(Event::KeyUp, MakeClosure(this, &Tiger::OnKeyUp));
|
2019-03-18 15:00:58 +08:00
|
|
|
|
|
|
|
|
|
|
// Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ϊ Left
|
|
|
|
|
|
facing_left = true;
|
|
|
|
|
|
running = false;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>
|
|
|
|
|
|
SetAnchor(0.5f, 0.5f);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnKeyDown(Event const& e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (e.key.code == KeyCode::Left)
|
|
|
|
|
|
Run(Direction::Left);
|
|
|
|
|
|
else if (e.key.code == KeyCode::Right)
|
|
|
|
|
|
Run(Direction::Right);
|
|
|
|
|
|
else if (e.key.code == KeyCode::Up)
|
|
|
|
|
|
Run(Direction::Up);
|
|
|
|
|
|
else if (e.key.code == KeyCode::Down)
|
|
|
|
|
|
Run(Direction::Down);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnKeyUp(Event const& e)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (e.key.code)
|
|
|
|
|
|
{
|
|
|
|
|
|
case KeyCode::Left:
|
|
|
|
|
|
case KeyCode::Right:
|
|
|
|
|
|
case KeyCode::Up:
|
|
|
|
|
|
case KeyCode::Down:
|
|
|
|
|
|
StopRun();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Run(Direction d)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!running)
|
|
|
|
|
|
{
|
|
|
|
|
|
running = true;
|
|
|
|
|
|
StopAllActions();
|
|
|
|
|
|
|
|
|
|
|
|
// ִ<><D6B4><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
AddAction(
|
|
|
|
|
|
Tween::Animation(run_frames)
|
|
|
|
|
|
.SetDuration(500)
|
|
|
|
|
|
.SetLoops(-1)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
running_direction = d;
|
|
|
|
|
|
if (running_direction == Direction::Left)
|
|
|
|
|
|
{
|
|
|
|
|
|
facing_left = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (running_direction == Direction::Right)
|
|
|
|
|
|
{
|
|
|
|
|
|
facing_left = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ſ<EFBFBD><C5BF>Ե<EFBFBD><D4B5><EFBFBD>ͼƬ<CDBC><C6AC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1 ͼƬ<CDBC>ᷴת
|
|
|
|
|
|
SetScaleX(facing_left ? 1.0f : -1.0f);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void StopRun()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (running)
|
|
|
|
|
|
{
|
|
|
|
|
|
running = false;
|
|
|
|
|
|
StopAllActions();
|
|
|
|
|
|
|
|
|
|
|
|
// ִ<><D6B4>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
AddAction(
|
|
|
|
|
|
Tween::Animation(stand_frames)
|
|
|
|
|
|
.SetDuration(1000)
|
|
|
|
|
|
.SetLoops(-1)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnUpdate(Duration dt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (running)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// OnUpdate <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ȶ<EFBFBD>
|
|
|
|
|
|
// ÿ<><C3BF><EFBFBD>ƶ<EFBFBD> 150 <20><><EFBFBD><EFBFBD>, Ӧ<><D3A6><EFBFBD><EFBFBD> dt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
const float moving_per_sec = 150;
|
|
|
|
|
|
const float distance = moving_per_sec * dt.Seconds();
|
|
|
|
|
|
|
|
|
|
|
|
switch (running_direction)
|
|
|
|
|
|
{
|
|
|
|
|
|
case Direction::Up:
|
|
|
|
|
|
Move(0, -distance);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Direction::Down:
|
|
|
|
|
|
Move(0, distance);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Direction::Left:
|
|
|
|
|
|
Move(-distance, 0);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Direction::Right:
|
|
|
|
|
|
Move(distance, 0);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class Demo4
|
|
|
|
|
|
: public Scene
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
static ScenePtr Create()
|
|
|
|
|
|
{
|
|
|
|
|
|
return new Demo4;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Demo4()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD>
|
|
|
|
|
|
TigerPtr tiger = new Tiger;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>Ͼ<EFBFBD><CFBE><EFBFBD><EFBFBD><EFBFBD>ʾ
|
|
|
|
|
|
tiger->SetAnchor(0.5f, 0.5f);
|
|
|
|
|
|
tiger->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
TextPtr text = new Text(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><EFBFBD>ƶ<EFBFBD>");
|
|
|
|
|
|
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>СΪ<D0A1><CEAA><EFBFBD>ֲ<EFBFBD><D6B2>ִ<EFBFBD>С
|
|
|
|
|
|
text->SetSize(text->GetLayoutSize());
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
text->SetAnchor(0.5f, 0.5f);
|
|
|
|
|
|
text->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 80);
|
|
|
|
|
|
text->SetAlignment(TextAlign::Center);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
this->AddChild(tiger);
|
|
|
|
|
|
this->AddChild(text);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|